Reinstated separated DateField functionality

This commit is contained in:
Ingo Schommer 2017-02-16 09:06:14 +13:00
parent a9f2e9e73d
commit 80723c077b
2 changed files with 99 additions and 5 deletions

View File

@ -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 = '&nbsp;<span class="separator">/</span>&nbsp;';
return $fieldDay->Field() . $sep
. $fieldMonth->Field() . $sep
. $fieldYear->Field();
$sep = '&nbsp;<span class="separator">' . $this->getSeparator() . '</span>&nbsp;';
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;
}
/**

View File

@ -0,0 +1,53 @@
<?php
namespace SilverStripe\Forms\Tests;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\DateField;
use SilverStripe\Forms\SeparatedDateField;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\FieldType\DBDatetime;
class SeparatedDateFieldTest extends SapphireTest
{
public function setUp()
{
parent::setUp();
i18n::set_locale('en_NZ');
DBDatetime::set_mock_now('2011-02-01 8:34:00');
}
public function testFieldOrderingBasedOnLocale()
{
$dateField = new SeparatedDateField('Date');
$dateField->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();
}
}