From 80723c077bf0acd7d57177330cfeec12c50d4b95 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 16 Feb 2017 09:06:14 +1300 Subject: [PATCH] Reinstated separated DateField functionality --- src/Forms/SeparatedDateField.php | 51 +++++++++++++++++++-- tests/php/Forms/SeparatedDateFieldTest.php | 53 ++++++++++++++++++++++ 2 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 tests/php/Forms/SeparatedDateFieldTest.php diff --git a/src/Forms/SeparatedDateField.php b/src/Forms/SeparatedDateField.php index dc6999a95..8580a1e48 100644 --- a/src/Forms/SeparatedDateField.php +++ b/src/Forms/SeparatedDateField.php @@ -9,6 +9,12 @@ use SilverStripe\i18n\i18n; */ class SeparatedDateField extends DateField { + + /** + * @var string + */ + protected $separator = '/'; + public function Field($properties = array()) { // Three separate fields for day, month and year @@ -33,12 +39,47 @@ class SeparatedDateField extends DateField $fieldYear->setAttribute('placeholder', _t(__CLASS__ . '.YEAR', 'Year')); } + $format = $this->getDateFormat(); + $validFormat = ( + stripos($format, 'd') !== false + && stripos($format, 'm') !== false + && stripos($format, 'y') !== false + ); + if (!$validFormat) { + throw new \InvalidArgumentException( + 'Invalid date format for field ordering: ' . $format + . '. Requires "d", "m", and "y" values to determine order' + ); + } + + $fields = array(); + $fields[stripos($format, 'd')] = $fieldDay->Field(); + $fields[stripos($format, 'm')] = $fieldMonth->Field(); + $fields[stripos($format, 'y')] = $fieldYear->Field(); + ksort($fields); + + // Join all fields - // @todo custom ordering based on locale - $sep = ' / '; - return $fieldDay->Field() . $sep - . $fieldMonth->Field() . $sep - . $fieldYear->Field(); + $sep = ' ' . $this->getSeparator() . ' '; + return implode($sep, $fields); + } + + /** + * @param $string + * @return self + */ + public function setSeparator($separator) + { + $this->separator = $separator; + return $this; + } + + /** + * @return string + */ + public function getSeparator() + { + return $this->separator; } /** diff --git a/tests/php/Forms/SeparatedDateFieldTest.php b/tests/php/Forms/SeparatedDateFieldTest.php new file mode 100644 index 000000000..1312a5efe --- /dev/null +++ b/tests/php/Forms/SeparatedDateFieldTest.php @@ -0,0 +1,53 @@ +setLocale('en_NZ'); + $this->assertRegExp('/.*[day].*[month].*[year]/', $dateField->Field()); + } + + public function testFieldOrderingBasedOnDateFormat() + { + $dateField = new SeparatedDateField('Date'); + $dateField->setDateFormat('y/MM/dd'); + $this->assertRegExp('/.*[year].*[month].*[day]/', $dateField->Field()); + } + + public function testCustomSeparator() + { + $dateField = new SeparatedDateField('Date'); + $dateField->setDateFormat('dd/MM/y'); + $dateField->setSeparator('###'); + $this->assertRegExp('/.*[day].*###.*[month].*###.*[day]/', $dateField->Field()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid date format + */ + public function testInvalidDateFormat() + { + $dateField = new SeparatedDateField('Date'); + $dateField->setDateFormat('y/MM'); + $dateField->Field(); + } +}