Symfony2形成日期时间字段验证

时间:2014-11-01 19:29:12

标签: forms symfony datetime

在我的表单中,我有两个datetime字段:startDateendDatestartDate不能早于当前时间。 endDate不能早于或等于startDate,且距离startDate不能超过一个月。

所以我的问题是如何实现这些字段的验证?我是Symfony的新手,所以如果你能加上它的例子,我真的很感激。

我的表格:

<?php
namespace Atotrukis\MainBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Validator\Constraints as Assert;
class CreateEventFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text', [
                'constraints' =>[
                    new Assert\NotBlank([
                        'message' => "Renginio pavadinimas negali būti tuščias"
                    ]),
                    new Assert\Length([
                        'min' => "2",
                        'max' => "255",
                        'minMessage' => "Renginio pavadinimas negali būti trumpesnis nei {{ limit }} simboliai",
                        'maxMessage' => "Renginio pavadinimas negali būti ilgesnis nei {{ limit }} simboliai"
                    ])
                ]
            ])
            ->add('description', 'textarea', [
                'constraints' =>[
                    new Assert\NotBlank([
                        'message' => "Renginio aprašymas negali būti tuščias"
                    ]),
                    new Assert\Length([
                        'min' => "10",
                        'max' => "5000",
                        'minMessage' => "Renginio aprašymas negali būti trumpesnis nei {{ limit }} simbolių",
                        'maxMessage' => "Renginio aprašymas negali būti ilgesnis nei {{ limit }} simbolių"
                    ])
                ]
            ])
            ->add('startDate', 'datetime')
            ->add('endDate', 'datetime')
            ->add('map', 'text')
            ->add('city', 'entity', array(
                'class' => 'AtotrukisMainBundle:City',
                'property' => 'name',
                'constraints' =>[
                    new Assert\NotBlank([
                        'message' => "Pasirinkite miestą"
                    ])
                ],
                'empty_value' => 'Pasirinkite miestą',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('c')
                        ->addOrderBy('c.priority', 'ASC')
                        ->addOrderBy('c.name', 'ASC');
                },
            ))
            ->add('save', 'submit', array('label' => 'Sukurti'));
    }
    public function getName()
    {
        return 'createEventForm';
    }
}

2 个答案:

答案 0 :(得分:1)

我可以想出两种方法来实现你的要求。

第一种方法是创建一个类约束验证器。您可以按照类似问题here和sf2文档here

的章节来回答我的回答

第二种方法是使用Callback约束。例如,在CreateEventFormType类中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'constraints'=> 
              array(new Callback(array('methods'=>array(array($this, 'customFormValidation'))))),
    ));
}

public function customFormValidation($data, ExecutionContextInterface $context)
{
    if ($data['startDate'] && $data['endDate'] && $data['startDate'] > $data['endDate']) {
        $context->addViolationAt('startDate', 'your constraint message here');
    }
}

答案 1 :(得分:0)

SF3 / Silex2更新(我知道SF2的问题) 此代码适用于Silex,但唯一的区别是构建器工厂函数和渲染内容。

    $form = $app->namedForm('form', $data, [
        'constraints' => array(
            new Callback(function ($data, ExecutionContextInterface $context) {
                if ($data['to'] && $data['from'] && $data['to'] < $data['from']) {
           $context->buildViolation('error')->addViolation();
                }
            }),
        ),
    ])
        ->add('from', DateType::class)
        ->add('to', DateType::class)
        ->add('save', SubmitType::class)
        ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted()) {

        if ($form->isValid()) {
            // your submit stuff
            return $app->redirect($request->getUri());
        }
        // error validation does not dispay errors after a redirect
    }

    return $app['twig']->render('form.html.twig', [
        'form' => $form->createView(),
    ]);