我正在构建一个包含名为“category”的字段的表单,我需要一个选择列表来做到这一点,但是我不知道如何用数据库中存储的几个类别来填充这个选择列表.
public function buildForm(FormBuilder $builder,array $options) { $builder -> add('item','text',array('label' => 'Item')); $builder -> add('category','choice',array( 'choices' => ???,'label' => 'Category' )); }
如何从数据库中获取类别并使用它们构建我的表单? (似乎无法访问此类中的$this-> getDoctrine-> …).
解决方法
使用类型实体而不是选择
$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-使用buildForm方法的$options参数.
首先,您必须通过覆盖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参数可用.将其传递到如上所述的回调.