2012-11-09 22 views
6

Tôi muốn biết thời tiết có thể và cách định cấu hình bộ lọc cho chế độ xem danh sách như sau với SonataAdminBundle trong Symfony 2Với SonataAdminBundle. Cấu hình bộ lọc trên thực thể có liên quan hai bước

Nói rằng tôi có thực thể Đặt hàng, trỏ đến thực thể Người dùng, trỏ đến các công ty thực thể. Tôi muốn định cấu hình các bộ lọc để lọc theo Người dùng và cũng để lọc theo Công ty (Công ty của người dùng) Đầu tiên là chuyển tiếp thẳng. Thứ hai là những gì tôi cố gắng làm rõ.

Trong lớp OrderAdmin Tôi sẽ ghi đè lên configureDatagridFilters như:

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('created_at') 
     //... some other filters on Order fields, as usual 

     // the filter on User, provided 'user', no ploblem 
     ->add('user') 

     // and the filter by Company 
     ->add('user.company') // this doesn't work, of course 
    ; 
} 

Đó cú pháp cho bộ lọc công ty đang inpired bởi docs sonta: http://sonata-project.org/bundles/doctrine-orm-admin/2-0/doc/reference/filter_field_definition.html

là không dành cho những gì tôi cố gắng acomplish, nhưng không thể tìm nơi để xem.

Hy vọng ai đó có một đầu mối về điều này.

Cảm ơn

Trả lời

15

Cuối cùng tôi tìm thấy một câu trả lời hướng dẫn bởi câu hỏi này khác: How can I create a custom DataGrid filter in SonataAdmin và đọc kỹ hơn về các tài liệu sonata quản trị liên kết Tôi dán vào câu hỏi của tôi.

Trong trường hợp ai đó có vấn đề này và lấy ví dụ trước:

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 

     //... whatever filter 

     // and the filter by Company 

     ->add('company', 'doctrine_orm_callback', array(
      'callback' => array($this, 'callbackFilterCompany'), 
      'field_type' => 'checkbox' 
      ), 
    'choice', 
    array('choices' => $this -> getCompanyChoices()) 
; 
} 

nơi getCompanyChoices phương pháp lấy ra một mảng kết hợp của id công ty => tên công ty (ví dụ). Và phương pháp callbackFilterCompany như sau

public function callbackFilterCompany ($queryBuilder, $alias, $field, $value) 
{ 
    if(!is_array($value) or !array_key_exists('value', $value) 
     or empty($value['value'])){ 

     return; 

    } 

    $queryBuilder 
    ->leftJoin(sprintf('%s.user', $alias), 'u') 
    ->leftJoin('u.company', 'c') 
    ->andWhere('c.id = :id') 
    ->setParameter('id', $value['value']) 
    ; 

    return true; 
} 
+0

này đã giúp tôi có một thay đổi nhỏ: thay vì rỗng (giá trị $ [ 'giá trị']) Tôi muốn is_null ($ value ['value']) vì rỗng (int (0)) được đánh giá là true. Cảm ơn rất nhiều vì giải pháp của bạn. –

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