Symfony2 - 从formBuilder内部修改自定义字段类型中的选择

时间:2014-12-12 19:12:07

标签: symfony

我创建了一个自定义"状态"表单类型,通过扩展选择字段(following the tutorial in the cookbook)。 select字段的选项由通过服务注入的参数自动填充。但是,我想将此状态字段配置为使用简单或扩展选项集,可以是简单状态列表(非活动,实时)或更完整状态列表(非活动,实时,删除,已删除)。

下面的代码根据我的$ options [' customOptions']成功修改了$options['choices'],但这些更改对呈现的最终选择字段选项没有影响。

如何在formBuilder中修改字段的choice选项?

parameters.yml

parameters:
    gutensite_component.options.status:
        0: Inactive
        1: Live
    gutensite_component.options.status_preview:
        2: "Preview Only"
        3: "Live Only (delete on sync)"
    gutensite_component.options.status_delete:
        -1: "Delete (soft)"
        -2: Deleted

services.yml

services:
    gutensite_component.form.type.status:
        class: Gutensite\ComponentBundle\Form\Type\StatusType
        arguments:
            - "%gutensite_component.options.status%"
            - "%gutensite_component.options.status_preview%"
            - "%gutensite_component.options.status_delete%"
        tags:
            - { name: form.type, alias: "status" }

表格类型

class StatusType extends AbstractType
{

    /**
     * $statusChoices are passed in from services.yml that initiates this as a global service
     * @var array
     */
    private $statusChoices;
    private $statusChoicesPreview;
    private $statusChoicesDelete;

    public function __construct(array $statusChoices, array $statusChoicesPreview,
        array $statusChoicesDelete) {
        $this->statusChoices = $statusChoices;
        $this->statusChoicesPreview = $statusChoicesPreview;
        $this->statusChoicesDelete = $statusChoicesDelete;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'customOptions' => array(),
            // By default it will use the simple choices
            'choices' => $this->statusChoices
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Set extra choices based on customOptions
        if(!empty($options['customOptions']['showPreview'])) {
            $options['choices'] = $options['choices'] + $this->staftusChoicesPreview;
        }
        if(!empty($options['customOptions']['showDelete'])) {
            $options['choices'] = $options['choices'] + $this->statusChoicesDelete;
        }

        // The $options['choices'] ARE successfully modified and passed to the parent, but
        // have no effect on the options used in the form display

        // Include Regular Choice buildForm
        parent::buildForm($builder, $options);
    }




    public function getParent() {
        return 'choice';
    }

    public function getName() {
        return 'status';
    }

}

控制器

$builder->add('status', 'status', array(
    'label'     => 'Status',
    'required'  => TRUE,
    'customOptions' => array(
        'showPreview' => true
    )
));

1 个答案:

答案 0 :(得分:0)

您可以将一组选项传递给控制器​​中的表单类:

在控制器中:

$myArray = array('0' => 'foo', '1' => 'bar', ...);
...
$form = $this->createForm(new SomeFormType($myArray), ...);

在表单类中:

class SomeFormType extends AbstractType
{

private $choiceArray;

public __construct($array)
{
    $this->choiceArray = $array;
}

    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder
            ->add('status', 'choice', array(
                 'choices' => $this->choiceArray,
                  ...
             )
        ...
    }
...
}