2

我确定这一定是一个 RTM 问题,但我必须在错误的地方寻找。在 symfony 1.4 中,我经常使用验证器回调。例如,检查开始日期和结束日期的顺序是否正确。我正在 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--)但我觉得那里不对。

有什么帮助吗?谢谢!

4

1 回答 1

7

我想您可以将表单事件用于此类事情;当然对于 Symfony2,所以我也假设 Silex?有一篇关于使用它生成动态表单的食谱文章:

http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

另一个 SO 问题中的一些有用细节:

Symfony2 表单事件的描述?

本可以发誓我之前曾与某人就此进行过如此讨论,但我找不到问题。不久前,我使用 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...'));
    }
});

希望这可以帮助 :)

于 2012-04-16T20:10:23.023 回答