2014-03-05 78 views
4

你好,我試過Symfony,我是一個非常新手。 我正在尋找一個優雅的方式來過濾清單。在Symfony2中過濾列表?

讓我解釋一下:

我有兩個實體:鏈接和標籤。他們有多重關係。

在我的索引視圖中,我創建了此表單。我做了的findAll()來獲取我的選擇所有標籤:

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

我得到這個錯誤:

A 「__toString()」 的類型的對象未找到方法「 Lan \ CrmBundle \ Entity \ LinkTag「傳遞給選擇字段。要改爲讀取自定義getter,請將選項「屬性」設置爲所需的屬性路徑。

StringCastException:在傳遞給選擇字段的類型爲「Lan \ CrmBundle \ Entity \ LinkTag」的對象上找不到「__toString()」方法。要改爲讀取自定義getter,請將選項「屬性」設置爲所需的屬性路徑。

回答

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) }} 
3

其實最好的做法是創建類型的類。製作過濾器的一大組件是 https://github.com/lexik/LexikFormFilterBundle

我創建了一個typeGuesser Bundle,它使用lexik的類型創建一個以EntityFormType類爲參數的filterForm。 https://github.com/juanmf/FilterTypeGuesserBundle

在安裝了這兩個軟件包並安裝了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> = 2.8 formTypes變化FQCN,所以typeGuesser找不到類型名稱。修復需要。

+0

注:截至Sf> = 2。8個formTypes更改爲FQCN,因此typeGuesser找不到類型名稱。修復需要。 – juanmf