symfony2で動的フォームに問題が発生しました。私は提出されたフォームのいくつかのフィールドを生成しようとしています。言い換えれば、ユーザーはいくつかの値を入力し、フォームを送信し、これらの値に従って、私のダイナミクスフィールドがこの同じフォームに追加されます(これは明らかに2回目に表示されます)。これを行うには、私は料理からこの例を使用:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-datasymfony2がエラーのない動的フォームを無効にしました
だから、ここに私の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(),
);
}
私のダイナミックな分野の一つは、フォームが送信される初めてnullにすることはできませんので、それが有効にすることはできません。したがって、FormationTypeは2度目に読み込まれます。つまり、フィールド "type"が満たされている場合、私のformModifier()関数は動的フィールド(formationList)をロードできます。それまでは、すべてがうまくいきました。私は新しい分野を手に入れました。
しかし、フォームの2回目の「提出」後には何も起こりません。ページは再ロードされ、エラーは表示されません。
私は
var_dump($request->request->get('example_corebundle_formationtype'));
でフォームの内容を確認 - (動的なものを含む)すべてのフィールドは有効な値で満たされています>。
また、私はこれを試してみてください。
foreach($form->all() as $item) {
echo $item->getName();
var_dump($item->getErrors());
}
は - >これらの行でエラーが表示されません。しかし、フォームは決して有効ではありません。
- > falseを返します。したがって、フォームは無効です。
最後に、動的部分全体を削除すると、フォームが機能します。 何が問題なのか分かりません。フォームにエラーが表示されず、csrfトークンが正しく表示されます。私は何か見落としてますか ?ご協力いただきありがとうございます。
このコード行を削除すると、タイプの値が同じであれば、firebugで確認できますか?フォーム$ formModifierの 'choices' => $ formationList? – Cesc
hm ...あなたの意見は分かりません。 $ formModifierから 'choices' => $ formationListを削除しましたが、フィールド "type"に何も起こりません。これは、 'タイプ'が動的値のない選択であるために期待しています。 formationListフィールドはありましたが、まだリストになっています(数字は内の – TiPi
は、FormationListクラスの有効なID(指定した主キーを問わず)でなければなりません。そうでない場合、$ form-> isValid()はfalseになります。それは私の要点でしたが、$ formationListのリストがうまくいっていて、適切なIDを持っているはずです。それは単なる野生の推測だった。 – Cesc