Symfony 4 / Sonata thêm một bộ lọc liên kết với thực thể OneToMany

Các bộ lọc được quản lý trong phương thức configureDatagridFilters

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
	{
$filers=$datagridMapper->getAdmin()->getFilterParameters();
}



Có thể thêm một bộ lọc đơn giản trên tiêu đề hoặc bất kỳ tham số nào của thực thể của chúng ta.
Tham số show_filter cho phép hiển thị nó khi trang tải. Kết hợp với giá trị của $filters, người ta có thể chỉ định để giữ phần tử hiển thị sau khi nộp bộ lọc.

Ví dụ, có thể thiết lập bộ lọc để hiển thị vĩnh viễn:

$datagridMapper
            ->add('title', null, ['show_filter' => true , 'label' => 'Titre'])

Hoặc chỉ hiển thị nếu nó đã được sử dụng

->add('enabled',null,['show_filter' =>!empty($filers['enabled']['value'])?true:null, 'label' => 'Actvé'])

Đối với mối quan hệ oneToMany, nếu thực thể của bạn được cấu hình chính xác, bạn có thể cấu hình đơn giản như sau:

$datagridMapper->add('field', null, ['show_filter' => true , 'label' => 'nom du champs']);

Cơ bản, không cần phải làm gì. Nhưng chúng ta có thể cần lọc các giá trị. Trong trường hợp này, chúng ta sẽ sử dụng doctrine để chỉnh sửa truy vấn lựa chọn cho các giá trị:

->add('slug', 'doctrine_orm_callback', ['show_filter' =>!empty($filers['slug']['value'])?true:null,  'label' => 'SEO Slug',
                'callback'  => function($queryBuilder, $alias, $field, $value)
                        {
                            $queryBuilder->andWhere($queryBuilder->expr()->like('o.slug', "'%".$value["value"]."%'"));
		                }
            ])

Chúng ta cũng có thể muốn tạo một danh sách được xây dựng một cách động bởi chính chúng ta:

 ->add('liste', 'doctrine_orm_choice', array(
                'label' => 'ma liste'),
                'choice',
                array(
                    'choices' => array(
                        'label value1' => 'value1',
                        'label value2' => 'value2',
                    ),
                    'expanded' => true,
                    'multiple' => true))