? 929494_date_value_callback.2.patch
? 929494_date_value_callback.patch
Index: date_api_elements.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_api_elements.inc,v
retrieving revision 1.71
diff -u -p -r1.71 date_api_elements.inc
--- date_api_elements.inc	14 Aug 2010 11:48:45 -0000	1.71
+++ date_api_elements.inc	6 Oct 2010 19:02:42 -0000
@@ -71,15 +71,18 @@ function _date_api_element_info() {
   $type['date_select'] = array_merge($date_base, array(
     '#process' => array('date_select_element_process'),
     '#theme_wrappers' => array('date_select'),
+    '#value_callback' => 'date_select_element_value_callback',
     ));
   $type['date_text'] = array_merge($date_base, array(
     '#process' => array('date_text_element_process'),
     '#theme_wrappers' => array('date_text'),
+    '#value_callback' => 'date_text_element_value_callback',
     ));
   $type['date_timezone'] = array(
     '#input' => TRUE, '#tree' => TRUE,
     '#process' => array('date_timezone_element_process'),
     '#theme_wrappers' => array('date_text'),
+    '#value_callback' => 'date_timezone_element_value_callback',
     );  
   return $type;
 }
@@ -115,6 +118,15 @@ function date_timezone_element_process($
 }
 
 /**
+ * Element value callback for date_timezone element.
+ */
+function date_timezone_element_value_callback($element, $input = FALSE, &$form_state) {
+  if (!$input) {
+    return array('timezone' => $element['#default_value']);
+  }
+}
+
+/**
  * Text date input form.
  *
  * Display all or part of a date in a single textfield.
@@ -141,8 +153,8 @@ function date_text_element_process($elem
     $datetime = date_convert_from_custom($edit['date'], $element['#date_format']);
     $date = date_make_date($datetime, $element['#date_timezone'], DATE_DATETIME, $granularity);
   }
-  elseif (!empty($element['#value'])) {
-    $date = date_make_date($element['#value'], $element['#date_timezone'], DATE_DATETIME, $granularity);
+  elseif (!empty($element['#value']['date'])) {
+    $date = date_make_date($element['#value']['date'], $element['#date_timezone'], DATE_DATETIME, $granularity);
   }
   
   $element['#tree'] = TRUE;
@@ -173,6 +185,15 @@ function date_text_element_process($elem
 }
 
 /**
+ * Element value callback for date_text element.
+ */
+function date_text_element_value_callback($element, $input = FALSE, &$form_state) {
+  if (!$input) {
+    return array('date' => $element['#default_value']);
+  }
+}
+
+/**
  * Flexible date/time drop-down selector.
  *
  * Splits date into a collection of date and time sub-elements, one
@@ -228,6 +249,43 @@ function date_select_element_process($el
 }
 
 /**
+ * Element value callback for date_select element.
+ */
+function date_select_element_value_callback($element, $input = FALSE, &$form_state) {
+  if (!$input) {
+    $value = array();
+    $granularity = date_format_order($element['#date_format']);
+    $date = date_make_date($element['#default_value'], $element['#date_timezone'], DATE_DATETIME, $granularity);
+    $hours_format  = strpos(strtolower($element['#date_format']), 'a') ? 'g': 'G';
+    $month_function  = strpos($element['#date_format'], 'F') !== FALSE ? 'date_month_names' : 'date_month_names_abbr';
+
+    foreach ($granularity as $field) {
+      switch ($field) {
+        case 'year':
+          $value[$field] = is_object($date) ? date_format($date, 'Y') : '';
+          break;
+        case 'month':
+          $value[$field] = is_object($date) ? date_format($date, 'n') : '';
+          break;
+        case 'day':
+          $value[$field] = is_object($date) ? date_format($date, 'j') : '';
+          break;
+        case 'hour':
+          $value[$field] = is_object($date) ? date_format($date, $hours_format) : '';
+          break;
+        case 'minute':
+          $value[$field] = is_object($date) ? date_format($date, 'i') : '';
+          break;
+        case 'second':
+          $value[$field] = is_object($date) ? date_format($date, 's') : '';
+          break;
+      }
+    }
+    return $value;
+  }
+}
+
+/**
  * Create form elements for one or more date parts.
  *
  * Get the order of date elements from the provided format.
@@ -671,4 +729,4 @@ function date_convert_from_custom($date,
   // Don't test for valid date, we might use this to extract
   // incomplete date part info from user input.
   return date_convert($final_date, DATE_ARRAY, DATE_DATETIME);
-}
\ No newline at end of file
+}
Index: date/date_elements.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date/date_elements.inc,v
retrieving revision 1.81
diff -u -p -r1.81 date_elements.inc
--- date/date_elements.inc	27 Aug 2010 13:16:45 -0000	1.81
+++ date/date_elements.inc	6 Oct 2010 19:02:42 -0000
@@ -77,138 +77,45 @@ function _date_field_widget_form(&$form,
     $date = date_local_date($form, $form_state, $delta, $items[$delta], $timezone, $field, $instance, $processed);
     $items[$delta][$processed] = is_object($date) ? date_format($date, DATE_FORMAT_DATETIME) : '';
   }
-  
-  $element += array(
-    '#type' => 'date_combo',
-    '#theme_wrappers' => array('date_combo'),
-    '#weight' => $delta,
-    '#default_value' => isset($items[$delta]) ? $items[$delta] : '',
-    '#date_timezone' => $timezone,
-    '#element_validate' => array('date_combo_validate', 'date_widget_validate'),
-  );
 
-  if ($field['settings']['tz_handling'] == 'date') {
-    $element['timezone'] = array(
-      '#type' => 'date_timezone',
-      '#delta' => $delta,
-      '#default_value' => $timezone,
-      '#weight' => $instance['widget']['weight'] + .2,
-      );  
-  }
-  
-  // Add a date repeat form element, if needed.
-  if (module_exists('date_repeat') && $field['settings']['repeat'] == 1) {
-    module_load_include('inc', 'date', 'date_repeat');    
-    _date_repeat_widget($element, $field, $instance, $items, $delta);
-    $element['rrule']['#weight'] = $instance['widget']['weight'] + .4;
+  $field_name = $field['field_name'];
+  $bundle = $instance['bundle'];
+  $entity_type = $instance['entity_type'];
+
+  // @TODO: What is this for?
+  /*
+  if (isset($field['columns']['rrule'])) {
+    unset($field['columns']['rrule']);
   }
-  
-  return $element;
-} 
+  */
 
