public function buildForm(FormBuilder $builder, array $options)
{
$parts = array('year', 'month', 'day', 'hour', 'minute');
$timeParts = array('hour', 'minute');
$format = 'Y-m-d H:i:00';
if ($options['with_seconds']) {
$format = 'Y-m-d H:i:s';
$parts[] = 'second';
$timeParts[] = 'second';
}
if ($options['date_widget'] !== $options['time_widget']) {
throw new FormException(sprintf('Options "date_widget" and "time_widget" need to be identical. Used: "date_widget" = "%s" and "time_widget" = "%s".', $options['date_widget'] ?: 'choice', $options['time_widget'] ?: 'choice'));
}
if ($options['widget'] === 'single_text') {
$builder->appendClientTransformer(new DateTimeToStringTransformer($options['data_timezone'], $options['user_timezone'], $format));
} else {
// Only pass a subset of the options to children
$dateOptions = array_intersect_key($options, array_flip(array(
'years',
'months',
'days',
'empty_value',
'required',
)));
$timeOptions = array_intersect_key($options, array_flip(array(
'hours',
'minutes',
'seconds',
'with_seconds',
'empty_value',
'required',
)));
// If `widget` is set, overwrite widget options from `date` and `time`
if (isset($options['widget'])) {
$dateOptions['widget'] = $options['widget'];
$timeOptions['widget'] = $options['widget'];
} else {
if (isset($options['date_widget'])) {
$dateOptions['widget'] = $options['date_widget'];
}
if (isset($options['time_widget'])) {
$timeOptions['widget'] = $options['time_widget'];
}
}
if (isset($options['date_format'])) {
$dateOptions['format'] = $options['date_format'];
}
$dateOptions['input'] = 'array';
$timeOptions['input'] = 'array';
$builder
->appendClientTransformer(new DataTransformerChain(array(
new DateTimeToArrayTransformer($options['data_timezone'], $options['user_timezone'], $parts),
new ArrayToPartsTransformer(array(
'date' => array('year', 'month', 'day'),
'time' => $timeParts,
)),
)))
->add('date', 'date', $dateOptions)
->add('time', 'time', $timeOptions)
;
}
if ($options['input'] === 'string') {
$builder->appendNormTransformer(new ReversedTransformer(
new DateTimeToStringTransformer($options['data_timezone'], $options['data_timezone'], $format)
));
} else if ($options['input'] === 'timestamp') {
$builder->appendNormTransformer(new ReversedTransformer(
new DateTimeToTimestampTransformer($options['data_timezone'], $options['data_timezone'])
));
} else if ($options['input'] === 'array') {
$builder->appendNormTransformer(new ReversedTransformer(
new DateTimeToArrayTransformer($options['data_timezone'], $options['data_timezone'], $parts)
));
}
$builder->setAttribute('widget', $options['widget']);
}