5

symfony2 の動的フォームで問題が発生しました。送信されたフォームのいくつかのフィールドを生成しようとしています。つまり、ユーザーがいくつかの値を入力し、フォームを送信すると、これらの値に従って、動的フィールドがこの同じフォームに追加されます (明らかに、2 回目に表示されます)。そのために、クックブックのこの例を使用しました: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data

だから、ここに私の FormationType クラスがあります

class FormationType extends AbstractType
{

private $em;
private $context;

public function __construct($em, $context) {
    $this->em = $em;
    $this->context = $context;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('date')
        ->add('type', 'choice', array(
            'mapped' => false,
            'choices' => Formationlist::getTypeTypes(false),
            'empty_value' => false,
        ))
        ->add('cost')
        ->add('travelCost')
        ->add('maximum')
        ->add('location')
        ->add('schedule')
    ;

    $formModifier = function(FormInterface $form, $type) {
        $formationList = $this->em->getRepository('CoreBundle:FormationList')->findBy(array("year" => 1, "type" => $type));

        $form->add('formationList', 'entity', array(
            'label'=> 'Titre formation', 
            'choices' => $formationList, 
            'class' => 'CoreBundle:FormationList', 
            'property' => 'title',)
                );

        };


    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($formModifier) {

            $data = $event->getForm();
            $type = $data->get('type')->getData();

            $formModifier($event->getForm(), $type);

        }
    );

    $builder->get('type')->addEventListener(
        FormEvents::POST_SUBMIT,
        function(FormEvent $event) use ($formModifier) {

            $type = $event->getForm()->getData();
            $formModifier($event->getForm()->getParent(), $type);
        }
    );
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'EXAMPLE\CoreBundle\Entity\Formation'
    ));
}

public function getName()
{
    return 'example_corebundle_formationtype';
}
}

したがって、2 つの addEventListener は非常にうまく機能します。フォームが初めて表示されたときに、予想どおり、formModifier のフィールドが読み込まれません。私のコントローラークラスは次のとおりです。

public function createAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $contextSrv = $this->get('example.service.context');
    $context = $contextSrv->getContext();

    $entity  = new Formation();
    $form = $this->createForm(new FormationType($em, $context), $entity);
    $form->bind($request);

    if ($form->isValid()) {

        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('formation_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

動的フィールドの 1 つを null にすることはできないため、フォームが初めて送信されたときに有効になりません。そのため、FormationType は 2 回目に読み込まれます。つまり、フィールド「タイプ」が入力されている場合、formModifier() 関数は動的フィールド (formationList) をロードできます。そこまでは、すべてがうまく機能し、新しいフィールドを手に入れました。

しかし、フォームで 2 回目の「送信」を行った後、何も起こりません。ページがリロードされるだけで、エラーは表示されません。

フォームの内容を確認しました

var_dump($request->request->get('example_corebundle_formationtype'));

-> すべてのフィールド (動的フィールドを含む) に有効な値が入力されます。

私もこれを試します:

foreach($form->all() as $item) {
       echo $item->getName();
        var_dump($item->getErrors());
}

-> これらの行はエラーを表示しません。ただし、フォームは決して有効ではありません。

var_dump($form->isValid());

→ false を返します。したがって、フォームは無効です。

最後に、動的部分全体を削除すると、フォームが機能します。何が悪いのかわかりません。フォームにエラーは表示されず、csrf トークンは正しいようです。私は何か見落としてますか ?ご協力いただきありがとうございます。

4

3 に答える 3

1

私はこれが少し時代遅れであることを知っていますが、Google ではかなり高く評価されています。

getErrors() メソッドは、基になるフィールドのエラー メッセージではなく、フォームのグローバル エラーのみを返します。フォームに埋め込みフォームを使用する場合は、getErrors(true) またはより洗練されたメソッドが必要です。詳細については、 https : //knpuniversity.com/blog/symfony-debugging-form-errorsを参照してください。

于 2016-01-29T11:47:29.933 に答える
1

フォームのどこかに検証エラーがある可能性があります。

Form::getErrors()への複雑な呼び出し( 2 番目のレベルよりも深いフィールドのエラーは表示されないため、完全に再帰的ではない) の代わりに、 Form::getErrorsAsString() を使用する必要があります

これは、あなたのような開発者のために Symfony の連中が作成したデバッグ メソッドであり、複雑なフォームのどこに検証エラーが存在する可能性があるかを理解しようとしています。

エラーが表示されるはずなのに表示​​されない場合は、フォームのテーマ エラーである可能性があります。カスタム フォーム テーマを作成するときに、開発者がフィールドのエラー ブロックを上書きしたり、表示し忘れたりする可能性があります。

問題の別の原因として考えられるのは、フォームの一般的な表示です。{{ form_widget(form) }}を使用してフォームを表示すると、トップ フォームにバブルするエラーは表示されません。代わりに{{ form_row(form) }}を使用していることを確認してください。

于 2014-01-24T17:43:06.493 に答える