symfony – 扩展EntityType以允许使用AJAX调用设置额外的选项
我尝试创建一个扩展核心“实体”类型的Symfony Custom类型.
但我想在Select2版本4.0.0中使用它(ajax现在可以使用“select”html元素,而不像以前那样使用隐藏的“输入”). >此类型应通过扩展“实体”类型创建空选择而不是完整实体列表. 这可以通过设置选项(请参阅configureOption)来实现: 'choices'=>array() >通过编辑附加到表单的对象,它应该使用对象的当前数据填充select.我解决了这个问题,但只是为了使用以下buildView方法的视图… Select2识别html“select”的内容,并使用ajax工作. SymfonyComponentFormExceptionTransformationFailedException Unable to reverse value for property path "user": The choice "28" does not exist or is not unique 我尝试了几种使用EventListeners或Subscribers的方法,但我找不到工作配置. 使用Select2 3.5.*我解决了表单事件的问题并覆盖了隐藏的formtype,但是这里扩展实体类型要困难得多. 如何构建我的类型以让它管理我的entites的逆向转换? 自定义类型: <?php namespace AppBundleFormType; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentFormFormView; use SymfonyComponentFormFormInterface; use SymfonyComponentOptionsResolverOptionsResolver; use SymfonyComponentFormChoiceListViewChoiceView; class AjaxEntityType extends AbstractType { protected $router; public function __construct($router) { $this->router = $router; } /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder,array $options) { $builder->setAttribute('attr',array_merge($options['attr'],array('class'=>'select2','data-ajax--url'=>$this->router->generate($options['route'])))); } /** * {@inheritdoc} */ public function buildView(FormView $view,FormInterface $form,array $options) { $view->vars['attr'] = $form->getConfig()->getAttribute('attr'); $choices = array(); $data=$form->getData(); if($data instanceOf DoctrineORMPersistentCollection){$data = $data->toArray();} $values=''; if($data != null){ if(is_array($data)){ foreach($data as $entity){ $choices[] = new ChoiceView($entity->getAjaxName(),$entity->getId(),$entity,array('selected'=>true)); } } else{ $choices[] = new ChoiceView($data->getAjaxName(),$data->getId(),$data,array('selected'=>true)); } } $view->vars['choices']=$choices; } /** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $resolver->setRequired(array('route')); $resolver->setDefaults(array('choices'=>array(),'choices_as_value'=>true)); } public function getParent() { return 'entity'; } public function getName() { return 'ajax_entity'; } } 父表格 <?php namespace AppBundleForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class AlarmsType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder,array $options) { $builder ->add('name','text',array('required'=>false)) ->add('user','ajax_entity',array("class"=>"AppBundle:Users","route"=>"ajax_users")) ->add('submit','submit'); } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array('data_class' => 'AppBundleEntityAlarms','validation_groups'=>array('Default','form_user'))); } /** * @return string */ public function getName() { return 'alarms'; } }
问题解决了.
解决方案是在PRE_SET_DATA和PRE_SUBMIT FormEvents中使用’choices’=> $selectedChoices重新创建表单字段. 可以使用$event-> getData()从事件中重新选择所选内容 看看我创建的包,它实现了这个方法: Alsatian/FormBundle – ExtensibleSubscriber (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |