diff --git a/src/Forms/DatetimeField.php b/src/Forms/DatetimeField.php index e14473770..a1db12a64 100644 --- a/src/Forms/DatetimeField.php +++ b/src/Forms/DatetimeField.php @@ -10,12 +10,14 @@ use SilverStripe\ORM\FieldType\DBDatetime; /** * Form field used for editing date time string * + * # Localization + * + * See {@link DateField} + * * # Configuration * * - "timezone": Set a different timezone for viewing. {@link dataValue()} will still save * the time in PHP's default timezone (date_default_timezone_get()), its only a view setting. - * - "datetimeorder": An sprintf() template to determine in which order the date and time values will - * be combined. This is necessary as those separate formats are set in their invididual fields. */ class DatetimeField extends TextField { @@ -162,6 +164,7 @@ class DatetimeField extends TextField // Parse from submitted value $this->value = $this->localisedToISO8601($value); + return $this; } @@ -222,7 +225,7 @@ class DatetimeField extends TextField // Browsers expect ISO 8601 dates, localisation is handled on the client $formatter->setPattern(DBDatetime::ISO_DATETIME); } elseif ($this->datetimeFormat) { - // Don't invoke getDateFormat() directly to avoid infinite loop + // Don't invoke getDatetimeFormat() directly to avoid infinite loop $ok = $formatter->setPattern($this->datetimeFormat); if (!$ok) { throw new InvalidArgumentException("Invalid date format {$this->datetimeFormat}"); @@ -239,7 +242,7 @@ class DatetimeField extends TextField * * @see http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Field-Symbol-Table */ - public function getDateFormat() + public function getDatetimeFormat() { if ($this->getHTML5()) { // Browsers expect ISO 8601 dates, localisation is handled on the client @@ -557,7 +560,7 @@ class DatetimeField extends TextField _t( 'DateField.VALIDDATEFORMAT2', "Please enter a valid date format ({format})", - ['format' => $this->getDateFormat()] + ['format' => $this->getDatetimeFormat()] ) ); return false; @@ -636,24 +639,4 @@ class DatetimeField extends TextField $this->timezone = $timezone; return $this; } - - /** - * @return string - */ - public function getDateTimeOrder() - { - return $this->dateTimeOrder; - } - - /** - * Set date time order format string. Use {date} and {time} as placeholders. - * - * @param string $dateTimeOrder - * @return $this - */ - public function setDateTimeOrder($dateTimeOrder) - { - $this->dateTimeOrder = $dateTimeOrder; - return $this; - } } diff --git a/src/ORM/FieldType/DBDatetime.php b/src/ORM/FieldType/DBDatetime.php index 159e43c8b..1630c1ebc 100644 --- a/src/ORM/FieldType/DBDatetime.php +++ b/src/ORM/FieldType/DBDatetime.php @@ -132,32 +132,18 @@ class DBDatetime extends DBDate implements TemplateGlobalProvider public function scaffoldFormField($title = null, $params = null) { $field = DatetimeField::create($this->name, $title); - $dateFormat = $field->getDateField()->getDateFormat(); - $timeFormat = $field->getTimeField()->getTimeFormat(); + $dateTimeFormat = $field->getDatetimeFormat(); // Set date formatting hints and example - $date = static::now()->Format($dateFormat); + $date = static::now()->Format($dateTimeFormat); $field - ->getDateField() ->setDescription(_t( 'FormField.EXAMPLE', 'e.g. {format}', 'Example format', [ 'format' => $date ] )) - ->setAttribute('placeholder', $dateFormat); - - // Set time formatting hints and example - $time = static::now()->Format($timeFormat); - $field - ->getTimeField() - ->setDescription(_t( - 'FormField.EXAMPLE', - 'e.g. {format}', - 'Example format', - [ 'format' => $time ] - )) - ->setAttribute('placeholder', $timeFormat); + ->setAttribute('placeholder', $dateTimeFormat); return $field; } diff --git a/tests/php/Forms/DatetimeFieldTest.php b/tests/php/Forms/DatetimeFieldTest.php index f0736f44a..02dccca14 100644 --- a/tests/php/Forms/DatetimeFieldTest.php +++ b/tests/php/Forms/DatetimeFieldTest.php @@ -37,26 +37,18 @@ class DatetimeFieldTest extends SapphireTest $form = $this->getMockForm(); $form->Fields()->push($dateTimeField); - $dateTimeField->setSubmittedValue([ - 'date' => '2003-03-29', - 'time' => '23:59:38' - ]); + $dateTimeField->setSubmittedValue('2003-03-29T23:59:38'); $validator = new RequiredFields(); $this->assertTrue($dateTimeField->validate($validator)); $m = new Model(); $form->saveInto($m); - $this->assertEquals('2003-03-29 23:59:38', $m->MyDatetime); + $this->assertEquals('2003-03-29T23:59:38', $m->MyDatetime); } public function testFormSaveIntoLocalised() { $dateTimeField = new DatetimeField('MyDatetime'); - - $dateTimeField->getDateField() - ->setHTML5(false) - ->setLocale('en_NZ'); - - $dateTimeField->getTimeField() + $dateTimeField ->setHTML5(false) ->setLocale('en_NZ'); @@ -64,15 +56,12 @@ class DatetimeFieldTest extends SapphireTest $form->Fields()->push($dateTimeField); // en_NZ standard format - $dateTimeField->setSubmittedValue([ - 'date' => '29/03/2003', - 'time' => '11:59:38 pm' - ]); + $dateTimeField->setSubmittedValue('29/03/2003 11:59:38 pm'); $validator = new RequiredFields(); $this->assertTrue($dateTimeField->validate($validator)); $m = new Model(); $form->saveInto($m); - $this->assertEquals('2003-03-29 23:59:38', $m->MyDatetime); + $this->assertEquals('2003-03-29T23:59:38', $m->MyDatetime); } public function testDataValue() @@ -119,33 +108,23 @@ class DatetimeFieldTest extends SapphireTest $this->assertEquals($f->dataValue(), '2003-03-29 23:59:38'); } - public function testSetValueWithArray() + public function testSetValue() { $datetimeField = new DatetimeField('Datetime', 'Datetime'); - $datetimeField->setSubmittedValue([ - 'date' => '2003-03-29', - 'time' => '23:00:00' - ]); + $datetimeField->setSubmittedValue('2003-03-29 23:00:00'); $this->assertEquals($datetimeField->dataValue(), '2003-03-29 23:00:00'); } - public function testSetValueWithArrayLocalised() + public function testSetValueWithLocalised() { $datetimeField = new DatetimeField('Datetime', 'Datetime'); - $datetimeField->getDateField() - ->setHTML5(false) - ->setLocale('en_NZ'); - - $datetimeField->getTimeField() + $datetimeField ->setHTML5(false) ->setLocale('en_NZ'); // Values can only be localized (= non-ISO) in array notation - $datetimeField->setSubmittedValue([ - 'date' => '29/03/2003', - 'time' => '11:00:00 pm' - ]); + $datetimeField->setSubmittedValue('29/03/2003 11:00:00 pm'); $this->assertEquals($datetimeField->dataValue(), '2003-03-29 23:00:00'); } @@ -167,11 +146,7 @@ class DatetimeFieldTest extends SapphireTest // Berlin and Auckland have 12h time difference in northern hemisphere winter $datetimeField = new DatetimeField('Datetime', 'Datetime'); - $datetimeField->getDateField() - ->setHTML5(false) - ->setLocale('en_NZ'); - - $datetimeField->getTimeField() + $datetimeField ->setHTML5(false) ->setLocale('en_NZ'); @@ -182,8 +157,7 @@ class DatetimeFieldTest extends SapphireTest $datetimeField->Value(), 'User value is formatted, and in user timezone' ); - $this->assertEquals('25/12/2003', $datetimeField->getDateField()->Value()); - $this->assertEquals('11:59:59 AM', $datetimeField->getTimeField()->Value()); + $this->assertEquals( '2003-12-24 23:59:59', $datetimeField->dataValue(), @@ -197,81 +171,22 @@ class DatetimeFieldTest extends SapphireTest // Berlin and Auckland have 12h time difference in northern hemisphere summer, but Berlin and Moscow only 2h. $datetimeField = new DatetimeField('Datetime', 'Datetime'); - $datetimeField->getDateField() - ->setHTML5(false) - ->setLocale('en_NZ'); - - $datetimeField->getTimeField() + $datetimeField ->setHTML5(false) ->setLocale('en_NZ'); $datetimeField->setTimezone('Europe/Moscow'); - $datetimeField->setSubmittedValue([ - // pass in default format, at user time (Moscow) - 'date' => '24/06/2003', - 'time' => '11:59:59 pm', - ]); + // pass in default format, at user time (Moscow) + $datetimeField->setSubmittedValue('24/06/2003 11:59:59 pm'); $this->assertTrue($datetimeField->validate(new RequiredFields())); $this->assertEquals('2003-06-24 21:59:59', $datetimeField->dataValue(), 'Data value matches server timezone'); } - public function testSetDateField() - { - $form = $this->getMockForm(); - $field = new DatetimeField('Datetime', 'Datetime'); - $field->setForm($form); - $field->setSubmittedValue([ - 'date' => '2003-06-24', - 'time' => '23:59:59', - ]); - $dateField = new DateField('Datetime[date]'); - $field->setDateField($dateField); - - $this->assertEquals( - $dateField->getForm(), - $form, - 'Sets form on new field' - ); - - $this->assertEquals( - '2003-06-24', - $dateField->dataValue(), - 'Sets existing value on new field' - ); - } - - public function testSetTimeField() - { - $form = $this->getMockForm(); - $field = new DatetimeField('Datetime', 'Datetime'); - $field->setForm($form); - $field->setSubmittedValue([ - 'date' => '2003-06-24', - 'time' => '23:59:59', - ]); - $timeField = new TimeField('Datetime[time]'); - $field->setTimeField($timeField); - - $this->assertEquals( - $timeField->getForm(), - $form, - 'Sets form on new field' - ); - - $this->assertEquals( - '23:59:59', - $timeField->dataValue(), - 'Sets existing value on new field' - ); - } - public function testGetName() { $field = new DatetimeField('Datetime'); $this->assertEquals('Datetime', $field->getName()); - $this->assertEquals('Datetime[date]', $field->getDateField()->getName()); - $this->assertEquals('Datetime[time]', $field->getTimeField()->getName()); } public function testSetName() @@ -279,8 +194,6 @@ class DatetimeFieldTest extends SapphireTest $field = new DatetimeField('Datetime', 'Datetime'); $field->setName('CustomDatetime'); $this->assertEquals('CustomDatetime', $field->getName()); - $this->assertEquals('CustomDatetime[date]', $field->getDateField()->getName()); - $this->assertEquals('CustomDatetime[time]', $field->getTimeField()->getName()); } protected function getMockForm() diff --git a/tests/php/Forms/FormSchemaTest.php b/tests/php/Forms/FormSchemaTest.php index 3073482f2..fb5b8659a 100644 --- a/tests/php/Forms/FormSchemaTest.php +++ b/tests/php/Forms/FormSchemaTest.php @@ -462,6 +462,8 @@ class FormSchemaTest extends SapphireTest 'extraClass' => 'date text', 'description' => null, 'rightTitle' => null, + 'html5' => true, + 'lang' => 'en-US', 'leftTitle' => null, 'readOnly' => false, 'disabled' => false, diff --git a/tests/php/ORM/DBDatetimeTest.php b/tests/php/ORM/DBDatetimeTest.php index 428e56b03..bfb2ab032 100644 --- a/tests/php/ORM/DBDatetimeTest.php +++ b/tests/php/ORM/DBDatetimeTest.php @@ -29,7 +29,7 @@ class DBDatetimeTest extends SapphireTest public function testNowWithMockDate() { // Test setting - $mockDate = '2001-12-31 22:10:59'; + $mockDate = '2001-12-31T22:10:59'; DBDatetime::set_mock_now($mockDate); $systemDatetime = DBDatetime::create_field('Datetime', date('Y-m-d H:i:s')); $nowDatetime = DBDatetime::now(); @@ -55,10 +55,10 @@ class DBDatetimeTest extends SapphireTest $this->assertNull($date->getValue(), 'Boolean FALSE evaluates to NULL'); $date = DBDatetime::create_field('Datetime', '0'); - $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'String zero is UNIX epoch time'); + $this->assertEquals('1970-01-01T00:00:00', $date->getValue(), 'String zero is UNIX epoch time'); $date = DBDatetime::create_field('Datetime', 0); - $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'Numeric zero is UNIX epoch time'); + $this->assertEquals('1970-01-01T00:00:00', $date->getValue(), 'Numeric zero is UNIX epoch time'); } public function testExtendedDateTimes() @@ -98,7 +98,7 @@ class DBDatetimeTest extends SapphireTest public function testURLDateTime() { $date = DBDatetime::create_field('Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('2001-12-31%2022%3A10%3A59', $date->URLDateTime()); + $this->assertEquals('2001-12-31T22%3A10%3A59', $date->URLDateTime()); } public function testAgoInPast()