Дата после другой даты в форме symfony
У меня есть форма, содержащая 2 даты: дата начала (дата начала) и дата окончания (дата окончания). Я хочу, чтобы дата окончания всегда была после даты начала. Как я могу это сделать?
Мой тип формы:
class ReservationType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('datedebut',DateType::class,array(
'widget' => 'choice',
'years' => range(date('Y'), date('Y')+20),
))
->add('datefin',DateType::class,array(
'widget' => 'choice',
'years' => range(date('Y'), date('Y')+20),
))
->add('nbplaces')
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Bridge\TravelBundle\Entity\Reservation'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'Bridge_TravelBundle_Reservation';
}
}
1 answers
Обычно такого рода задачи решаются путем добавления ограничений проверки, чтобы проверить, больше ли значение одного поля, чем другого. Реализуйте ограничение проверки callback
, как указано в документации: http://symfony.com/doc/current/reference/constraints/Callback.html Вы также можете создать свой собственный валидатор ограничений класса и разместить там логику проверки: http://symfony.com/doc/current/validation/custom_constraint.html
Таким образом, всякий раз, когда пользователь пытается отправить значение datefin
, которое меньше выбранного значения datedebut
, он увидит ошибку проверки, и форма не будет обработана.
После этого вы всегда можете добавить некоторый код javascript, который будет фильтровать доступные даты в поле datefin
после изменения значения в поле datedebut
.
Также вы можете использовать динамическую модификацию формы для отображения второго поля даты (и фильтрации доступных дат на стороне сервера), только если отправлено значение первого. Проверьте это: http://symfony.com/doc/current/form/dynamic_form_modification.html