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 トークンは正しいようです。私は何か見落としてますか ?ご協力いただきありがとうございます。