我在项目中使用*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 template
和dump()
值变量 - >空。确定。
我也抛弃了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中定位了国家实体。奇怪的复制/粘贴。