diff --git a/layout/default/FormField/Date/default.tpl b/layout/default/FormField/Date/default.tpl index 470496d0e..fa01f6126 100644 --- a/layout/default/FormField/Date/default.tpl +++ b/layout/default/FormField/Date/default.tpl @@ -1,3 +1,3 @@ -{select name="{$name}[year]" optionList=$years placeholder={translate 'Year'} selectedValue=$yy} -{select name="{$name}[month]" optionList=$months placeholder={translate 'Month'} selectedValue=$mm translate=true translatePrefix='.date.month.'} -{select name="{$name}[day]" optionList=$days placeholder={translate 'Day'} selectedValue=$dd} +{select class="year" name="{$name}[year]" optionList=$years placeholder={translate 'Year'} selectedValue=$yy} +{select class="month" name="{$name}[month]" optionList=$months placeholder={translate 'Month'} selectedValue=$mm translate=true translatePrefix='.date.month.'} +{select class="day" name="{$name}[day]" optionList=$days placeholder={translate 'Day'} selectedValue=$dd} diff --git a/library/CM/FormField/Date.php b/library/CM/FormField/Date.php index ba7234331..bfadafa28 100755 --- a/library/CM/FormField/Date.php +++ b/library/CM/FormField/Date.php @@ -19,7 +19,7 @@ public function validate(CM_Frontend_Environment $environment, $userInput) { $mm = (int) trim($userInput['month']); $yy = (int) trim($userInput['year']); - return new DateTime($yy . '-' . $mm . '-' . $dd); + return new DateTime($yy . '-' . $mm . '-' . $dd, $environment->getTimeZone()); } public function prepare(CM_Params $renderParams, CM_Frontend_Environment $environment, CM_Frontend_ViewResponse $viewResponse) { @@ -33,10 +33,19 @@ public function prepare(CM_Params $renderParams, CM_Frontend_Environment $enviro $viewResponse->set('months', array_combine($months, $months)); $viewResponse->set('days', array_combine($days, $days)); + /** @var DateTime|null $value */ $value = $this->getValue(); - $viewResponse->set('yy', $value ? $value->format('Y') : null); - $viewResponse->set('mm', $value ? $value->format('n') : null); - $viewResponse->set('dd', $value ? $value->format('j') : null); + $year = $month = $day = null; + if (null !== $value) { + $value->setTimezone($environment->getTimeZone()); + $year = $value->format('Y'); + $month = $value->format('n'); + $day = $value->format('j'); + } + + $viewResponse->set('yy', $year); + $viewResponse->set('mm', $month); + $viewResponse->set('dd', $day); } public function isEmpty($userInput) { diff --git a/tests/library/CM/FormField/DateTest.php b/tests/library/CM/FormField/DateTest.php new file mode 100644 index 000000000..29fb76733 --- /dev/null +++ b/tests/library/CM/FormField/DateTest.php @@ -0,0 +1,25 @@ + 'foo']); + $field->setValue(new DateTime('2015-03-02 01:00:00', new DateTimeZone('UTC'))); + + $environment = new CM_Frontend_Environment(null, null, null, new DateTimeZone('America/New_York')); + $render = new CM_Frontend_Render($environment); + $doc = $this->_renderFormField($field, null, $render); + + $this->assertSame('selected', $doc->find('select.year option[value="2015"]')->getAttribute('selected')); + $this->assertSame('selected', $doc->find('select.month option[value="3"]')->getAttribute('selected')); + $this->assertSame('selected', $doc->find('select.day option[value="1"]')->getAttribute('selected')); + } + + public function testValidateWithEnvironmentTimezone() { + $formField = new CM_FormField_Date(); + + $environment = new CM_Frontend_Environment(null, null, null, new DateTimeZone('Asia/Tokyo')); + $value = $formField->validate($environment, ['year' => 2015, 'month' => 03, 'day' => 02]); + $this->assertEquals(new DateTime('2015-03-02 00:00:00', new DateTimeZone('Asia/Tokyo')), $value); + } +}