-/**
- * Create local date object.
- *
- * Create a date object set to local time from the field and
- * widget settings and item values, using field settings to
- * determine what to do with empty values.
- */
-function date_local_date($form, $form_state, $delta, $item, $timezone, $field, $instance, $part = 'value') {
-  if (!empty($form['nid']['#value'])) {
-    $default_value = '';
-    $default_value_code = '';
-  }
-  elseif ($part == 'value') {
-    $default_value = $instance['settings']['default_value'];
-    $default_value_code = $instance['settings']['default_value_code'];
-  }
-  else {
-    $default_value = $instance['settings']['default_value2'];
-    $default_value_code = $instance['settings']['default_value_code2'];
-  }
-  if (empty($item) || empty($item[$part])) {
-    if (empty($default_value) || $default_value == 'blank' || $delta > 0) {
-      return NULL;
-    }
-    elseif ($part == 'value2' && $default_value == 'same') {
-      if ($instance['settings']['default_value'] == 'blank' || empty($item['value'])) {
-        return NULL;
-      }
-      else {
-        $date = date_make_date($item['value'], $timezone, DATE_DATETIME, $field['settings']['granularity']);
-      }
-    }
-    // Special case for 'now' when using dates with no timezone,
-    // make sure 'now' isn't adjusted to UTC value of 'now' .
-    elseif ($field['settings']['tz_handling'] == 'none') {
-      $date = date_now();
-    }
-    else {
-      $date = date_now($timezone);
-    }
-  }
-  else {
-    $value = $item[$part];
-     
-    // Special case for ISO dates to create a valid date object for formatting.
-    if ($field['type'] == DATE_ISO) {
-      $value = date_fuzzy_datetime($value);
-    }
-    else {
-      $db_timezone = date_get_timezone_db($field['settings']['tz_handling']);
-      $value = date_convert($value, $field['type'], DATE_DATETIME, $db_timezone);
-    }
-    $date = date_make_date($value, date_get_timezone_db($field['settings']['tz_handling']), DATE_DATETIME, $field['settings']['granularity']);
-    if (empty($date)) {
-      return NULL;
-    }
-    date_timezone_set($date, timezone_open($timezone));
-  }
-  if (is_object($date) && empty($item[$part]) && $default_value == 'strtotime' && !empty($default_value_code)) {
-    date_modify($date, $default_value_code);
-  }
-  return $date;
-}
-
-/**
- * Process an individual date element.
- */
-function date_combo_element_process($element, &$form_state, $form) {
-  if (isset($element['#access']) && empty($element['#access'])) {
-    return;
-  }
-  $field_name = $element['#field_name'];
-  $delta = $element['#delta'];
-  $bundle = $element['#bundle'];
-  $entity_type = $element['#entity_type'];
-  $field = $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
-  $instance = $form_state['field'][$element['#field_name']][$element['#language']]['instance'];
-   
-  $columns = $element['#columns'];
-  if (isset($columns['rrule'])) {
-    unset($columns['rrule']);
-  }
   $from_field = 'value';
   $to_field = 'value2';
   $tz_field = 'timezone';
   $offset_field = 'offset';
   $offset_field2 = 'offset2';
 
-  if ($field['settings']['todate'] != 'required' 
-  && !empty($element['#default_value'][$to_field]) 
-  && $element['#default_value'][$to_field] == $element['#default_value'][$from_field]) {
+  // @TODO
+  /*
+  if (
+    $field['settings']['todate'] != 'required' &&
+    !empty($items[$delta][$to_field]) &&
+    !empty($items[$delta][$from_field]) &&
+    $items[$delta][$from_field] == $items[$delta][$to_field]
+  ) {
     unset($element['#default_value'][$to_field]);
   }
+  */
 
   $element[$from_field] = array(
     '#field'         => $field,
     '#title'         => t($instance['label']),
     '#weight'        => $instance['widget']['weight'],
     '#required'      => ($instance['required'] && $delta == 0) ? 1 : 0,
-    '#default_value' => isset($element['#value'][$from_field]) ? $element['#value'][$from_field] : '',
+    '#default_value' => isset($items[$delta][$from_field]) ? $items[$delta][$from_field] : '',
     '#field'         => $field,
     '#delta'         => $delta,
-    '#date_timezone' => $element['#date_timezone'],
+    '#date_timezone' => $timezone,
     '#date_format'      => date_limit_format(date_input_format($element, $field, $instance), $field['settings']['granularity']),
     '#date_text_parts'  => (array) $instance['widget']['settings']['text_parts'],
     '#date_increment'   => $instance['widget']['settings']['increment'],
@@ -284,9 +191,89 @@ function date_combo_element_process($ele
   // does not get the values in $form.
   $form_state['#field_info'][$field['field_name']] = $field;
   
+  if ($field['settings']['tz_handling'] == 'date') {
+    $element['timezone'] = array(
+      '#type' => 'date_timezone',
+      '#delta' => $delta,
+      '#default_value' => $timezone,
+      '#weight' => $instance['widget']['weight'] + .2,
+      );
+  }
+
+  // Add a date repeat form element, if needed.
+  if (module_exists('date_repeat') && $field['settings']['repeat'] == 1) {
+    module_load_include('inc', 'date', 'date_repeat');
+    _date_repeat_widget($element, $field, $instance, $items, $delta);
+    $element['rrule']['#weight'] = $instance['widget']['weight'] + .4;
+  }
+
   return $element;
 }
 
+/**
+ * Create local date object.
+ *
+ * Create a date object set to local time from the field and
+ * widget settings and item values, using field settings to
+ * determine what to do with empty values.
+ */
+function date_local_date($form, $form_state, $delta, $item, $timezone, $field, $instance, $part = 'value') {
+  if (!empty($form['nid']['#value'])) {
+    $default_value = '';
+    $default_value_code = '';
+  }
+  elseif ($part == 'value') {
+    $default_value = $instance['settings']['default_value'];
+    $default_value_code = $instance['settings']['default_value_code'];
+  }
+  else {
+    $default_value = $instance['settings']['default_value2'];
+    $default_value_code = $instance['settings']['default_value_code2'];
+  }
+  if (empty($item) || empty($item[$part])) {
+    if (empty($default_value) || $default_value == 'blank' || $delta > 0) {
+      return NULL;
+    }
+    elseif ($part == 'value2' && $default_value == 'same') {
+      if ($instance['settings']['default_value'] == 'blank' || empty($item['value'])) {
+        return NULL;
+      }
+      else {
+        $date = date_make_date($item['value'], $timezone, DATE_DATETIME, $field['settings']['granularity']);
+      }
+    }
+    // Special case for 'now' when using dates with no timezone,
+    // make sure 'now' isn't adjusted to UTC value of 'now' .
+    elseif ($field['settings']['tz_handling'] == 'none') {
+      $date = date_now();
+    }
+    else {
+      $date = date_now($timezone);
+    }
+  }
+  else {
+    $value = $item[$part];
+     
+    // Special case for ISO dates to create a valid date object for formatting.
+    if ($field['type'] == DATE_ISO) {
+      $value = date_fuzzy_datetime($value);
+    }
+    else {
+      $db_timezone = date_get_timezone_db($field['settings']['tz_handling']);
+      $value = date_convert($value, $field['type'], DATE_DATETIME, $db_timezone);
+    }
+    $date = date_make_date($value, date_get_timezone_db($field['settings']['tz_handling']), DATE_DATETIME, $field['settings']['granularity']);
+    if (empty($date)) {
+      return NULL;
+    }
+    date_timezone_set($date, timezone_open($timezone));
+  }
+  if (is_object($date) && empty($item[$part]) && $default_value == 'strtotime' && !empty($default_value_code)) {
+    date_modify($date, $default_value_code);
+  }
+  return $date;
+}
+
 function date_element_empty($element, &$form_state) {
   $item = array();
   $item['value'] = NULL;
@@ -488,4 +475,4 @@ function date_input_format($element, $fi
     return $instance['widget']['settings']['input_format'];
   }
   return variable_get('date_format_short', 'm/d/Y - H:i');
-}
\ No newline at end of file
+}
Index: date_popup/date_popup.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_popup/date_popup.module,v
retrieving revision 1.64
diff -u -p -r1.64 date_popup.module
--- date_popup/date_popup.module	26 Sep 2010 23:57:16 -0000	1.64
+++ date_popup/date_popup.module	6 Oct 2010 19:02:42 -0000
@@ -160,6 +160,7 @@ function date_popup_element_info() {
       '#date_year_range' => '-3:+3',
       '#process' => array('date_popup_element_process'),
       '#theme_wrappers' => array('date_popup'),
+      '#value_callback' => 'date_popup_element_value_callback',
       ),
     );
 }
