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フォームイベントの説明?

私は以前誰かとこれについてSOの議論をしたと誓ったかもしれませんが、私は質問を見つけることができません。しばらく前に、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 に答える