Ajax で送信したいこのフォームがあります。通常、これは非常に簡単に実行できますが、現在では埋め込みコレクションが正しく処理されていません。これは残念なことです。
回答のコレクションで質問を作成できるフォームがあります。フォームは次のように作成されます。
{{ form_start(form, {'attr':{'class': 'form-horizontal', 'id': 'form'}}) }}
<div class="form-group">
{{ form_label(form.question, null, { 'label_attr': {'class': 'col-lg-2 control-label'} }) }}
<div class="col-lg-5">
{{ form_widget(form.question, { 'attr': {'class': 'form-control'} }) }}
</div>
</div>
{% for answer in form.answers %}
<div class="form-group">
{{ form_label(answer.answer, 'Answer '~loop.index, { 'label_attr': {'class': 'col-lg-2 control-label'} }) }}
<div class="col-lg-5">
{{ form_widget(answer.answer, { 'attr': {'class': 'form-control'} }) }}
</div>
</div>
{% endfor %}
<div class="col-lg-8"><input class="btn btn-primary pull-right" type="submit" /></div>
{{ form_end(form) }}
フォームを送信するために、次の小さな JavaScript を用意しました。
$('#form').submit( function() {
$.ajax({
type: "POST",
url: "{{ url('questionCreateSubmit') }}",
data: $(this).serialize(),
success: function(data) {
alert(data);
}
});
return false;
});
今私のコントローラでは、これが正しく処理されているかどうかをテストするためにこれを持っています:
/**
* @Route("/questions/create/submit", name="questionCreateSubmit")
*/
public function questionCreateSubmitAction(Request $request)
{
$question = new Question();
$form = $this->createForm(new QuestionType(), $question);
$form->handleRequest($request);
die( var_dump( $form->getData() ) );
ただし、質問属性のみを設定し、回答のコレクションを無視します。これが返されます。
(
[id:Acme\DemoBundle\Entity\Question:private] =>
[question:Acme\DemoBundle\Entity\Question:private] => dfsdf
[answers:Acme\DemoBundle\Entity\Question:private] => Doctrine\Common\Collections\ArrayCollection Object
(
[_elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
(
)
)
)
$_POST 変数をダンプして確認すると、次のような配列構造が明確に示されます。
(
[question] => Array
(
[question] => dfsdf
[answers] => Array
(
[0] => Array
(
[answer] => sdfsdf
)
[1] => Array
(
[answer] => dsfds
)
[2] => Array
(
[answer] => fsdfsdf
)
)
[_token] => cf8781508d9002504455472d676acb1073888e67
)
)
コレクションが自動的に入力される方法はありますか、または回答配列を繰り返し処理して質問オブジェクトに入力することで、すべて自分で行う必要がありますか?
助けていただければ幸いです。