diff --git a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php index de6c0f8..b8414ff 100644 --- a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php +++ b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php @@ -124,7 +124,7 @@ public function format($format, $settings = array()) { $settings['calendar'] = !empty($settings['calendar']) ? $settings['calendar'] : $this->calendar; $settings['langcode'] = !empty($settings['langcode']) ? $settings['langcode'] : $this->langcode; $settings['country'] = !empty($settings['country']) ? $settings['country'] : $this->country; - + $settings['format_string_type'] = $format_string_type; // Format the date and catch errors. try { @@ -142,10 +142,10 @@ public function format($format, $settings = array()) { // Paired backslashes are isolated to prevent errors in // read-ahead evaluation. The read-ahead expression ensures that // A matches, but not \A. - $format = preg_replace(array('/\\\\\\\\/', '/(? 'datetime_form', '#theme_wrappers' => array('datetime_wrapper'), '#date_date_format' => $date_format, + '#date_format_string_type' => $format_type, '#date_date_element' => 'date', '#date_date_callbacks' => array(), '#date_time_format' => $time_format, @@ -383,7 +384,7 @@ function template_preprocess_datetime_wrapper(&$variables) { * The form element whose value has been processed. */ function datetime_datetime_form_process($element, &$form_state) { - + $format_settings = array('format_string_type' => $element['#date_format_string_type']); // The value callback has populated the #value array. $date = !empty($element['#value']['object']) ? $element['#value']['object'] : NULL; @@ -403,13 +404,13 @@ function datetime_datetime_form_process($element, &$form_state) { if ($element['#date_date_element'] != 'none') { $date_format = $element['#date_date_element'] != 'none' ? datetime_html5_format('date', $element) : ''; - $date_value = !empty($date) ? $date->format($date_format) : $element['#value']['date']; + $date_value = !empty($date) ? $date->format($date_format, $format_settings) : $element['#value']['date']; // Creating format examples on every individual date item is messy, and // placeholders are invalid for HTML5 date and datetime, so an example // format is appended to the title to appear in tooltips. $extra_attributes = array( - 'title' => t('Date (i.e. !format)', array('!format' => datetime_format_example($date_format))), + 'title' => t('Date (i.e. !format)', array('!format' => datetime_format_example($date_format, $format_settings))), 'type' => $element['#date_date_element'], ); @@ -422,8 +423,8 @@ function datetime_datetime_form_process($element, &$form_state) { $html5_max->setDate($range[1], 12, 31)->setTime(23, 59, 59); $extra_attributes += array( - 'min' => $html5_min->format($date_format), - 'max' => $html5_max->format($date_format), + 'min' => $html5_min->format($date_format, $format_settings), + 'max' => $html5_max->format($date_format, $format_settings), ); } @@ -450,11 +451,11 @@ function datetime_datetime_form_process($element, &$form_state) { if ($element['#date_time_element'] != 'none') { $time_format = $element['#date_time_element'] != 'none' ? datetime_html5_format('time', $element) : ''; - $time_value = !empty($date) ? $date->format($time_format) : $element['#value']['time']; + $time_value = !empty($date) ? $date->format($time_format, $format_settings) : $element['#value']['time']; // Adds the HTML5 attributes. $extra_attributes = array( - 'title' =>t('Time (i.e. !format)', array('!format' => datetime_format_example($time_format))), + 'title' =>t('Time (i.e. !format)', array('!format' => datetime_format_example($time_format, $format_settings))), 'type' => $element['#date_time_element'], 'step' => $element['#date_increment'], ); @@ -523,8 +524,8 @@ function form_type_datetime_value($element, $input = FALSE) { $date = $element['#default_value']; if ($date instanceOf DrupalDateTime && !$date->hasErrors()) { $input = array( - 'date' => $date->format($element['#date_date_format']), - 'time' => $date->format($element['#date_time_format']), + 'date' => $date->format($element['#date_date_format'], array('format_string_type' => $element['#date_format_string_type'])), + 'time' => $date->format($element['#date_time_format'], array('format_string_type' => $element['#date_format_string_type'])), 'object' => $date, ); } @@ -570,18 +571,19 @@ function datetime_datetime_validate($element, &$form_state) { // If there's empty input and the field is required, set an error. A // reminder of the required format in the message provides a good UX. elseif (empty($input['date']) && empty($input['time']) && $element['#required']) { - form_error($element, t('The %field date is required. Please enter a date in the format %format.', array('%field' => $title, '%format' => datetime_format_example($format)))); + form_error($element, t('The %field date is required. Please enter a date in the format %format.', array('%field' => $title, '%format' => datetime_format_example($format, array('format_string_type' => $element['#date_format_string_type']))))); } else { // If the date is valid, set it. - $date = $input['object']; - if ($date instanceOf DrupalDateTime && !$date->hasErrors()) { - form_set_value($element, $date, $form_state); + $date = $element['#default_value']; + $new_date = @$date->modify($input['date'].' '.$input['time']); + if ($new_date && $new_date instanceOf DrupalDateTime && !$new_date->hasErrors()) { + form_set_value($element, $new_date, $form_state); } // If the date is invalid, set an error. A reminder of the required // format in the message provides a good UX. else { - form_error($element, t('The %field date is invalid. Please enter a date in the format %format.', array('%field' => $title, '%format' => datetime_format_example($format)))); + form_error($element, t('The %field date is invalid. Please enter a date in the format %format.', array('%field' => $title, '%format' => datetime_format_example($format, array('format_string_type' => $element['#date_format_string_type']))))); } } } @@ -642,12 +644,12 @@ function datetime_html5_format($part, $element) { * @return string * */ -function datetime_format_example($format) { +function datetime_format_example($format, $settings = array()) { $date = &drupal_static(__FUNCTION__); if (empty($date)) { $date = new DrupalDateTime(); } - return $date->format($format); + return $date->format($format, $settings); } /** @@ -1040,7 +1042,7 @@ function datetime_form_node_form_alter(&$form, &$form_state, $form_id) { $form['author']['date']['#type'] = 'datetime'; $date_format = entity_load('date_format', 'html_date')->getPattern($format_type); $time_format = entity_load('date_format', 'html_time')->getPattern($format_type); - $form['author']['date']['#description'] = t('Format: %format. Leave blank to use the time of form submission.', array('%format' => datetime_format_example($date_format . ' ' . $time_format))); + $form['author']['date']['#description'] = t('Format: %format. Leave blank to use the time of form submission.', array('%format' => datetime_format_example($date_format . ' ' . $time_format, array('format_string_type' => $format_type)))); unset($form['author']['date']['#maxlength']); }