我正在构建一个从'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']);;
}
)
);
);
答案 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 }
现在,我还没有尝试过,但感觉它应该以这种方式工作;)
希望这有帮助!