我正在构建一个包含名为“category”的字段的表单,我需要一个选项列表来执行此操作,但我不知道如何使用存储在数据库中的几个类别来填充此选项列表。 / p>
public function buildForm(FormBuilder $builder, array $options) {
$builder -> add('item', 'text', array('label' => 'Item'));
$builder -> add('category', 'choice', array(
'choices' => ???,
'label' => 'Category'
));
}
如何从数据库中获取类别并使用它们来构建表单? (似乎无法在此课程中访问$ this-> getDoctrine-> ...)。
答案 0 :(得分:15)
使用entity
类型代替choice
$builder
->add('entity_property', 'entity', array(
'class' => 'Namespace\\To\\Entity',
'query_builder' => function(EntityRepository $repository) {
return $repository->createQueryBuilder('q')
->where('q.a_field = yourvalue');
}
));
修改强>
在查询中使用自定义参数的两种方法。在这两种情况下,参数都是从外部注入的,因此您的FormType不需要任何对会话或请求对象的引用等。
1-将所需参数传递给构造函数
class TaskType extends AbstractType
{
private $custom_value;
public function __construct($custom_value) {
$this->custom_value = $custom_value;
}
// ...
}
在buildForm()
中,您必须将值复制到局部变量并使其可用于query_builder回调:
public function buildForm(/*...*/) {
$my_custom_value = $this->custom_value;
// ...
'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
return $repository->createQueryBuilder('q')
->where('q.a_field = :my_custom_value')
->setParameter('my_custom_value', $my_custom_value);
}
// ...
}
2-使用$options
方法的buildForm
参数。
首先,您必须通过覆盖getDefaultOptions
来定义默认值:
public function getDefaultOptions(array $options)
{
return array(
'my_custom_value' => 'defaultvalue'
);
}
然后,您可以在createForm
方法的第三个参数中从控制器传递它。
$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));
现在可以通过youru buildForm方法的$options
参数获取该值。如上所述将其传递给回调。
答案 1 :(得分:2)
您现在必须使用 setDefaultOptions 方法中的 OptionsResolverInterface 。如果您想要检索选项,请使用以下代码(使用与接受的答案相同的示例)
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
public function buildForm(FormBuilderInterface $builder, array $options){
parent::buildForm($builder, $options);
$my_custom_value = $options[custom_value];
// ...
'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
return $repository->createQueryBuilder('q')
->where('q.a_field = :my_custom_value')
->setParameter('my_custom_value', $my_custom_value);
}
// ...
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'my_custom_value' => 'defaultvalue'
));
}
您仍然以相同的方式传递选项:
$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));