在Symfony中,我在buildForm()
扩展类中有一个函数AbstractType
,我使用CollectionType
,我想要获取{{1}内的活动条目的值1}}数组:
这是我的代码:
entry_options
我希望用[fr'或'en'代替[active entry value],知道'description'(我用我的表单实体的属性)是一个包含'fr和'en的ArrayCollection ”。
所以它可以正确显示:'Français','Anglais'或'French','English'而不是'fr','en'作为标签。
有什么想法吗?
答案 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'
);