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

Symfony 2.1:如何将参数传递给自定义表单字段类型,symfony,symfony-2.1,Symfony,Symfony 2.1,我正在构建一个从“EntityType”扩展而来的自定义表单字段类型。我总是希望根据传递的选项返回元素的子集 在我的类型中: $builder->add('Categories','choice_category',array('code'=>'CAT1','multiple'=>true)); 我已将choice_类别声明为服务。干得好 bt.form.type.category: 类别:My\MBundle\Form\Type\CategoryType 标签: -{name:form.ty

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

在我的类型中:

$builder->add('Categories','choice_category',array('code'=>'CAT1','multiple'=>true));
我已将choice_类别声明为服务。干得好

bt.form.type.category:
类别:My\MBundle\Form\Type\CategoryType
标签:
-{name:form.type,别名:choice\u category}
在CategoryChoiceType.php中

公共函数setDefaultOptions(选项ResolvePrinterface$resolver)
{
$resolver->setDefaults(
排列(
'class'=>'CmComunBundle:Comun\Nomenclador',
'code'=>null,
)
);
}
公共函数getParent()
{
返回“实体”;
}
我正在考虑使用query_builder选项,但我不知道如何将code选项传递给setDefaultOptions方法,我在这里无法访问$options数组

公共函数setDefaultOptions(选项ResolvePrinterface$resolver)
{
$resolver->setDefaults(
排列(
'class'=>'CmComunBundle:Comun\Nomenclador',
'code'=>null,
'query\u builder'=>函数(\doctor\ORM\EntityRepository$er)使用($options['code']){
返回$er->createQueryBuilder('c')
->其中('c.parent_code=:code')
->订购人('c.name','ASC')
->setParameter('code',$options['code']);;
}
)
);
);

您可以通过依赖项注入将
code
值传递给
\u构造
,并将其存储在
setDefaultOptions
方法中供以后使用

类类别类型{
...
私人$代码;
...
公共函数构造($code){
$this->code=$code
}
...
公共函数setDefaultOptions(选项ResolvePrinterface$resolver){
$code=$this->code;
$resolver->setDefaults(
排列(
'class'=>'CmComunBundle:Comun\Nomenclador',
'code'=>null,
'query\u builder'=>函数(\doctor\ORM\EntityRepository$er)使用($code){
返回$er->createQueryBuilder('c')
->其中('c.parent_code=:code')
->订购人('c.name','ASC')
->setParameter('code',$code);
})
);
);
}
在您的配置中:

bt.form.type.category:
类别:My\MBundle\Form\Type\CategoryType
标签:
论据:
-一些代码值
-{name:form.type,别名:choice\u category}
现在,我还没有试过,但感觉应该是这样;)


希望这能有所帮助!

您几乎答对了,但您需要使用以下特殊语法使“查询生成器”依赖于另一个选项“代码”:

使用Symfony\Component\Options解析器\Options;
$resolver->setDefaults(数组(
“查询生成器”=>函数(选项$Options){
//返回“查询生成器”选项的默认值
//您可以在此处访问$options['code']
},
));
因此,在您的具体示例中:

公共函数setDefaultOptions(选项ResolvePrinterface$resolver)
{
$resolver->setDefaults(数组(
'class'=>'CmComunBundle:Comun\Nomenclador',
'code'=>null,
“查询生成器”=>函数(选项$Options){
返回函数(EntityRepository$er)使用($options){
返回$er->createQueryBuilder('c')
->其中('c.parent_code=:code')
->订购人('c.name','ASC')
->setParameter('code',$options['code']);;
};
},
));
}

这也记录在了。

中,谢谢你的回答。你说得对。这是可行的,但我需要在每个表单类中传递一个不同的“代码”值。我需要一些“更动态”的东西,如“将代码”作为字段传递选项,如“多个”和“扩展”,谢谢你花了这么多时间。表单组件中的工作太棒了!