Skip to content

Ajout de champs non indexé au grid de la vue search d'oro

Jonathan edited this page Aug 30, 2024 · 2 revisions

Pour ajouter des champs au grid de la vue search d'oro :

/!\ Mise en garde :

Le grid de la vue search d'oro contient souvent beaucoup de produit, il est ici extrêmement déconseillé de faire appel à doctrine ou tout autre processus un peu lourd qui pourrait ralentir ou faire crash la prod à cause des performances.

1. Créer une class Listener avec la méthode onPreBuild :

Via cet événement on peut intercepter la configuration dud atagrid et ajouter de nouveaux champs autorisés avec leur type.

class AddTestFieldsToFrontendProductGridListener
{
    public function onPreBuild(PreBuild $event): void
    {
        $config = $event->getConfig();

        //Set new field we are going to generate on the website search event
        $config->offsetAddToArrayByPath(
            '[properties]',
            [
                'test_field_int' => [
                    'type' => 'field',
                    'frontend_type' => PropertyInterface::TYPE_INT,
                ],
                'test_field_string' => [
                    'type' => 'field',
                    'frontend_type' => PropertyInterface::TYPE_STRING,
                ],
            ]
        );
    }
}

2. Ajouter la configuration de cet événement dans service.yml :

    AppBundle\EventListener\Frontend\AddTestFieldsToFrontendProductGridListener:
        tags:
            - { name: kernel.event_listener, event: oro_datagrid.datagrid.build.pre.frontend-product-search-grid, method: onPreBuild }

3. Ajouter la méthode onResultAfter :

Via cette méthode, on va pouvoir ajouter les champs autorisé précédemment aux records avec une valeur.

public function onResultAfter(SearchResultAfter $event): void
    {
        $records = $event->getRecords();
        if (!$records) {
            return;
        }

        foreach ($records as $record) {
            $record->addData([
                'test_field_int' => 1,
                'test_field_string' => 'test string',
            ]);
        }
    }

4. Ajouter la configuration dans service.yml :

    AppBundle\EventListener\AddTestFieldsToFrontendProductGridListener:
        tags:
            - { name: kernel.event_listener, event: oro_datagrid.datagrid.build.pre.frontend-product-search-grid, method: onPreBuild }
            - { name: kernel.event_listener, event: oro_datagrid.search_datasource.result.after.frontend-product-search-grid, method: onResultAfter }