在Symfony2中过滤列表?

时间:2014-03-05 11:09:18

标签: forms symfony doctrine-orm

您好我试过Symfony,我是一个非常新手。 我正在寻找一种优雅的方式来过滤列表。

让我解释一下:

我有两个实体:链接和标记。它们处于多种关系中。

在我的索引视图中,我创建了此表单。我做了一个findAll()来获取select的所有标签:

<form method="GET" action="">
    <input class="btn btn-default" type="submit"/>
    <select name="tags[]" class="selectpicker" multiple="yes">
        {% for tag in tags %}
            <option value="{{ tag.id }}"> {{ tag.title }}</option>
        {% endfor %}
    </select>
</form>

这是我通过DESC获取所有链接顺序的方式:

$links = $em->getRepository('TestDefaultBundle:Link')->findBy(
    array(),
    array('id' => 'desc')
);

如何收集所选标签(在控制器中)并按所选标签抓取所有链接过滤器。

我知道另一个问题我们可以为实体生成一个表单但是这种形式呢?

修改

这是我的indexAction:

public function indexAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $tags = $em->getRepository('LanCrmBundle:LinkTag')->findAll();

    // Create the filter form.
    $form = $this->createFormBuilder()
        ->add('tags', 'entity', array(
            'class' => 'LanCrmBundle:LinkTag',
            'multiple' => true,
            'expanded' => false,
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('u')
                    ->orderBy('u.title', 'ASC');
            }
        ))
        ->add('OK', 'submit')
        ->getForm()
    ;

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();

        // Get all links filtered by tags.
        // How to use the $data to filter my links?
        $links = $em->getRepository('LanCrmBundle:Link')->findBy(
            array(),
            array('id' => 'desc')
        );
    } else {
        // Get all links.
        $links = $em->getRepository('LanCrmBundle:Link')->findBy(
            array(),
            array('id' => 'desc')
        );
    }

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $links,
        $this->get('request')->query->get('page', 1),
        4
    );

    return $this->render('LanCrmBundle:Link:index.html.twig', array(
        'pagination' => $pagination,
        'tags' => $tags,
        'form' => $form->createView()
    ));
}

我有这个错误:

在传递给选择字段的“Lan \ CrmBundle \ Entity \ LinkTag”类型的对象上找不到“__toString()”方法。要改为读取自定义getter,请将选项“property”设置为所需的属性路径。

StringCastException:在传递给选择字段的“Lan \ CrmBundle \ Entity \ LinkTag”类型的对象上找不到“__toString()”方法。要改为读取自定义getter,请将选项“property”设置为所需的属性路径。

2 个答案:

答案 0 :(得分:3)

实际上,最佳做法是创建Type类。一个伟大的捆绑来制作过滤器 https://github.com/lexik/LexikFormFilterBundle

我创建了一个typeGuesser Bundle,它使用lexik的类型创建一个filterForm,并将EntityFormType类作为参数。 https://github.com/juanmf/FilterTypeGuesserBundle

安装了两个bundle,并且你的Type Class就位了,代码对于过滤器和一个方法(我在README.md中留下了一个例子)来减少这个以创建查询。

    private function createFilterForm($docType)
    {
        $adapter = $this->get('dd_form.form_adapter');
        $type = $this->getFormForDocument($this->getClassFromDocType($docType));
        return $adapter->adaptForm(
            $type,
            $this->generateUrl('document_search', array('docType' => $docType)),
            array('pdfPath', 'pdfPages', 'batchStatus', 'createdInBatch', 'documentType')
            );
    }

注意:从Sf&gt; = 2.8开始,formTypes更改为FQCN,因此typeGuesser无法找到类型名称。需要修复。

答案 1 :(得分:1)

这不是处理表单的正确方法 - 请检查Symfony forms

解决方案可能是:

控制器

$form = $this->createFormBuilder()
        ->add('tag', 'entity', array(
            'class' => 'TestDefaultBundle:YoutTagEntity',
            'multiple' => true,
            'expanded' => false,
            'query_builder' => function(EntityRepository $er){
                return $er->createQueryBuilder('u')
                    ->orderBy('u.title', 'ASC')
            },))
        ->add('OK', 'submit')
        ->getForm();

    $form->handleRequest($request);
    if ($form->isValid()) {
            // data is an array of values from form, for example: $data['tag']
            $data = $form->getData();

        //here you can now pass variables to another query
        $links = $em->getRepository('TestDefaultBundle:Link')->findBy(
            array(),
            array('id' => 'desc')
        );
    }

    // ... render the form

树枝:

{{ form(form) }}