4

いくつかのサブフォームを含む複雑なフォームがあり、メインフォームで選択したラジオボタンに応じて、各サブフォームを個別に検証できるようにしたいと考えています。私は検証グループでこれを達成したかった。

注:data_classモデルはありません。アレイを使用しています。

これが私のフォームの簡略化です:

class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('xxx', 'text', array(
                'constraints' => array(
                    new Constraints\NotBlank(),
                ),
                'validation_groups' => array(
                    'xxx',
                )
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) {
                return array('xxx');
            },
        ));
    }
}

問題は、このフィールドの検証がトリガーされないことです。

setDefaultOptionsこれが機能する場合、送信されたデータに応じて、目的のグループを検証するように簡単に変更できます。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function(FormInterface $form) {
            $data = $form->getData();

            return array($data['type']);
        },
    ));
}

何か案が?

4

1 に答える 1

12

フォーム自体ではなく、検証グループ名を制約に渡す必要があります。フォームにグループ名を割り当てることにより、検証で使用する制約を指定します。

交換

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(),
        ),
        'validation_groups' => array(
            'xxx',
        )
    ))
;

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(array(
                'groups' => 'xxx'
            )),
        ),
    ))
;

デフォルトでは、制約には「デフォルト」(大文字)グループがあり、フォームはこのグループを使用して、何も指定されていないかどうかを検証します。明示的なグループのない他の制約を検証する場合は、指定されたグループとともに「デフォルト」の制約を渡します。

$resolver->setDefaults(array(
    'validation_groups' => function(FormInterface $form) {
        $data = $form->getData();

        return array($data['type'], 'Default');
    },
));
于 2012-11-02T17:28:49.073 に答える