0

動的フォームに対して次のプロセスを実行しようとしています。

  1. ユーザーが学校を選択
  2. 次に、その学校にリンクされているすべての「成績」を取得する必要があります。

このフォームで達成しようとしているのは、学年にリンクされた新しい「クラス」(学校のクラスのように) を作成することです。問題は (私が思うに、以下で説明するように)、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,
                ));
            }
        );

どんな助けでも大歓迎です!

4

1 に答える 1

0

フォームイベントは、javascript を使用する必要がある別のフィールドの機能でフィールドにデータを入力しません。

ただし、検証プロセスに合格したい場合は、ドキュメントにある describe のようなフォーム イベントを使用する必要があります。

于 2013-11-09T23:12:44.867 に答える