在自身内部编辑自定义SF3类型

时间:2017-04-11 14:35:55

标签: forms symfony types attributes options

我扩展了ChoiceType以创建一个RolesType,其目标是提供多个可选择的应用程序自定义角色列表。

由于我的角色在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",
                ]
            ])

相反,我尝试通过在RoleType构造函数中注入角色列表来初始化此选择列表:

    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;
    }

您可以看到我失败的尝试以表格行事。由于我一直想要我的角色,而且我总是希望多个和扩展的选项具有相同的值,所以在这里做得更好(恕我直言)。

到目前为止,属性和选项导致失败。 如何在构建器(或表单类型中的其他位置)中设置此项?

2 个答案:

答案 0 :(得分:1)

您可以将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 }

请务必将自定义表单类型注册为具有相应标记的服务。

这可能是这样的:

<div class="container-fluid">
    <div class="row">
        <div class="push-md-9 col-md-3">
            <div class="row">
                <div class="col-md-12 col-4">
                    .
                </div>
                <div class="col-md-12 col-4">
                    .
                </div>
                <div class="col-md-12 col-4">
                    .
                </div>
            </div>
        </div>
        <div class="col-md-9 pull-md-3 col-12">
            .
        </div>
    </div>
</div>

实际上Symfony's Doc

中有类似的例子

答案 1 :(得分:0)

您提出的想法已被弃用,并已在Symfony 3中删除。

您可以添加新选项并从Controller传递角色数组。这是在RoleType类中添加选项的方法。

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

你说:

  

选项导致失败

如果不起作用,请提供错误消息。