Hablemos de su proyecto
PHP symfony Sonata

Symfony 4 / Sonata añadir un filtro relacionado con una entidad OneToMany

Los filtros se gestionan en el método configureDatagridFilters protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $filers=$datagridMapper->getAdmin()->getFilterParameters(); } Se puede añadir un filtro simple en un títul...

Symfony 4 / Sonata añadir un filtro relacionado con una entidad OneToMany
Los filtros se gestionan en el método configureDatagridFilters

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



Se puede añadir un filtro simple en un título o cualquier parámetro de nuestra entidad.
El parámetro show_filter permite mostrarlo al cargar la página. Combinado con el valor de $filters, se puede especificar que se mantenga el elemento mostrado después del envío del filtro.

Por ejemplo, se puede configurar el filtro para que se muestre permanentemente:

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

O para mostrarlo solo si ha sido utilizado:

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

Para una relación oneToMany, si tu entidad está configurada correctamente, puedes simplemente configurarla de la siguiente manera:

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

Básicamente, no hay nada que hacer. Pero podríamos necesitar filtrar los valores. En este caso, utilizaremos doctrine para modificar la consulta de selección para los valores:

->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"]."%'"));
		                }
            ])

También podríamos querer hacer una lista construida dinámicamente por nosotros mismos:

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

Tenga en cuenta que los marcadores de posición `{{code_placeholder_X}}` se dejaron sin traducir, ya que parecen representar marcadores de posición para fragmentos de código que deben ser reemplazados por código real, el cual típicamente no se debe traducir. Si requiere que se traduzcan las instrucciones o comentarios circundantes dentro de los fragmentos de código, por favor proporcione el código real o los comentarios.

Adaptar el ejemplo a la versión instalada

Los ejemplos de Symfony y Sonata permanecen ligados a las versiones indicadas en el artículo. Symfony 4.x y Symfony 6.2 ya no se mantienen: para un proyecto actual, utilice una rama mantenida y la documentación que corresponda exactamente a sus dependencias.

php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle

Antes de retomar el código, controle las firmas, los servicios, las rutas y las plantillas correspondientes. Después, agregue una prueba funcional que cubra los permisos, el código HTTP y el resultado visible.

Referencia: versiones de Symfony mantenidas.

Compartir este artículo