验证日期是否大于或等于另一个日期,没有实体

时间:2014-08-19 12:06:29

标签: validation date symfony comparison

我构建了一个与任何实体无关的表单。

class CalculatorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('debutActivite', 'date', array(
            'label' => 'Quand avez-vous commencé votre activité ?',
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'label_attr' => array(
                'class' => 'control-label',
            ),
            'attr' => array(
                'class' => 'form-control createDatepicker',
                'placeholder' => 'dd/mm/aaaa',
            ),
            'required' => true,
        ))
        ->add('demandeAccreAccepteeDate', 'date', array(
            'label' => 'A quelle date a-t-elle été acceptée ?',
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'label_attr' => array(
                'class' => 'control-label',
            ),
            'attr' => array(
                'class' => 'form-control createDatepicker',
                'placeholder' => 'dd/mm/aaaa',
            ),
        ))
    }
}

在我的控制器中,我检查表单是否有效:

public function indexAction(Request $request)
{
    $form = $this->createForm(new CalculatorType(), array());

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();
    }
}

不需要“demandeAccreAccepteeDate”字段。但如果它不是空的,我想验证它是否大于或等于“debutActivite”字段。

如果知道我没有计算器实体,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

创建一个课程(你不需要坚持执行数据库)来保存你的日期

namespace Your\Bundle;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContextInterface;

class Daterange
{

    /**
     * @Assert\Date()
     */
    public $debutActivite;

    /**
     * @Assert\Date()
     */
    public $demandeAccreAccepteeDate;

    /**
     * @Assert\Callback
     */
    public function validate(ExecutionContextInterface $context)
    {
        // Do your checks
        if ( ($this->demandeAccreAccepteeDate != '') && 
               ($this->demandeAccreAccepteeDate < $this->debutActivite) ) {

            $context->addViolationAt(
                'demandeAccreAccepteeDate',
                'Date not valid. Is before debutActivite',
                array(),
                null
            );

        }

    }

}

将日期分配给表单

class CalculatorType extends AbstractType
{

    [..]

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Daterange',
        ));
    }

}

在你的控制器中以这种方式创建表单(在开头添加use Your\Bundle\Daterange

$form = $this->createForm(new CalculatorType(), new Daterange());