我确定这必须是RTM问题,但我必须在错误的地方寻找。在symfony 1.4中,我使用了post validator回调函数。例如,检查开始日期和结束日期的顺序是否正确。我正在开发Silex中的应用程序,但无法弄清楚如何添加类似的功能作为验证器。这就是我正在使用的(基本上):
$app['form.example'] = function ($app) {
$constraints = new Assert\Collection(array(
'date1' => new Assert\Date(),
'date2' => new Assert\Date(),
));
$builder = $app['form.factory']->createNamedBuilder('form', 'example', array(), array('validation_constraint' => $constraints));
return $builder
->add('date1', 'date')
->add('date2', 'date')
->getForm();
};
我可以将自己的验证测试放在“过程表单”部分,例如:if ($form->isValid() && --my datetest--)
,但它对我来说不合适。
有任何帮助吗?谢谢!
答案 0 :(得分:7)
我猜你可以使用表格事件来做这种事情;当然对于Symfony2,所以我也假设Silex?有一篇关于使用它来生成动态表单的食谱文章:
http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html
另一个SO问题中的一些有用的细节:
Description of Symfony2 form events?
我可以发誓我之前和某人讨论过这个问题,但我找不到问题。我曾使用BIND_CLIENT_DATA计算某些代码中的某些表单字段;我会看看我是否可以把它挖出来。
修改强>
好的,我发现了一些东西,但我正在修改Symfony代码中的内容,所以我不是100%就此,但它可能是一个起点(我希望):
$builder->addEventListener(FormEvents::BIND_NORM_DATA, function($event) {
// your form data
$data = $event->getData();
// get date objects - if you cannot dereference this way try getters
$d1 = $data['date1'];
$d2 = $data['date2'];
// naive comparison :)
$isCorrectDateOrder = $d1->getTimestamp() < $d2->getTimestamp();
// check the comparison
if (!$isCorrectDateOrder) {
// trouble... create and add a FormError object to the form
$event->getForm()->get('date1')->addError(new \Symfony\Component\Form\FormError('uh oh...'));
}
});
希望这会有所帮助:)