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();
+ }
+}