このガイドを使用して、いくつかの埋め込みフォームを設定しようとしています。アプリケーションには、レッスンと評価の2つのモデルが設定されています。
各レッスンには複数の評価を含めることができます。
ユーザーがレッスンを作成し、そのレッスン内で必要な数の評価を作成できるフォームを設定しました。フォームが送信されると、レッスンレコードとすべての評価レコードが正常に作成されますが、作成される評価レコードは親レッスンにリンクされません(lesson_idフィールドは空白のままになります)。
誰か助けてもらえますか?
アドバイスをいただければ幸いです。
ありがとう。
私のモデルクラスは次のように設定されています。
評価:
class Evaluation
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Lesson", inversedBy="evaluations")
* @ORM\JoinColumn(name="lesson_id", referencedColumnName="id")
*/
protected $lesson;
/**
* Set lesson
*
* @param \LessonBundle\Entity\Lesson $lesson
* @return Evaluation
*/
public function setLesson(\LessonBundle\Entity\Lesson $lesson = null)
{
$this->lesson = $lesson;
return $this;
}
/**
* Get lesson
*
* @return \LessonBundle\Entity\Lesson
*/
public function getLesson()
{
return $this->lesson;
}
}
そしてレッスン:
class Lesson
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Evaluation", mappedBy="lesson", cascade={"persist"})
*/
protected $evaluations;
public function __construct()
{
$this->evaluations = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Add evaluations
*
* @param \DS\LessonBundle\Entity\Evaluation $evaluations
* @return Lesson
*/
public function addEvaluation(\LessonBundle\Entity\Evaluation $evaluations)
{
$this->evaluations[] = $evaluations;
return $this;
}
/**
* Remove evaluations
*
* @param \DS\LessonBundle\Entity\Evaluation $evaluations
*/
public function removeEvaluation(\LessonBundle\Entity\Evaluation $evaluations)
{
$this->evaluations->removeElement($evaluations);
}
/**
* Get evaluations
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getEvaluations()
{
return $this->evaluations;
}
public function setEvaluations(ArrayCollection $evaluations)
{
foreach ($evaluations as $evaluation) {
$evaluation->setLesson($this);
}
$this->evaluations = $evaluations;
}
}
私のコントローラーメソッド:
public function newAction()
{
$lesson = new Lesson;
$evaluation1 = new Evaluation();
$lesson->getEvaluations()->add($evaluation1);
$form = $this->createForm(new LessonType(), $lesson);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getEntityManager();
$em->persist($lesson);
$em->flush();
return $this->redirect($this->generateUrl('lesson_list'));
}
}
return $this->render('LessonBundle:Lesson:new.html.twig', array('form' => $form->createView()));
}
そして私のフォーム:
class LessonType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('evaluations', 'collection', array(
'type' => new EvaluationType(),
'allow_add' => true,
'by_reference' => false,
));
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'LessonBundle\Entity\Lesson',
);
}
public function getName()
{
return 'Lesson';
}
}
と:
class EvaluationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('report');
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'LessonBundle\Entity\Evaluation',
);
}
public function getName()
{
return 'Evaluation';
}
}
そして最後に、私のフォームの小枝テンプレート:
{% extends '::base.html.twig' %}
{% block content %}
<form class="vertical" action="" method="post" {{ form_enctype(form) }}>
{{ form_errors(form) }}
<ul class="collectionholder" data-prototype="{{ form_widget(form.evaluations.vars.prototype)|e }}">
{% for evaluation in form.evaluations %}
<li>{{ form_row(evaluation) }}</li>
{% endfor %}
</ul>
{{ form_rest(form) }}
<input type="submit" />
</form>
{% endblock %}