9

我正在构建一个包含名为“类别”的字段的表单,我需要一个选择列表来执行此操作,但我不知道如何使用存储在数据库中的几个类别来填充这个选择列表。

public function buildForm(FormBuilder $builder, array $options) {
    $builder -> add('item', 'text', array('label' => 'Item'));
    $builder -> add('category', 'choice', array(
        'choices'   => ???,
        'label' => 'Category'
    ));
}

如何从此处的数据库中获取类别并使用它们来构建我的表单?(似乎无法在此类中访问 $this->getDoctrine->...)。

4

2 回答 2

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'));

现在该值应该可以通过$optionsyouru buildForm 方法的参数获得。如上所述将其传递给回调。

于 2011-12-10T15:13:26.583 回答
2

在 Symfony 2.1 中

您现在必须在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'));
于 2012-07-20T01:45:47.673 回答