Symfony3 Tetranz / select2“无法反转属性路径的值”

时间:2016-10-21 08:51:59

标签: php symfony

我在项目中使用*tetranz/select2entity-bundle": "2.*"*来选择一个城镇(法语中的 commune )。由于法国有近40,000个城镇,因此Ajax是强制性的。但是Bundle并不是开箱即用的。

网上有几个线程似乎适合我的问题但是对我来说似乎没有一个线程,因为我是Symfony中的新用户,并且版本3没有完全记录。

在分析器中,我遇到了这个问题:

  

的Symfony \元器件\验证\ ConstraintViolation

     

对象(Symfony \ Component \ Form \ Form).children [address] .children [commune] = 30223

     

引起:Symfony \ Component \ Form \ Exception \ TransformationFailedException

     

无法反转属性路径“commune”的值:选项“30223”不存在或不唯一

     

引起:Symfony \ Component \ Form \ Exception \ TransformationFailedException

     

选项“30223”不存在或不唯一

所以这个错误意味着我的选择(Chambéry镇,ID 30223)不是表单构建中可用选项的一部分。好。但是捆绑包应该处理这个并在表单提交后显示选择。当我提交表单并收到此错误时,它不会显示我的选择。

所以,我所做的是入侵Twig field templatedump()值变量 - >空。确定。

我也抛弃了POST变量,以防万一,但是给定的发布变量完全符合我的选择。

所以,我读过线程建议使用表单事件和东西...但我还不够熟练,因为Bundle应该适用于SF3 ......也许我错过了什么?

修改

这是我的AddressType.php,其中定义了表单

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('country',        EntityType::class, [
            'label'        => 'address.country',
            'class'        => 'MRMyroleBundle:Country',
            'choice_label' => 'name',
            'query_builder' => function (CountryRepository $repo) {
                return $repo->createQueryBuilder('c')
                            ->where('c.actual = 1')
                            ->orderBy('c.cog', 'DESC') // Trick for France first
                            ->addOrderBy('c.name', 'ASC')
                    ;
            },
        ])

         // (...)

        ->add('town',           null,   [
            'label' => 'address.town',
            'required' => false,
        ])
        ->add('commune',        Select2EntityType::class, [
            'multiple' => false,
            'remote_route' => 'mr_ajax_commune_select',
            'class'        => 'MRMyroleBundle:Country',
            'primary_key' => 'id',
            'text_property' => 'name',
            'minimum_input_length' => 2,
            'page_limit' => 30,
            'allow_clear' => true,
            'delay' => 250,
            'cache' => true,
            'cache_timeout' => 60000, // if 'cache' is true
            'language' => 'fr',
            'placeholder' => 'Tapez les premières lettres de votre ville',
            'label'        => 'address.commune'
        ])

    ;
}

控制器侧:

“地址”实体是“生产”实体表格的一个字段:

// Add Production 
public function prodAddAction(Request $request)
{
    $production = new Production();

    $formBuilder = $this->get('form.factory')->createBuilder(FormType::class, $production);
    $formBuilder
        ->add('name',           TextType::class, [
            'label' => 'prod.name'
        ])
        // (...)
        ->add('address',     AddressType::class, [
            'label' => 'prod.address'
        ])
        ->add('save',           SubmitType::class)
    ;
    $form = $formBuilder->getForm();


    // Handle POST
    $handleRequest = $form->handleRequest($request);
    if ($request->isMethod('POST')){

        if( ! $handleRequest->isValid()){
            $request->getSession()->getFlashBag()->add('danger', "Une erreur a eu lieu. Merci de vérifier les champs ci-dessous :");
        }
        else{
            $em = $this->getDoctrine()->getManager();
            $em->persist($production);
            $em->flush();

            $request->getSession()->getFlashBag()->add('success', 'Votre maison de production a bien été enregistrée.');

            return $this->redirectToRoute('mr_homepage');
        }
    }

    return $this->render('ACMEBundle:Prod:prod-add.html.twig', [
        'form' => $form->createView()
    ]);
}

注意:我毫不怀疑Ajax返回的字符串是正常的,因为客户端处理完美,并在POST Vars中提交正确的ID。

编辑/解决方案:

对于遇到同样问题的人来说,捆绑是无辜的:我在“公社”字段中定位了错误的实体类 - 我在我的样本中的第25行AdressType中定位了国家实体。奇怪的复制/粘贴。

0 个答案:

没有答案