2017-04-11 69 views
0

我扩展了ChoiceType以创建RolesType,其目标是提供多个可选择的应用程序自定义角色列表。编辑自己内部的自定义SF3类型

由于我的角色在config.yml定义,我不想通过它为每个RolesType使用,如:

$builder 
->add('authorizedRoles', RolesType::class, [ 
       'label' => static::ROOT_TRANSLATION_PATH . ".roles.label", 
       'multiple' => true, 
       'expanded' => false, 
       'roles_list' => $roles, 
       'attr' => [ 
        'helper' => static::ROOT_TRANSLATION_PATH . ".roles.helper", 
       ] 
      ]) 

相反,我试图通过初始化注射这种选择名单在角色类型构造角色列表:

public function __construct(array $rolesData) { 
     $this->rolesData = $rolesData; 

     foreach($this->rolesData as $roleId => $roleData) { 
      $this->rolesList[$roleData['label']] = $roleData['key']; 
     } 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->setAttribute('multiple', true); 
     $builder->setAttribute('expanded', false); 
     $builder->setAttribute('choices', $this->rolesList); 

     $options['multiple'] = true; 
     $options['expanded'] = false; 
     $options['choices'] = $this->rolesList; 

//  'multiple' => true, 
//  'expanded' => false, 
//  'choices' => $this->rolesList, 
    } 

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

你可以看到我失败attemps 行动的非常形式上。由于我总是想要我的角色,并且我总是希望多个和扩展选项具有相同的值,所以在此处做得更好(恕我直言)。

到目前为止,属性和选项导致失败。 我该如何在建造者(或其他形式的类别)中设置它?

+0

一个类似的例子你已经注册你表单类型服务(声明合适的标签)?你的意思是失败*吗?任何错误? –

+0

是的,我正确地将此表格注册为服务。我只是接受你的回答,在这里我完全忽略了关于configureOption目标的观点。 – nbonniot

回答

1

而不是buildForm,您可以将configureOptions中的选项设置为默认值。

尝试用它来代替buildForm,但要保持你的构造:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array( 
     'multiple' => true, 
     'expanded' => false, 
     'choices' => $this->rolesList, 
    )); 
} 

记住您注册自定义窗体类型与合适的标签与服务。

这可能是这样的:

services: 
    app.form.type.roles: 
     class: AppBundle\Form\Type\RolesType 
     arguments: 
      - '%rolesList%' 
     tags: 
      - { name: form.type } 

其实有一个在Symfony's Doc

+0

谢谢。 +1指向我错过的文档。 – nbonniot

0

你提出的想法已被弃用,并在Symfony的3

删除您可以添加一个新的选项,并通过从控制器角色数组。这是您在RoleType类中添加选项的方式。

public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefined(array('roles_list')); 
     $resolver->setAllowedTypes('roles_list', 'array'); 
    } 

你说:

选项导致失败

提供错误信息,如果这是行不通的。

+0

究竟是什么*弃用和删除*?顺便说一下,您不能同时弃用和删除某些内容。 –

+0

当然不是在同一时间。我为简洁的事物添加了逗号。我的意思是使用Controller的createForm()创建表单,但通过传递表单类型的实例。在Symfony 3中,它只使用静态类调用完成。 –

+0

您仍然可以将参数传递给FormType的构造函数,但您需要将其注册为标记为'form.type'的服务。就这样。 –

相关问题