Symfony 2.1:如何将参数传递给自定义表单字段类型

时间:2012-12-06 16:31:05

标签: symfony symfony-2.1

我正在构建一个从'EntityType'扩展的自定义表单字段类型。我总是希望根据传递的选项返回元素的子集。

在我的类型中:

$builder->add('Categories','choice_category', array('code'=> 'CAT1', 'multiple'=> true))   ;

我已将choice_category声明为服务。工作还好!。

  bt.form.type.category:
  class: My\MBundle\Form\Type\CategoryType
  tags:
      - { name: form.type, alias: choice_category }

在CategoryChoiceType.php

public function setDefaultOptions(OptionsResolverInterface $resolver)
{

    $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,                
        )
    );
}


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

我正在考虑使用query_builder选项,但我不知道如何将代码选项传递给setDefaultOptions方法,我不在这里访问$ options数组。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
        $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,
            'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($options['code']) {
               return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            }
        )
    );
);

2 个答案:

答案 0 :(得分:12)

你几乎把它弄好了,但是你需要使用这种特殊语法使“query_builder”依赖于其他选项“code”:

use Symfony\Component\OptionsResolver\Options;

$resolver->setDefaults(array(
    'query_builder' => function (Options $options) {
        // return default value of the "query_builder" option
        // you can access $options['code'] here
    },
));

所以在你的具体例子中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'class' => 'CmComunBundle:Comun\Nomenclador',
        'code' => null,
        'query_builder' => function (Options $options) {
            return function(EntityRepository $er) use ($options) {
                return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            };
        },
    ));
}

这也记录在OptionsResolver README

答案 1 :(得分:2)

您可以通过依赖注入将code值传递给__construct并将其存储起来供以后在setDefaultOptions方法中使用。

class CategoryType{
    ...
    private $code;
    ...
    public function __construct($code){
        $this->code = $code
    }
    ...
    public function setDefaultOptions(OptionsResolverInterface $resolver){
        $code = $this->code;
        $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,
            'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($code) {
                return $er->createQueryBuilder('c')
                                ->where('c.parent_code = :code')
                                ->orderBy('c.name', 'ASC')
                                ->setParameter('code', $code);
            })
        );
    );
}

并在你的配置中:

bt.form.type.category:
    class: My\MBundle\Form\Type\CategoryType
    tags:
        arguments:
                - some_code_value
        - { name: form.type, alias: choice_category }

现在,我还没有尝试过,但感觉它应该以这种方式工作;)

希望这有帮助!