Я пытаюсь создать DateTimePickerType, чтобы легко добавить Bootstrap dateTimePicker в поле, просто используя тип «date_time_picker» в построителе форм.
К сожалению, я сталкиваюсь с некоторыми проблемами. В частности, Symfony дает мне эту ошибку:
Symfony \ Component \ Validator \ ConstraintViolation
Object (Symfony \ Component \ Form \ Form) .children [startDate] = Object (DateTime) — 2016-10-16T10: 45: 00 + 0200
Вызванный:
Symfony \ Component \ Form \ Exception \ TransformationFailedException
Невозможно отменить значение для пути свойства «startDate»: ожидается строка.
Вызванный:
Symfony \ Component \ Form \ Exception \ TransformationFailedException
Ожидаемая строка.
Так что, очевидно, моя форма отправляет объект DateTime моему контроллеру, который не может преобразовать его в String. В базе данных поле имеет тип datetime.
Вот мой DateTimePickerType:
class DateTimePickerType extends AbstractType
{
/**
* @return string
*/
public function getParent()
{
return 'datetime';
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'empty_data' => new \DateTime(),
'widget' => "single_text",
'attr' => array(
'class' => 'addInput col-xs-12 dateSize noPadding noOutline dateTimePicker',
),
'format' => 'YYYY-MM-DD HH:mm',
'date_format'=>"dd/MM/yyyy hh:mm",
'html5' => false,
)
);
}
/**
* @param FormView $view
* @param FormInterface $form
* @param array $options
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars = array_replace($view->vars, array(
'empty_data' => $options['empty_data'],
'widget' => $options['widget'],
'format' => $options['date_format'],
));
}
/**
* @return string
*/
public function getName()
{
return 'date_time_picker';
}
}
Я пробовал много разных вариантов для резольвера. Если я удаляю «new \ DateTime ()» в «empty_data», моя форма теперь отправляет null
значение, и я получаю хорошую ошибку SQL при попытке вставить ноль в базу данных.
Фрагмент form_template.html.twig :
{% block date_time_picker_widget %}
<div class='input-group date' id='date-time-picker-{{ id }}'>
<input type="text" class="form-control" />
<span class="input-group-addon"><i class="fa fa-clock-o"></i></span>
</div>
{% include 'VMSFormTypeBundle:Template:date_time_picker_script.html.twig' %} {# link to the direct js script to make it datetimepicker #}
{% endblock %}
В date_time_picker_script.html.twig :
{% autoescape false %}
<script type="text/javascript">
$(function () {
$('#date-time-picker-{{ id }}').datetimepicker();
});
</script>
{% endautoescape %}
Фрагмент моего Конструктор форм :
$builder
->add('startDate','date_time_picker')
заранее спасибо
РЕДАКТИРОВАТЬ : Просто заметил, что дата и время, отправленные формой, игнорируют то, что я выбрал, и вместо этого отправляет текущее время (текущий день, час и минуту).
Видимо, это потому, что необходимо преобразовать формат времени между PHP и JS. Я исправил проблему, используя только DateType (время не было необходимым).
Это может быть полезно для тех, кому все еще нужен DateTime, хотя я не проверял его: https://github.com/stephanecollot/DatetimepickerBundle
Других решений пока нет …