Symfony Form CollectionType,获取entry_options中活动条目的值

时间:2016-06-13 07:59:53

标签: forms symfony-forms symfony

在Symfony中,我在buildForm()扩展类中有一个函数AbstractType,我使用CollectionType,我想要获取{{1}内的活动条目的值1}}数组:

这是我的代码:

entry_options

我希望用[fr'或'en'代替[active entry value],知道'description'(我用我的表单实体的属性)是一个包含'fr和'en的ArrayCollection ”。

所以它可以正确显示:'Français','Anglais'或'French','English'而不是'fr','en'作为标签。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

根据发布的评论,这是解决方案,建议我在自定义***类型上使用 EventListener:

我创建了一个新类型(NB:TexareaType可以用TextType切换):

   <?php
    namespace MyBundle\Form\Type;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\Form\FormEvent;

    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;


    class MultilangTextareaType extends AbstractType
    {

      public function buildForm(FormBuilderInterface $builder, array $options)
      {

            $builder->addEventListener(
                FormEvents::POST_SET_DATA,
                function (FormEvent $event) {
                    $form = $event->getForm();

                   $mlta = $form->getViewData();
                    foreach($mlta as $mltaK => $mltaV){
                        $formOptions = array(
                            'label' => 'MyBundle.messages.language_name.'.$mltaK,
                            'constraints'=>array()
                        ); 

                        $form->add($mltaK, TextareaType::class, $formOptions);
                    }
                }
            );

      }


        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array());
        }

        public function getParent()
        {
            return CollectionType::class;
        }

        public function getBlockPrefix(){
            return 'multilang_textarea';
        }
    }

    ?>

然后buildForm()中的初始代码变为:

  if($options['data']->getDescription()->isEmpty()){
      $options['data']->getDescription()->set('fr',null);
      $options['data']->getDescription()->set('en',null);
    }

    $builder->add('description',MultilangTextareaType::class,array(
     'label'=>'MyBundle.messages.description'
    );