首页 文章

如何使用symfony动态修改表单(嵌套表单)?

提问于
浏览
0

我从这里跟着我的例子How to fill the dropdown list dynamically in symfony? (select the cities of the region)

我正在尝试创建一个嵌套的Form,在表单中嵌入一组表单 . 我有buildForm的问题 .

就我而言,我正在尝试为雇主(雇主)实体的公司(企业)实体选择该地区的城市 .

添加实体时遇到问题,在企业版的情况下也存在问题 .

When adding the Employer (Employeur) entity: (I can not display the add form)

此示例适用于某些实体(简单形式,而不是嵌套) .

但是当我用Employer实体尝试它时,我收到了这个错误:

在null上调用成员函数getVille()

堆栈跟踪:

FatalThrowableError Symfony \ Component \ Debug \ Exception \ FatalThrowableError:在GE \ CandidatBundle \ Form \ EntrepriseType-> GE \ CandidatBundle \的src \ GE \ CandidatBundle \ Form \ EntrepriseType.php:159上调用成员函数getVille()在call_user_func(对象(Closure),对象(FormEvent),'form.pre_set_data',对象(EventDispatcher))的形式(对象(FormEvent),'form.pre_set_data',对象(EventDispatcher))(vendor \ symfony \ Symfony \ src \ Symfony \ Component \ EventDispatcher \ EventDispatcher.php:212)在Symfony \ Component \ EventDispatcher \ EventDispatcher-> doDispatch(array(object(Closure)),'form.pre_set_data',object(FormEvent))(供应商\ symfony \ symfony \ src \ Symfony \ Component \ EventDispatcher \ EventDispatcher.php:44)在Symfony \ Component \ EventDispatcher \ EventDispatcher-> dispatch('form.pre_set_data',object(FormEvent))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ EventDispatcher \ ImmutableEventDispatcher.php:43)在Symfony \ Component \ EventDispatcher \ ImmutableEventDispatcher-> dispatch('form.pre_set_ Symfony \ Component \ Form \ Form-> setData(null)中的data',object(FormEvent))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:341)(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Extension \ Core \ DataMapper \ PropertyPathMapper.php:57)在Symfony \ Component \ Form \ Extension \ Core \ DataMapper \ PropertyPathMapper-> mapDataToForms(object(Employeur),object(RecursiveIteratorIterator))(供应商) \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:385)在Symfony \ Component \ Form \ Form-> setData(object(Employeur))(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ Form.php:489)在Symfony \ Component \ Form-> initialize()(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ FormBuilder.php:226)在Symfony \ Component \ Form \ FormBuilder- >在Symfony \ Component \ Form \ FormFactory-> create('GE \ CandidatBundle \ Form \ EmployeurType',object(Employeur)中的getForm()(vendor \ symfony \ symfony \ src \ Symfony \ Component \ Form \ FormFactory.php:30) ),array())(vendor \ symfony \ symfony \ src \ Symfony \ Bundle \ FrameworkBundle \ Controller \ Controll erTrait.php:331)在Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller-> createForm('GE \ CandidatBundle \ Form \ EmployeurType',object(Employeur))(src \ GE \ CandidatBundle \ Controller \ EmployeurController.php:44)在GE \ CandidatBundle \ Controller \ EmployeurController-> newAction(object(Request))at call_user_func_array(array(object(EmployeurController),'newAction'),array(object(Request)))

雇主实体:

class Employeur extends Utilisateur
{
    /**
     * @ORM\OneToOne(targetEntity="GE\CandidatBundle\Entity\Entreprise", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    protected $entreprise;
}

EntrepriseType:

$builder
            ->add('raisonSocial')
            ->add('region', EntityType::class, [
                'label' => 'Region *',
                'label_attr' => [
                    "class" => "smaller lighter blue",
                    "style" => "font-size: 21px;",
                ],
                'placeholder' => 'Sélectionnez une region',
                'class' => 'GECandidatBundle:Region',
                'choice_label' => 'nom',
                'multiple' => false,
                'query_builder' => function (RegionRepository $repository) {
                    return $repository->getListeRegion();
                }
            ])
            ->add('ville');
$formModifier = function (FormInterface $form, Region $region = null) {
            $villes = null === $region ? array() : $region->getVilles();
            $form->add('ville', EntityType::class, array(
                'label' => 'Ville *',
                'label_attr' => [
                    "class" => "smaller lighter blue",
                    "style" => "font-size: 21px;",
                ],
                'placeholder' => 'Sélectionnez une ville',
                'class' => 'GECandidatBundle:Ville',
                'choice_label' => 'nom',
                'choices' => $villes,
                'multiple' => false,
                'expanded' => false,
            ));
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
                $data = $event->getData();
                $formModifier($event->getForm(), $data->getVille());
            }
        );

        $builder->get('region')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                $region = $event->getForm()->getData();
                $formModifier($event->getForm()->getParent(), $region);
            }
        );

我的问题出在这一行:

$ formModifier($ event-> getForm(),$ data-> getVille());

为什么我的例子之前运作良好,现在已经不再适用了?

When modifying the Company (Entreprise) entity: (I can not display the edit form)

类型错误:参数2传递给GE \ CandidatBundle \ Form \ EntrepriseType :: GE \ CandidatBundle \ Form ()必须是GE \ CandidatBundle \ Entity \ Region的实例或null,Proxies__CG __ \ GE \ CandidatBundle \的实例实体\ Ville给出,在第159行的C:\ xampp \ htdocs \ GestionEmploi \ src \ GE \ CandidatBundle \ Form \ EntrepriseType.php中调用

这行有问题:

$ formModifier = function(FormInterface $ form,Region $ region = null)

也许我的问题在于EmployeurType:

$builder
->add('nom')
->add('prenom')
...
->add('entreprise', EntrepriseType::class);

1 回答

  • 0

    在PRE_DATA-SET事件上

    $event->getData() // can be null
    

    所以在调用$ data-> getVille()之前检查$ data!= null的代码

    $data = $event->getData(); 
    $ville = null; 
    if ($data != null) 
        $ville = $event->getData()->getVille();
    $formModifier($event->getForm(), $ville);
    

相关问题