2011-12-23 10:30:49 +01:00
|
|
|
<?php
|
2016-06-15 06:03:16 +02:00
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
namespace SilverStripe\Forms;
|
|
|
|
|
2016-06-15 06:03:16 +02:00
|
|
|
use SilverStripe\ORM\ArrayList;
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\Core\Convert;
|
|
|
|
use SilverStripe\View\ArrayData;
|
|
|
|
use SilverStripe\View\Requirements;
|
|
|
|
use Zend_Date;
|
|
|
|
|
2011-12-23 10:30:49 +01:00
|
|
|
class MemberDatetimeOptionsetField extends OptionsetField {
|
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
const CUSTOM_OPTION = '__custom__';
|
|
|
|
|
2015-12-21 05:57:07 +01:00
|
|
|
/**
|
|
|
|
* Non-ambiguous date to use for the preview.
|
|
|
|
* Must be in 'y-MM-dd HH:mm:ss' format
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
private static $preview_date = '25-12-2011 17:30:00';
|
|
|
|
|
2016-07-06 10:16:27 +02:00
|
|
|
private static $casting = ['Description' => 'HTMLText'];
|
|
|
|
|
|
|
|
private $descriptionTemplate = '';
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function Field($properties = array()) {
|
2015-02-13 05:35:39 +01:00
|
|
|
$options = array();
|
|
|
|
$odd = false;
|
2012-11-30 12:27:38 +01:00
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
// Add all options striped
|
|
|
|
$anySelected = false;
|
|
|
|
foreach($this->getSourceEmpty() as $value => $title) {
|
|
|
|
$odd = !$odd;
|
|
|
|
if(!$anySelected) {
|
|
|
|
$anySelected = $this->isSelectedValue($value, $this->Value());
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
2015-02-13 05:35:39 +01:00
|
|
|
$options[] = $this->getFieldOption($value, $title, $odd);
|
|
|
|
}
|
2011-12-23 10:30:49 +01:00
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
// Add "custom" input field option
|
|
|
|
$options[] = $this->getCustomFieldOption(!$anySelected, !$odd);
|
2011-12-23 10:30:49 +01:00
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
// Build fieldset
|
|
|
|
$properties = array_merge($properties, array(
|
|
|
|
'Options' => new ArrayList($options)
|
|
|
|
));
|
2011-12-23 10:30:49 +01:00
|
|
|
|
2016-07-13 14:36:52 +02:00
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
return $this->customise($properties)->renderWith(
|
|
|
|
$this->getTemplates()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create the "custom" selection field option
|
|
|
|
*
|
|
|
|
* @param bool $isChecked True if this is checked
|
|
|
|
* @param bool $odd Is odd striped
|
|
|
|
* @return ArrayData
|
|
|
|
*/
|
|
|
|
protected function getCustomFieldOption($isChecked, $odd) {
|
2011-12-23 10:30:49 +01:00
|
|
|
// Add "custom" input field
|
2015-02-13 05:35:39 +01:00
|
|
|
$option = $this->getFieldOption(
|
|
|
|
self::CUSTOM_OPTION,
|
|
|
|
_t('MemberDatetimeOptionsetField.Custom', 'Custom'),
|
|
|
|
$odd
|
|
|
|
);
|
|
|
|
$option->setField('isChecked', $isChecked);
|
|
|
|
$option->setField('CustomName', $this->getName().'[Custom]');
|
|
|
|
$option->setField('CustomValue', $this->Value());
|
|
|
|
if($this->Value()) {
|
2015-12-21 05:57:07 +01:00
|
|
|
$preview = Convert::raw2xml($this->previewFormat($this->Value()));
|
2015-02-13 05:35:39 +01:00
|
|
|
$option->setField('CustomPreview', $preview);
|
|
|
|
$option->setField('CustomPreviewLabel', _t('MemberDatetimeOptionsetField.Preview', 'Preview'));
|
|
|
|
}
|
|
|
|
return $option;
|
|
|
|
}
|
2011-12-23 10:30:49 +01:00
|
|
|
|
2015-12-21 05:57:07 +01:00
|
|
|
/**
|
|
|
|
* For a given format, generate a preview for the date
|
|
|
|
*
|
|
|
|
* @param string $format Date format
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
protected function previewFormat($format) {
|
|
|
|
$date = $this->config()->preview_date;
|
|
|
|
$zendDate = new Zend_Date($date, 'y-MM-dd HH:mm:ss');
|
|
|
|
return $zendDate->toString($format);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getOptionName() {
|
|
|
|
return parent::getOptionName() . '[Options]';
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
|
|
|
|
2015-02-13 05:35:39 +01:00
|
|
|
public function Type() {
|
|
|
|
return 'optionset memberdatetimeoptionset';
|
|
|
|
}
|
2016-03-08 21:50:18 +01:00
|
|
|
|
2012-11-30 12:27:38 +01:00
|
|
|
public function getDescription() {
|
2016-07-06 10:16:27 +02:00
|
|
|
if ($template = $this->getDescriptionTemplate()) {
|
|
|
|
return $this->renderWith($template);
|
|
|
|
}
|
|
|
|
return parent::getDescription();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getDescriptionTemplate() {
|
|
|
|
return $this->descriptionTemplate;
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
|
|
|
|
2016-07-06 10:16:27 +02:00
|
|
|
public function setDescriptionTemplate($template) {
|
|
|
|
$this->descriptionTemplate = $template;
|
|
|
|
}
|
2015-02-13 05:35:39 +01:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function setValue($value) {
|
2015-02-13 05:35:39 +01:00
|
|
|
// Extract custom option from postback
|
|
|
|
if(is_array($value)) {
|
|
|
|
if(empty($value['Options'])) {
|
|
|
|
$value = '';
|
|
|
|
} elseif($value['Options'] === self::CUSTOM_OPTION) {
|
|
|
|
$value = $value['Custom'];
|
|
|
|
} else {
|
|
|
|
$value = $value['Options'];
|
|
|
|
}
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
2015-02-13 05:35:39 +01:00
|
|
|
|
|
|
|
return parent::setValue($value);
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
|
|
|
|
2014-11-12 03:19:12 +01:00
|
|
|
/**
|
|
|
|
* Validate this field
|
|
|
|
*
|
|
|
|
* @param Validator $validator
|
|
|
|
* @return bool
|
|
|
|
*/
|
2015-05-11 02:32:00 +02:00
|
|
|
public function validate($validator) {
|
2015-02-13 05:35:39 +01:00
|
|
|
$value = $this->Value();
|
|
|
|
if(!$value) {
|
|
|
|
return true; // no custom value, don't validate
|
|
|
|
}
|
2011-12-23 10:30:49 +01:00
|
|
|
|
|
|
|
// Check that the current date with the date format is valid or not
|
|
|
|
require_once 'Zend/Date.php';
|
|
|
|
$date = Zend_Date::now()->toString($value);
|
|
|
|
$valid = Zend_Date::isDate($date, $value);
|
|
|
|
if($valid) {
|
|
|
|
return true;
|
|
|
|
}
|
2015-02-13 05:35:39 +01:00
|
|
|
|
|
|
|
// Fail
|
|
|
|
$validator->validationError(
|
|
|
|
$this->getName(),
|
|
|
|
_t(
|
|
|
|
'MemberDatetimeOptionsetField.DATEFORMATBAD',
|
|
|
|
"Date format is invalid"
|
|
|
|
),
|
|
|
|
"validation"
|
|
|
|
);
|
|
|
|
return false;
|
2011-12-23 10:30:49 +01:00
|
|
|
}
|
2012-04-12 02:23:18 +02:00
|
|
|
}
|