我尝试创建一个扩展核心“实体”类型的Symfony Custom类型.
原文链接:https://www.f2er.com/ajax/160211.html但我想在Select2版本4.0.0中使用它(ajax现在可以使用“select”html元素,而不像以前那样使用隐藏的“输入”).
>此类型应通过扩展“实体”类型创建空选择而不是完整实体列表.
这可以通过设置选项(请参阅configureOption)来实现:
'choices'=>array()
>通过编辑附加到表单的对象,它应该使用对象的当前数据填充select.我解决了这个问题,但只是为了使用以下buildView方法的视图…
Select2识别html“select”的内容,并使用ajax工作.
但是当表单被回发时,Symfony无法识别所选择的选项,(因为没有被允许?)
Symfony\Component\Form\Exception\TransformationFailedException 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 AppBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormView; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\ChoiceList\View\ChoiceView; 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 \Doctrine\ORM\PersistentCollection){$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 AppBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; 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' => 'AppBundle\Entity\Alarms','validation_groups'=>array('Default','form_user'))); } /** * @return string */ public function getName() { return 'alarms'; } }