Дата после другой даты в форме 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';
    }
}
Author: Ayhem, 2017-07-08

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

 1
Author: Vadim Ashikhman, 2017-07-08 10:25:04