Событие коллекции форм Symfony-> getData () возвращает ноль - PullRequest
0 голосов
/ 26 июня 2018

Для формы мне нужен набор сущностей, поэтому используйте другую форму, которая с помощью прототипа позволяет мне добавлять и удалять элементы.

Проблема в том, что мне нужен прототип 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 (), который не возвращает ноль, вы знаете, как это сделать?

1 Ответ

0 голосов
/ 27 июня 2018

Вот рабочий пример по одному из наших проектов:

->add('subType', CollectionType::class, [
                    'entry_type' => MySubClassType::class,
                    'entry_options' => array ('label' => false),
                    'label' => 'Awesome label',
                    'allow_add' => true,
                    'allow_delete' => true,
                    'prototype' => true,
                    'prototype_name' => 0,
                    'attr' => [
                        'class' => 'hidden'
                    ]
                ]

А на ветке:

{{ form_widget(form.subtype.vars.prototype.text) }}

Даже работая таким образом, если для «subType» нет значения, оно будет нулевым, поэтому вам все равно придется контролировать это значение ...

...