php - symfony 形式的另一个日期之后的日期

标签 php symfony date symfony-forms symfony-3.3

我有一个包含 2 个日期的表单:开始日期 (datedebut) 和结束日期 (datefin)。 我希望结束日期始终在开始日期之后。我该怎么做?

我的表单类型:

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';
    }
}

最佳答案

您可以使用 Callback Validator为了这。注入(inject)该回调的是一个 ExecutionContextInterface,您可以通过它访问表单,从而访问其他表单参数。

这是一个例子:

use Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

// …

$builder
    ->add('start', 'datetime', 
        'constraints' => [
            new Constraints\NotBlank(),
            new Constraints\DateTime(),
        ],
    ])
    ->add('stop', 'datetime', [
        'constraints' => [
            new Constraints\NotBlank(),
            new Constraints\DateTime(),
            new Constraints\Callback(function($object, ExecutionContextInterface $context) {
                $start = $context->getRoot()->getData()['start'];
                $stop = $object;

                if (is_a($start, \DateTime::class) && is_a($stop, \DateTime::class)) {
                    if ($stop->format('U') - $start->format('U') < 0) {
                        $context
                            ->buildViolation('Stop must be after start')
                            ->addViolation();
                    }
                }
            }),
        ],
    ]);

关于php - symfony 形式的另一个日期之后的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44983045/

相关文章:

php - 如何在我的网站上获取用户的国家标志

php - HTML 中的复选框不起作用。单击复选框时没有任何反应。如何让它发挥作用?

mongodb - Symfony2 + DoctrineMongoDBBundle 配置

javascript - 使用开始月份和结束月份的时刻获取一系列月份

php - Android - 将数据从 acra 发送到 php 脚本

php - 如何生成好的盐——我的函数是否足够安全?

php - 可重用包的 Symfony2/Doctrine2 模型类映射

javascript - Webpack + Symfony encore - 如何添加库

java - 字符串到日期解析不起作用

PHP Zend 日期格式