Improve handling of date strings and DateTime values in contacts

pull/121/head
Thomas Bruederli 11 years ago
parent 6128ad7e96
commit 52830ea605

@ -563,9 +563,9 @@ abstract class rcube_addressbook
// use only strict comparison (mode = 1)
// @TODO: partial search, e.g. match only day and month
if (in_array($colname, $this->date_cols)) {
return (($value = rcube_utils::strtotime($value))
&& ($search = rcube_utils::strtotime($search))
&& date('Ymd', $value) == date('Ymd', $search));
return (($value = rcube_utils::anytodatetime($value))
&& ($search = rcube_utils::anytodatetime($search))
&& $value->format('Ymd') == $search->format('Ymd'));
}
// composite field, e.g. address

@ -718,6 +718,10 @@ class rcube_contacts extends rcube_addressbook
foreach ($save_data as $key => $values) {
list($field, $section) = explode(':', $key);
$fulltext = in_array($field, $this->fulltext_cols);
// avoid casting DateTime objects to array
if (is_object($values) && is_a($values, 'DateTime')) {
$values = array(0 => $values);
}
foreach ((array)$values as $value) {
if (isset($value))
$vcard->set($field, $value, $section);

@ -787,6 +787,44 @@ class rcube_utils
return (int) $ts;
}
/**
* Date parsing function that turns the given value into a DateTime object
*
* @param string $date Date string
*
* @return object DateTime instance or false on failure
*/
public static function anytodatetime($date)
{
if (is_object($date) && is_a($date, 'DateTime')) {
return $date;
}
$dt = false;
$date = trim($date);
// try to parse string with DateTime first
if (!empty($date)) {
try {
$dt = new DateTime($date);
}
catch (Exception $e) {
// ignore
}
}
// try our advanced strtotime() method
if (!$dt && ($timestamp = self::strtotime($date))) {
try {
$dt = new DateTime("@".$timestamp);
}
catch (Exception $e) {
// ignore
}
}
return $dt;
}
/*
* Idn_to_ascii wrapper.

@ -358,8 +358,8 @@ class rcube_vcard
case 'birthday':
case 'anniversary':
if (($val = rcube_utils::strtotime($value)) && ($fn = self::$fieldmap[$field])) {
$this->raw[$fn][] = array(0 => date('Y-m-d', $val), 'value' => array('date'));
if (($val = rcube_utils::anytodatetime($value)) && ($fn = self::$fieldmap[$field])) {
$this->raw[$fn][] = array(0 => $val->format('Y-m-d'), 'value' => array('date'));
}
break;

@ -77,6 +77,16 @@ foreach ($GLOBALS['CONTACT_COLTYPES'] as $col => $colprop) {
}
else if (isset($_POST[$fname])) {
$a_record[$col] = get_input_value($fname, RCUBE_INPUT_POST, true);
// normalize the submitted date strings
if ($colprop['type'] == 'date') {
if ($timestamp = rcube_utils::strtotime($a_record[$col])) {
$a_record[$col] = date('Y-m-d', $timestamp);
}
else {
unset($a_record[$col]);
}
}
}
}

Loading…
Cancel
Save