学校を説明するエンティティがあり、1 つの学校 -> 多くのステージの関連付けを持つ「ステージ」を説明する別のエンティティに関連付けられています。
学校には次の分野があります(関連する分野/方法のみをリストします):
namespace A4U\DataBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
class StuAnagScuole
{
.
.
.
private $citta;
private $provincia;
private $regione;
/**
* @ORM\OneToMany(targetEntity="A4U\FormBundle\Entity\Stage", mappedBy="attendedSchool")
*/
protected $stages;
public function __construct()
{
$this->stages = new ArrayCollection();
}
.
.
.
}
Stage エンティティは次のようになります。
namespace A4U\FormBundle\Entity;
class Stage
{
.
.
.
/**
* @ORM\ManyToOne(targetEntity="A4U\DataBundle\Entity\StuAnagScuole", inversedBy="stages")
* @ORM\JoinColumn(name="attendedSchool_id", referencedColumnName="idRecord")
*/
protected $attendedSchool;
.
.
.
}
ユーザーがステージに登録できるフォームを作成しました。ある時点で、ユーザーはデータベースに保存されている学校のリストから通った学校を入力する必要があります。
7000 以上の学校があるため、それらをフィルタリングする必要があります。
1) 最初にユーザーが地域を選択します
2) 次に、彼は地区を選択します
3) 次に都市
4) そして最後に学校
だから私は「フィルター」のそれぞれにエンティティフィールドを追加することを考えました(最初のものはそのようなものです):
->add('attendedSchoolRegion', 'entity', array(
/*
usando mapped false si dice a simfony che il campo non deve essere scritto
nell'entità
*/
'mapped' => false,
'label' => 'Regione della scuola*',
'class' => 'A4UDataBundle:StuAnagScuole',
'query_builder' => function(EntityRepository $er) {
return $er->getRegioni();
},
'property' => 'regione',
'attr' => array(
'class' => 'form-control',
'placeholder' => 'Campo di studi'
)
))
エンティティ リポジトリで:
/**
* Get Regioni
*
* @return array
*/
public function getRegioni()
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('s0')
->from('A4UDataBundle:StuAnagScuole', 's0')
->groupBy('s0.regione');
return $qb;
}
したがって、この時点で、「attendedSchoolRegion」フィールドに POST_SUBMIT イベントを追加して、「attendedSchoolDistrict」を次のように動的に設定することを考えました。
$addDistrict = function (FormInterface $form, StuAnagScuole $attendedSchoolRegion)
{
//$districts = $attendedSchoolRegion->getProvincie($attendedSchoolRegion);
$form->add('attendedSchoolDistrict', 'entity', array(
'mapped' => false,
'label' => 'Provincia della scuola di provenienza*',
'class' => 'A4UDataBundle:StuAnagScuole',
'query_builder' => function(EntityRepository $er) {
return $er->getProvincie($attendedSchoolRegion);
},
'property' => 'provincia',
'attr' => array(
'class' => 'form-control',
)
));
};
$builder->get('attendedSchoolRegion')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($addDistrict){
$attendedSchoolRegion = $event->getForm()->getData();
$addDistrict($event->getForm()->getParent(), $attendedSchoolRegion);
}
);
など、学校が選ばれるまで続きます。プロセスの最後に、選択した学校の ID だけを DB のフィールドattendedSchool の下に保持したいと考えています。
しかし、選択した地域の値を「getProvincie」メソッドに渡すことができないようです。
エラーは次のとおりです。
Catchable Fatal Error: Argument 2 passed to A4U\FormBundle\Form\Type\StageType::A4U\FormBundle\Form\Type\{closure}() must be an instance of A4U\DataBundle\Entity\StuAnagScuole, none given...
助けてくれてありがとう。