2012-07-12 28 views
5

Tôi có danh sách các mục để hiển thị trên trang, với biểu mẫu tìm kiếm phía trên trang để lọc các mục này, như trong bất kỳ chương trình phụ trợ thông thường nào. Vấn đề là tôi không biết cách thêm tiêu chí tìm kiếm vào truy vấn hiện có với các tham gia ... Đây là những gì tôi có:Cách triển khai biểu mẫu bộ lọc tìm kiếm với Symfony2

Tôi sử dụng một phương pháp cụ thể trên kho lưu trữ được liên kết với thực thể để thêm tham gia trên truy vấn (để tránh nhiều truy vấn). Bộ điều khiển trông như thế này:

class ModelController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     // ... 
     $em = $this->getDoctrine()->getManager(); 
     $query = $em->getRepository('AcmeDemoBundle:Item')->getList(); 
    } 
} 

Phương pháp getList trên kho trông như thế này:

use Doctrine\ORM\EntityRepository; 

// ... 

class ItemRepository extends EntityRepository 
{ 
    public function getList() 
    { 
     $queryBuilder = $this 
      ->createQueryBuilder('i') 
      ->innerJoin('i.brand', 'b'); 

     return $queryBuilder->getQuery(); 
    } 
} 

Tôi tạo ra một đối tượng ItemSearchType mẫu với một số lĩnh vực để tìm kiếm cho các hạng mục.

Làm cách nào tôi có thể dễ dàng thêm tiêu chí tìm kiếm từ dữ liệu được cung cấp trong biểu mẫu tìm kiếm để hiển thị các mục được lọc?

Đây là những gì trong bộ điều khiển của tôi liên quan đến các hình thức tìm kiếm:

class ModelController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 

     // ... 
     if ($request->getMethod() === 'POST') { 
      $searchForm->bindRequest($request); 

      if ($searchForm->isValid()) { 
       $searchCriteria = $searchForm->getData(); 

       // Do something with this data! ...but I don't know how 
      } 
    } 
} 

Cảm ơn!

Trả lời

8

Dưới đây là những gì tôi sẽ cố gắng:

public function getListBy($criteria) 
{ 
    $qb = $this->createQueryBuilder('i'); 

    $qb->innerJoin('i.brand', 'b'); 

    foreach ($criteria as $field => $value) { 
     if (!$this->getClassMetadata()->hasField($field)) { 
      // Make sure we only use existing fields (avoid any injection) 
      continue; 
     } 

     $qb ->andWhere($qb->expr()->eq('i.'.$field, ':i_'.$field)) 
      ->setParameter('i_'.$field, $value); 
    } 

    return $qb->getQuery()->getResult(); 
} 
2

Ở đây tôi đã đăng một answer cho điều này, tôi sử dụng LexikFormFilterBundle filterTypes và QueryBuilder, cộng với một TypeGuesser tôi đưa ra là tóm tắt quá trình tạo filterForm.

bạn có thể cài đặt cả hai dịch vụ dưới dạng các Gói riêng biệt với Nhà soạn nhạc. Mã kết quả là sạch

Từ README, trong trường hợp bạn không muốn điều hướng đến github: P

/** 
* Creates a Filter form to search for Entities. 
* 
* @param AbstractType|string $formType The `generate:doctrine:form` generated Type or its FQCN. 
* 
* @return \Symfony\Component\Form\Form The filter Form 
*/ 
private function createFilterForm($formType) 
{ 
    $adapter = $this->get('dd_form.form_adapter'); 
    $form = $adapter->adaptForm(
     $formType, 
     $this->generateUrl('document_search'), 
     array('fieldToRemove1', 'fieldToRemove2') 
    ); 
    return $form; 
} 

Nó bị hỏng cho SF> = 2.8 Cần một sửa chữa here

+1

Đây là câu trả lời hay nhất. LexikFormFilterBundle giải quyết vấn đề lọc một thực thể. Câu trả lời của AdrienBrault cũng sẽ hoạt động, nhưng không thể lọc được bằng cách sử dụng daterange. –

+0

Cảm ơn lời khuyên với LexikFormFilterBundle tôi đã bị bệnh của tất cả các andWheres trong các truy vấn bộ lọc. gói bộ lọc tiết kiệm rất nhiều công việc và biến chứng ở đó :) – Sharpy35

Các vấn đề liên quan