From eb4ef2271b78bfe016d704a5de897b7b6be1bf78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Mon, 26 Jan 2026 11:51:43 +0100 Subject: [PATCH 1/2] =?UTF-8?q?[Docs]=C2=A0Export=20Grid=20data=20to=20CSV?= =?UTF-8?q?=20cookbook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 4 + app/Entity/Book.php | 6 + app/Grid/BookGrid.php | 7 + app/Responder/ExportGridToCsvResponder.php | 129 +++++++++ composer.json | 3 +- config/packages/sylius_grid.yaml | 2 + docs/.gitbook/assets/grid_export.png | Bin 0 -> 82919 bytes docs/SUMMARY.md | 1 + docs/cookbook/admin_panel.md | 2 +- docs/cookbook/admin_panel/grid_export.md | 255 ++++++++++++++++++ templates/shared/grid/action/export.html.twig | 11 + translations/messages.en.yaml | 1 + translations/messages.fr.yaml | 1 + 13 files changed, 420 insertions(+), 2 deletions(-) create mode 100644 app/Responder/ExportGridToCsvResponder.php create mode 100644 docs/.gitbook/assets/grid_export.png create mode 100644 docs/cookbook/admin_panel/grid_export.md create mode 100644 templates/shared/grid/action/export.html.twig diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 556d88624..86f625719 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -60,6 +60,10 @@ jobs: ${{ steps.composer-cache.outputs.dir }} key: ${{ github.run_id }}-${{ runner.os }}-${{ hashFiles('composer.json') }}-symfony-${{ matrix.symfony }} + - name: 'Remove portphp/csv if needed' + if: matrix.symfony == '^8.0' + run: composer remove portphp/csv --no-update + - name: "Install dependencies" run: composer update --no-interaction --no-scripts diff --git a/app/Entity/Book.php b/app/Entity/Book.php index 324824eda..30b6781f8 100644 --- a/app/Entity/Book.php +++ b/app/Entity/Book.php @@ -15,6 +15,7 @@ use App\Grid\BookGrid; use App\Repository\BookRepository; +use App\Responder\ExportGridToCsvResponder; use Doctrine\ORM\Mapping as ORM; use Sylius\Component\Resource\Annotation\SyliusCrudRoutes; use Sylius\Component\Resource\Model\ResourceInterface; @@ -40,6 +41,11 @@ template: '@SyliusAdminUi/crud/index.html.twig', shortName: 'withoutGrid', ), + new Index( + shortName: 'export', + responder: ExportGridToCsvResponder::class, + grid: BookGrid::class, + ), new Delete(), new BulkDelete(), new Show(), diff --git a/app/Grid/BookGrid.php b/app/Grid/BookGrid.php index 211723318..1efada35e 100644 --- a/app/Grid/BookGrid.php +++ b/app/Grid/BookGrid.php @@ -14,6 +14,7 @@ namespace App\Grid; use App\Entity\Book; +use Sylius\Bundle\GridBundle\Builder\Action\Action; use Sylius\Bundle\GridBundle\Builder\Action\CreateAction; use Sylius\Bundle\GridBundle\Builder\Action\DeleteAction; use Sylius\Bundle\GridBundle\Builder\Action\ShowAction; @@ -55,6 +56,12 @@ public function buildGrid(GridBuilderInterface $gridBuilder): void ->addActionGroup( MainActionGroup::create( CreateAction::create(), + Action::create(name: 'export', type: 'export') + ->setOptions([ + 'link' => [ + 'route' => 'app_admin_book_export', + ], + ]), ), ) ->addActionGroup( diff --git a/app/Responder/ExportGridToCsvResponder.php b/app/Responder/ExportGridToCsvResponder.php new file mode 100644 index 000000000..1fcd14992 --- /dev/null +++ b/app/Responder/ExportGridToCsvResponder.php @@ -0,0 +1,129 @@ +setStream($output); + + $fields = $this->sortFields($data->getDefinition()->getFields()); + $this->writeHeaders($writer, $fields); + $this->writeRows($writer, $fields, $data); + + $writer->finish(); + }); + + $response->headers->set('Content-Type', 'text/csv; charset=UTF-8'); + $response->headers->set('Content-Disposition', 'attachment; filename="export.csv"'); + + return $response; + } + + /** + * @param Field[] $fields + */ + private function writeHeaders(CsvWriter $writer, array $fields): void + { + $labels = array_map(fn (Field $field) => $this->translator->trans($field->getLabel()), $fields); + + $writer->writeItem($labels); + } + + /** + * @param Field[] $fields + */ + private function writeRows(CsvWriter $writer, array $fields, GridViewInterface $gridView): void + { + /** @var PagerfantaInterface $paginator */ + $paginator = $gridView->getData(); + Assert::isInstanceOf($paginator, PagerfantaInterface::class); + + for ($currentPage = 1; $currentPage <= $paginator->getNbPages(); ++$currentPage) { + $paginator->setCurrentPage($currentPage); + $this->writePageResults($writer, $fields, $gridView, $paginator->getCurrentPageResults()); + } + } + + /** + * @param Field[] $fields + * @param iterable $pageResults + */ + private function writePageResults(CsvWriter $writer, array $fields, GridViewInterface $gridView, iterable $pageResults): void + { + foreach ($pageResults as $resource) { + $rows = []; + foreach ($fields as $field) { + $rows[] = $this->getFieldValue($gridView, $field, $resource); + } + $writer->writeItem($rows); + } + } + + private function getFieldValue(GridViewInterface $gridView, Field $field, object $data): string + { + $renderedData = $this->gridRenderer->renderField($gridView, $field, $data); + $renderedData = str_replace(\PHP_EOL, '', $renderedData); + + return trim(strip_tags($renderedData)); + } + + /** + * @param Field[] $fields + * + * @return Field[] + */ + private function sortFields(array $fields): array + { + $sortedFields = $fields; + + uasort($sortedFields, fn (Field $fieldA, Field $fieldB) => $fieldA->getPosition() <=> $fieldB->getPosition()); + + return $sortedFields; + } +} diff --git a/composer.json b/composer.json index 2d9da6f00..ff71cd658 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "laminas/laminas-stdlib": "^3.18", "pagerfanta/doctrine-orm-adapter": "^4.6", "pagerfanta/twig": "^4.6", + "portphp/csv": "^2.0", "sylius/grid-bundle": "^1.13 || ^1.15@alpha", "sylius/resource-bundle": "^1.13 || ^1.14@alpha", "symfony/asset": "^6.4 || ^7.4 || ^8.0", @@ -109,7 +110,7 @@ }, "extra": { "symfony": { - "require": "8.0.*" + "require": "7.4.*" } }, "scripts": { diff --git a/config/packages/sylius_grid.yaml b/config/packages/sylius_grid.yaml index 52431ffc2..c59aa3a81 100644 --- a/config/packages/sylius_grid.yaml +++ b/config/packages/sylius_grid.yaml @@ -1,4 +1,6 @@ sylius_grid: templates: + action: + export: 'shared/grid/action/export.html.twig' filter: 'App\Grid\Filter\SpeakerFilter': '@SyliusBootstrapAdminUi/shared/grid/filter/entity.html.twig' diff --git a/docs/.gitbook/assets/grid_export.png b/docs/.gitbook/assets/grid_export.png new file mode 100644 index 0000000000000000000000000000000000000000..52d876a246f7f500d6a52e715199968ff96006a4 GIT binary patch literal 82919 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 z1x;+A1Exporting grid data + +## The responder + +First, create the responder using the [https://github.com/portphp/csv](portphp/csv) package. + +```php +setStream($output); + + $fields = $this->sortFields($data->getDefinition()->getFields()); + $this->writeHeaders($writer, $fields); + $this->writeRows($writer, $fields, $data); + + $writer->finish(); + }); + + $response->headers->set('Content-Type', 'text/csv; charset=UTF-8'); + $response->headers->set('Content-Disposition', 'attachment; filename="export.csv"'); + + return $response; + } + + /** + * @param Field[] $fields + */ + private function writeHeaders(CsvWriter $writer, array $fields): void + { + $labels = array_map(fn (Field $field) => $this->translator->trans($field->getLabel()), $fields); + + $writer->writeItem($labels); + } + + /** + * @param Field[] $fields + */ + private function writeRows(CsvWriter $writer, array $fields, GridViewInterface $gridView): void + { + /** @var PagerfantaInterface $paginator */ + $paginator = $gridView->getData(); + Assert::isInstanceOf($paginator, PagerfantaInterface::class); + + for ($currentPage = 1; $currentPage <= $paginator->getNbPages(); ++$currentPage) { + $paginator->setCurrentPage($currentPage); + $this->writePageResults($writer, $fields, $gridView, $paginator->getCurrentPageResults()); + } + } + + /** + * @param Field[] $fields + * @param iterable $pageResults + */ + private function writePageResults(CsvWriter $writer, array $fields, GridViewInterface $gridView, iterable $pageResults): void + { + foreach ($pageResults as $resource) { + $rows = []; + foreach ($fields as $field) { + $rows[] = $this->getFieldValue($gridView, $field, $resource); + } + $writer->writeItem($rows); + } + } + + private function getFieldValue(GridViewInterface $gridView, Field $field, object $data): string + { + $renderedData = $this->gridRenderer->renderField($gridView, $field, $data); + $renderedData = str_replace(PHP_EOL, '', $renderedData); + + return trim(strip_tags($renderedData)); + } + + /** + * @param Field[] $fields + * + * @return Field[] + */ + private function sortFields(array $fields): array + { + $sortedFields = $fields; + + uasort($sortedFields, fn (Field $fieldA, Field $fieldB) => $fieldA->getPosition() <=> $fieldB->getPosition()); + + return $sortedFields; + } +} +``` + +## Configure a new operation + +{% code title="src/Entity/Book.php" lineNumbers="true" %} +```php +addActionGroup( + MainActionGroup::create( + // ... + Action::create('export', 'export') + // Optional, you can configure it globally instead. + ->setTemplate('shared/grid/action/export.html.twig') + , + ) + ) + ; + } +} +``` +{% endcode %} + +## Create the export action Twig template + +You can configure the template for the export action + +{% code title="templates/shared/grid/action/export.html.twig" lineNumbers="true" %} +```twig +{% set path = options.link.url|default(path(options.link.route|default(grid.requestConfiguration.getRouteName('export')), options.link.parameters|default([]))) %} + +{% set message = action.label %} +{% if message is empty %} + {% set message = 'app.ui.export' %} +{% endif %} + + + {{ ux_icon(action.icon|default('iwwa:csv'), {class: 'icon dropdown-item-icon'}) }} + {{ message|trans }} + +``` +{% endcode %} + +## Configure the translation key + +In the export action Twig template, we have introduced the `app.ui.translation` translation key. +So we need to configure its translation. + +{% code title="translations/messages.en.yaml" lineNumbers="true" %} +```yaml +app: + ui: + # ... + export: Export +``` +{% endcode %} + +## Configure the export action template in the grid bundle globally + +If you do not want to repeat the `setTemplate` option in your grid configurations, you can configure it globally in the Grid bundle. + +{% code title="config/packages/sylius_grid.yaml" lineNumbers="true" %} +```yaml +sylius_grid: + templates: + action: + export: 'shared/grid/action/export.html.twig' +``` diff --git a/templates/shared/grid/action/export.html.twig b/templates/shared/grid/action/export.html.twig new file mode 100644 index 000000000..996af004d --- /dev/null +++ b/templates/shared/grid/action/export.html.twig @@ -0,0 +1,11 @@ +{% set path = options.link.url|default(path(options.link.route|default(grid.requestConfiguration.getRouteName('export')), options.link.parameters|default([]))) %} + +{% set message = action.label %} +{% if message is empty %} + {% set message = 'app.ui.export' %} +{% endif %} + + + {{ ux_icon(action.icon|default('iwwa:csv'), {class: 'icon dropdown-item-icon'}) }} + {{ message|trans }} + diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index 193a9c2e0..4ec6efa9f 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -14,6 +14,7 @@ app: configuration: Configuration edit_conference: Edit conference ends_at: Ends at + export: Export first_name: First name last_name: Last name library: Library diff --git a/translations/messages.fr.yaml b/translations/messages.fr.yaml index f74658d75..7075c7c7e 100644 --- a/translations/messages.fr.yaml +++ b/translations/messages.fr.yaml @@ -14,6 +14,7 @@ app: configuration: Configuration edit_conference: Modifier la conférence ends_at: Termine à + export: Export first_name: Prénom last_name: Nom de famille library: Bibliothèque From a25e909b45eccfe8edce5eb614e2951ab856dd7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Fr=C3=A9mont?= Date: Mon, 26 Jan 2026 22:57:39 +0100 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Estelle Gaits <74190794+stlgaits@users.noreply.github.com> --- docs/cookbook/admin_panel/grid_export.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/cookbook/admin_panel/grid_export.md b/docs/cookbook/admin_panel/grid_export.md index 2739ce63b..9bf7b1cfc 100644 --- a/docs/cookbook/admin_panel/grid_export.md +++ b/docs/cookbook/admin_panel/grid_export.md @@ -10,6 +10,7 @@ In this example, we'll create a CSV export. First, create the responder using the [https://github.com/portphp/csv](portphp/csv) package. +{% code title="src/Responder/ExportGridToCsvResponder.php" lineNumbers="true" %} ```php