我正在使用formbuilder创建一个表单,如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content', 'textarea')
->add('rosters', 'entity', array(
'class' => 'PlatformBundle:team',
'property' => 'display',
'multiple' => true,
'expanded' => true,
'required' => true
))
->add('send', 'submit')
;
}
此刻我得到所有“团队”。我需要根据请求调整表单以显示某些团队。 我可以在表单构建器
中使用查询构建器public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content', 'textarea')
->add('rosters', 'entity', array(
'class' => 'PlatformBundle:team',
'property' => 'display',
'query_builder' => function(TeamRepository $t) use ($userId) {
return $r->createQueryBuilder('t')
->where('(t.user = :user')
},
'multiple' => true,
'expanded' => true,
'required' => true
))
->add('send', 'submit')
;
}
但查询会针对不同的问卷进行更改。简而言之:总是使用相同的调查问卷,但要列出不同的团队(我有意义吗?)。
有人知道如何动态修改formbuilder中的querybuilder吗?
答案 0 :(得分:1)
我建议两种可能的选择。
如果请求来自表单本身(即您已经提交了包含某些数据的表单并想要优化字段),您可以像这样访问提交的数据:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$data = $builder->getData();
// now you can access form data
如果请求来自其他来源,则应使用"选项"参数。首先,为所请求的用户:
构建一个新的$选项public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'user' => null,
));
}
注意:我将默认值设置为null,但您可以将其设置为您想要的任何值。
之后,您可以传递构建表单的$选项,即
// some controller
$option = array('user' => $request->get('user');
$teamForm = $this->createForm(new TeamType(), null, $options);
// ...
答案 1 :(得分:0)
对于那些寻找答案的人......
我找到的最佳解决方案是在formtype中创建一个变量并从控制器导入它。我的formType看起来像这样:
class formType extends AbstractType
{
// declare and construct the query in the class to use it in the function
private $qb;
public function __construct ($qb)
{
$this->qb = $qb;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
// declare the variable within the function
$qb = $this->qb;
$builder
->add('content', 'textarea', array('required' => false))
->add('rosters', 'entity', array(
'class' => 'PlatformBundle:Team',
// use ($qb) -> $qb is query built in the controller (or repository)
'query_builder' => function(TeamRepository $r) use ($qb) {
return $qb;
},
'property' => 'display',
'multiple' => true,
'expanded' => true,
'required' => true
))
->add('send', 'submit');
}
在我的控制器中,我只传递$ qb作为formtype的参数
$qb = $this->getDoctrine()->getManager()->getRepository('PlatformBundle:Team')->qbteam($Id);
$form = $this->createForm(new formType($qb), $form);
使用qbteam在团队存储库中返回查询的函数(不是结果)。
public function qbteam($Id){
$qb = $this->createQueryBuilder('r')
->leftJoin('r.team', 'm')
->addSelect('m')
->where('m.user = :user')
->setParameter('user', $Id);
return $qb;
}
我希望它能帮助别人。 欢呼声