У меня есть сущность, которая описывает школу и связана с другой сущностью, которая описывает «Стадию» с ассоциацией 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;
}
Итак, в этот момент я подумал добавить событие POST_SUBMIT в поле «ParticipSchoolRegion», чтобы динамически заполнить «ParticipSchoolDistrict» следующим образом:
$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);
}
);
И так до тех пор, пока школа не будет выбрана. В конце процесса я хочу, чтобы только идентификатор выбранной школы был сохранен в базе данных под полем «Школа».
Но мне кажется, что я не могу передать значение из выбранного региона в метод «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...
Я надеюсь, что я достаточно ясно, спасибо за помощь.
Задача ещё не решена.
Других решений пока нет …