Browse Source

Fix #5581

Fixes the issue with the `DateTimeWidget` where invalid dates (e.g. Feb 31) was converted to something valid (But unexpected).
Walther Lalk 11 years ago
parent
commit
f936fe370f
1 changed files with 26 additions and 12 deletions
  1. 26 12
      src/View/Widget/DateTimeWidget.php

+ 26 - 12
src/View/Widget/DateTimeWidget.php

@@ -201,20 +201,34 @@ class DateTimeWidget implements WidgetInterface
             } elseif (is_int($value)) {
                 $date = new \DateTime('@' . $value);
             } elseif (is_array($value)) {
-                $date = new \DateTime();
-                if (isset($value['year'], $value['month'], $value['day'])) {
-                    $date->setDate($value['year'], $value['month'], $value['day']);
-                }
-                if (!isset($value['second'])) {
-                    $value['second'] = 0;
-                }
-                if (isset($value['meridian'])) {
-                    $isAm = strtolower($value['meridian']) === 'am';
-                    $value['hour'] = $isAm ? $value['hour'] : $value['hour'] + 12;
+                $dateArray = [
+                    'year' => '', 'month' => '', 'day' => '',
+                    'hour' => '', 'minute' => '', 'second' => '',
+                    'meridian' => 'pm',
+                ];
+                $validDate = false;
+                foreach ($dateArray as $key => $dateValue) {
+                    if (isset($value[$key])) {
+                        $dateArray[$key] = str_pad($value[$key], 2, '0', STR_PAD_LEFT);
+                        $validDate = true;
+                    }
                 }
-                if (isset($value['hour'], $value['minute'], $value['second'])) {
-                    $date->setTime($value['hour'], $value['minute'], $value['second']);
+                if ($validDate) {
+                    if (empty($dateArray['second'])) {
+                        $dateArray['second'] = 0;
+                    }
+                    if (isset($value['meridian'])) {
+                        $isAm = strtolower($dateArray['meridian']) === 'am';
+                        $dateArray['hour'] = $isAm ? $dateArray['hour'] : $dateArray['hour'] + 12;
+                    }
+                    if (!empty($dateArray['minute']) && isset($options['minute']['interval'])) {
+                        $dateArray['minute'] += $this->_adjustValue($dateArray['minute'], $options['minute']);
+                    }
+
+                    return $dateArray;
                 }
+
+                $date = new \DateTime();
             } else {
                 $date = clone $value;
             }