Symfony2:formbuilder:动态修改querybuilder

时间:2015-07-16 16:34:12

标签: symfony query-builder formbuilder

我正在使用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吗?

2 个答案:

答案 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; 
}

我希望它能帮助别人。 欢呼声