@@ -184,19 +185,20 @@ function date_popup_element_process($ele
   module_load_include('inc', 'date_api', 'date_api_elements');
 
   $date = NULL;
-  $edit = !empty($form_state['input']) ? $form_state['values'] : array();
+  if (!empty($form_state['input']) && isset($form_state['values']['date'])) {
+    $edit = $form_state['values'];
+  }
+  elseif (isset($element['#value']['date'])) {
+    $edit = $element['#value'];
+  }
   
   $granularity = date_format_order($element['#date_format']);
   
-  if (!empty($edit) && is_array($edit) && !empty($edit['date'])) {
+  if (!empty($edit)) {
     $input = $edit['date'] . (!empty($edit['time']) ? ' ' . $edit['time'] : '');
     $datetime = date_convert_from_custom($input, $element['#date_format']);
     $date = date_make_date($datetime, $element['#date_timezone'], DATE_DATETIME, $granularity);
   }
-  elseif (!empty($element['#value'])) {
-    $date = date_make_date($element['#value'], $element['#date_timezone'], DATE_DATETIME, $granularity);
-  }
-  
   date_increment_round($date, $element['#date_increment']);
   $granularity = date_format_order($element['#date_format']);
   $element['#tree'] = TRUE;
@@ -216,6 +218,25 @@ function date_popup_element_process($ele
 }
 
 /**
+ * Element value callback for date_popup element.
+ */
+function date_popup_element_value_callback($element, $input = FALSE, &$form_state) {
+  if (!$input) {
+    $granularity = date_format_order($element['#date_format']);
+    $date_granularity = array_intersect($granularity, array('month', 'day', 'year'));
+    $time_granularity = array_intersect($granularity, array('hour', 'minute', 'second'));
+    $date_format = (date_limit_format($element['#date_format'], $date_granularity));
+    $time_format = date_popup_format_to_popup_time(date_limit_format($element['#date_format'], $time_granularity));
+
+    $date = date_make_date($element['#default_value'], $element['#date_timezone'], DATE_DATETIME, date_format_order($element['#date_format']));
+    return array(
+      'date' => date_format_date($date, 'custom', $date_format),
+      'time' => date_format($date, $time_format)
+    );
+  }
+}
+
+/**
  * Process the date portion of the element.
  */
 function date_popup_process_date(&$element, $edit = NULL, $date = NULL) {
@@ -264,7 +285,7 @@ function date_popup_process_date(&$eleme
   $id = date_popup_js_settings_id($element['#id'], 'datepicker', $settings);
   $sub_element = array(
     '#type' => 'textfield',
-    '#default_value' => (!empty($element['#value']['date']) || !empty($edit['date'])) && is_object($date) ? date_format_date($date, 'custom', $date_format) : '',
+    '#default_value' => !empty($element['#value']['date']) ? $element['#value']['date'] : '',
     '#id' => $id,    
     '#size' => !empty($element['#size']) ? $element['#size'] : 20,
     '#maxlength' => !empty($element['#maxlength']) ? $element['#maxlength'] : 30,
@@ -302,7 +323,7 @@ function date_popup_process_time(&$eleme
   $id = date_popup_js_settings_id($element['#id'], 'timeEntry', $settings);
   $sub_element = array(
     '#type' => 'textfield',
-    '#default_value' => (!empty($element['#value']['time']) || !empty($edit['time'])) && is_object($date) ? date_format($date, $time_format) : '',
+    '#default_value' => !empty($element['#value']['time']) ? $element['#value']['time'] : '',
     '#id' => $id,
     '#size' => 10,
     '#maxlength' => 10,
