Для формы мне нужен набор сущностей, поэтому используйте другую форму, которая с помощью прототипа позволяет мне добавлять и удалять элементы.
Проблема в том, что мне нужен прототип Symfony для генерации моих новых, но когда у меня есть «prototype = true», тогда event-> getData () возвращает null каждый раз.
в общем виде:
->add('profils', CollectionType::class,
array('entry_options' => ['entity_manager' => $this->em],
'entry_type' => ProfilType::class,
'prototype' => true, 'allow_add' => true, 'allow_delete' => true))
profilType (подформа):
class ProfilType extends AbstractType {
private $em;
public function buildForm(FormBuilderInterface $builder, array $options) {
$this->em = $options['entity_manager'];
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
$builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit'));
}
protected function addElement(FormInterface $form, Domaine $domaine = null) {
$form->add('fkDomaine', EntityType::class, array(
'class' => 'PDFRecrutementBundle:Domaine',
'choice_label' => 'doLibelle',
'multiple' => false,
'required' => true,
'placeholder' => 'Domaine',
'attr' => array(
'class' => 'select-domaine'
)
));
$sousDomaines = array();
if ($domaine) {
$repoSousDomaine = $this->em->getRepository('PDFRecrutementBundle:Sousdomaine');
$sousDomaines = $repoSousDomaine->createQueryBuilder("q")
->where('q.fkDomaine = :domaineId')
->setParameter('domaineId', $domaine->getDoId())
->getQuery()
->getResult();
}
$form->add('fkSousDomaine', EntityType::class, array(
'class' => 'PDFRecrutementBundle:Sousdomaine',
'choice_label' => 'sdLibelle',
'multiple' => false,
'required' => true,
'choices' => $sousDomaines,
'placeholder' => 'Sous domaine',
'attr' => array(
'class' => 'select-sousdomaine'
)
));
}
function onPreSetData(FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
$domaine = $data->getFkDomaine() ? $data->getFkDomaine() : null;
$this->addElement($form, $domaine);
}
function onPreSubmit(FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$domaine = $this->em->getRepository('PDFRecrutementBundle:Domaine')->find($data['fkDomaine']);
$this->addElement($form, $domaine);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'PDF\RecrutementBundle\Entity\Profil'
));
$resolver->setRequired('entity_manager');
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix() {
return 'pdf_recrutementbundle_profil';
}
}
Если я оставляю prototype = true, я получаю ошибку:
Вызов функции-члена в null
поэтому мне нужно иметь прототип в true и event-> getData (), который не возвращает ноль, вы знаете, как это сделать?