動的フォームに対して次のプロセスを実行しようとしています。
- ユーザーが学校を選択
- 次に、その学校にリンクされているすべての「成績」を取得する必要があります。
このフォームで達成しようとしているのは、学年にリンクされた新しい「クラス」(学校のクラスのように) を作成することです。問題は (私が思うに、以下で説明するように)、SchoolClass オブジェクトは School オブジェクトについては認識せず、Grade オブジェクトについてのみ認識していることです。関連するコードのみを投稿します...
学校のクラス
/**
* @ORM\OneToMany(targetEntity="Grade", mappedBy="school")
*/
private $grades;
public function __construct()
{
$this->grades = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add grades
*
* @param \MyBundle\MainBundle\Entity\Grade $grades
* @return School
*/
public function addGrade(\MyBundle\MainBundle\Entity\Grade $grades)
{
$this->grades[] = $grades;
return $this;
}
/**
* Remove grades
*
* @param \MyBundle\MainBundle\Entity\Grade $grades
*/
public function removeGrade(\MyBundle\MainBundle\Entity\Grade $grades)
{
$this->grades->removeElement($grades);
}
/**
* Get grades
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getGrades()
{
return $this->grades;
}
グレードクラス
/**
* @var School
*
* @ORM\ManyToOne(targetEntity="School", inversedBy="grades")
* @ORM\JoinColumn(name="school_id", referencedColumnName="id")
*/
private $school;
/**
* @ORM\OneToMany(targetEntity="SchoolClass", mappedBy="grade")
*/
private $schoolClasses;
//Getters and setters for school come here, leaving them out as they are the usual...
/**
* Constructor
*/
public function __construct()
{
$this->schoolClasses = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get schoolClasses
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getSchoolClasses()
{
return $this->schoolClasses;
}
/**
* Add schoolClasses
*
* @param \MyBundle\MainBundle\Entity\SchoolClass $schoolClasses
* @return Grade
*/
public function addSchoolClasse(\MyBundle\MainBundle\Entity\SchoolClass $schoolClasses)
{
$this->schoolClasses[] = $schoolClasses;
return $this;
}
/**
* Remove schoolClasses
*
* @param \MyBundle\MainBundle\Entity\SchoolClass $schoolClasses
*/
public function removeSchoolClasse(\MyBundle\MainBundle\Entity\SchoolClass $schoolClasses)
{
$this->schoolClasses->removeElement($schoolClasses);
}
ところでremoveSchoolClasse()
andaddSchoolClasse()
関数は Doctrine によってそのように生成されますが、これはバグですか?
編集 - SchoolClass クラスを追加するのを忘れていました...
/**
* @var Grade
*
* @ORM\ManyToOne(targetEntity="Grade", inversedBy="schoolClasses")
* @ORM\JoinColumn(name="grade_id", referencedColumnName="id")
*/
private $grade;
/**
* Set grade
*
* @param Grade $grade
* @return SchoolClass
*/
public function setGrade($grade)
{
$this->grade = $grade;
return $this;
}
/**
* Get gradeId
*
* @return integer
*/
public function getGrade()
{
return $this->grade;
}
とにかく、Symfony docs のチュートリアルに従ってみましたが、うまくいかなかったので、フォームイベントの独自の実装を試みました。その重要な部分は次のとおりです。
$builder
->add('classDescription')
->add('school', 'entity', array(
'class' => 'MyBundleMainBundle:School',
'multiple' => false,
'mapped' => false,
));
//Add event listener for when user changes the school...
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) {
$form = $event->getForm();
//Here I tried my own implementation but obviously doesn't work as $school will be of type Form, am I correct?
$school = $form->get('school');
$grades = $school->getGrades();
$form->add('grade', 'entity', array(
'choices' => $grades,
));
}
);
どんな助けでも大歓迎です!