在我的表单中,我有两个datetime
字段:startDate
和endDate
。 startDate
不能早于当前时间。 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';
}
}
答案 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(),
]);