Symfony2:formbuilder:动态修改querybuilder

Symfony2: formbuilder : dynamically modify querybuilder

我正在使用表单生成器创建如下表单:

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

目前我得到了所有"teams"。我需要根据要求调整表格以显示某些团队。 我可以在表单生成器中使用查询生成器

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

但不同问卷的查询不同。简而言之:总是相同的问卷,但要列出不同的团队(我说得有道理吗?)。

有人知道如何在表单构建器中动态修改查询构建器吗?

对于那些寻找答案的人...

我找到的最佳解决方案是在表单类型中创建一个变量并将其从控制器中导入。我的 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 团队存储库中的一个函数,return 查询(不是结果)。

public function qbteam($Id){
    $qb = $this->createQueryBuilder('r')
        ->leftJoin('r.team', 'm')
        ->addSelect('m')
        ->where('m.user = :user')
        ->setParameter('user', $Id);
    return $qb; 
}

希望对其他人有所帮助。 干杯

我建议两种可能的选择。

如果请求来自表单本身(即您已经提交了包含一些数据的表单并希望优化字段),您可以像这样访问提交的数据:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $data = $builder->getData();
    // now you can access form data

如果请求来自其他来源,则应使用 "options" 参数。首先,为请求的 user:

构建一个新的 $option
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'user' => null,
    ));
}

注意:我将默认设置为空,但您可以将其设置为任何您想要的。

之后您可以传递您构建表单的$选项,即

// some controller
$option = array('user' => $request->get('user');
$teamForm = $this->createForm(new TeamType(), null, $options);
// ...