Skip to content

Commit 439fa92

Browse files
authored
Merge pull request #1 from NoResponseMate/SYL-5115/limit-export-on-resources-and-sections
[Grid][Export] Limit export action to defined sections and resources
2 parents 80bec7d + db4cecd commit 439fa92

File tree

9 files changed

+161
-14
lines changed

9 files changed

+161
-14
lines changed

config/services.xml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@
88
<parameters>
99
<parameter key="sylius_import_export.export.form_class">Sylius\GridImportExport\Form\Type\ExportResourceType</parameter>
1010
<parameter key="sylius_grid_import_export.export_files_directory">%kernel.project_dir%/etc/export</parameter>
11+
12+
<!-- Temp parameters, should go through config tree -->
13+
<parameter key="sylius_import_export.grid.export.allowed_sections" type="collection">
14+
<parameter>admin</parameter>
15+
</parameter>
16+
<parameter key="sylius_import_export.grid.export.allowed_resources" type="collection">
17+
<parameter>sylius.product</parameter>
18+
<parameter>sylius.payment</parameter>
19+
<parameter>sylius.shipment</parameter>
20+
<parameter>sylius.order</parameter>
21+
<parameter>sylius.customer</parameter>
22+
<parameter>sylius_grid_import_export.process</parameter>
23+
</parameter>
24+
<!-- -->
1125
</parameters>
1226

1327
<services>
@@ -80,6 +94,13 @@
8094
<argument type="service" id=".inner" />
8195
</service>
8296

97+
<service id="sylius_import_export.grid.checker.exportable" class="Sylius\GridImportExport\Grid\Checker\ExportableChecker">
98+
<argument type="service" id="request_stack" />
99+
<argument type="service" id="sylius.resource_registry" />
100+
<argument>%sylius_import_export.grid.export.allowed_sections%</argument>
101+
<argument>%sylius_import_export.grid.export.allowed_resources%</argument>
102+
</service>
103+
83104
<service
84105
id="sylius_import_export.grid.array_to_definition_converter.common_event_dispatching"
85106
class="Sylius\GridImportExport\Grid\Definition\CommonEventDispatchingArrayToDefinitionConverter"
@@ -89,7 +110,9 @@
89110
<argument type="service" id=".inner" />
90111
</service>
91112

92-
<service id="sylius_import_export.listener.grid.admin.export_action" class="Sylius\GridImportExport\Grid\Listener\ExportActionAdminGridListener">
113+
<service id="sylius_import_export.listener.grid.admin.export_action" class="Sylius\Grid\Listener\ExportActionAdminGridListener">
114+
<argument type="service" id="sylius_import_export.grid.checker.exportable" />
115+
93116
<tag name="kernel.event_listener" event="sylius.grid.common" method="addExportMainAction" />
94117
</service>
95118

src/Controller/ExportAction.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ public function __invoke(Request $request, string $grid): Response
4040
$form = $this->formFactory->create($this->exportForm);
4141
$form->handleRequest($request);
4242

43-
$format = $form->getData()['format'];
44-
$resourceClass = $form->getData()['resourceClass'];
43+
$data = $form->getData();
44+
$format = $data['format'];
45+
$resourceClass = $data['resourceClass'];
4546

4647
$metadata = $this->metadataRegistry->getByClass($resourceClass);
4748

4849
$resourceIds = $this->resourcesIdsProvider->getResourceIds(
4950
metadata: $metadata,
50-
context: ['request' => $request],
51+
context: ['request' => $request, 'currentPage' => $data['currentPage'] ?? false],
5152
);
5253

5354
$this->commandBus->dispatch(new ExportCommand(

src/Form/Type/ExportResourceType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Symfony\Component\Form\AbstractType;
1717
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
18+
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
1819
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
1920
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
2021
use Symfony\Component\Form\FormBuilderInterface;
@@ -30,8 +31,12 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
3031
{
3132
$builder
3233
->add('format', ChoiceType::class, [
34+
'label' => 'sylius_grid_import_export.grid.form.format',
3335
'choice_loader' => $this->choiceLoader,
3436
])
37+
->add('currentPage', CheckboxType::class, [
38+
'label' => 'sylius_grid_import_export.grid.form.current_page',
39+
])
3540
->add('resourceClass', HiddenType::class)
3641
;
3742
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\GridImportExport\Grid\Checker;
15+
16+
use Sylius\Component\Grid\Definition\Grid;
17+
use Sylius\Resource\Metadata\RegistryInterface;
18+
use Symfony\Component\HttpFoundation\Request;
19+
use Symfony\Component\HttpFoundation\RequestStack;
20+
21+
final class ExportableChecker implements ExportableCheckerInterface
22+
{
23+
/**
24+
* @param array<array-key, string> $allowedSections
25+
* @param array<array-key, string> $allowedResources
26+
*/
27+
public function __construct(
28+
private RequestStack $requestStack,
29+
private RegistryInterface $resourceRegistry,
30+
private array $allowedSections,
31+
private array $allowedResources,
32+
) {
33+
}
34+
35+
public function canBeExported(Grid $grid): bool
36+
{
37+
$resourceClass = $grid->getDriverConfiguration()['class'] ?? null;
38+
if (null === $resourceClass) {
39+
return false;
40+
}
41+
42+
$request = $this->requestStack->getMainRequest();
43+
if (!$request instanceof Request) {
44+
return false;
45+
}
46+
47+
if (!$request->attributes->has('_sylius')) {
48+
return false;
49+
}
50+
51+
$syliusAttributes = $request->attributes->all()['_sylius'];
52+
if (!in_array($syliusAttributes['section'] ?? null, $this->allowedSections)) {
53+
return false;
54+
}
55+
56+
$resourceMetadata = $this->resourceRegistry->getByClass($resourceClass);
57+
58+
return in_array($resourceMetadata->getAlias(), $this->allowedResources);
59+
}
60+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\GridImportExport\Grid\Checker;
15+
16+
use Sylius\Component\Grid\Definition\Grid;
17+
18+
interface ExportableCheckerInterface
19+
{
20+
public function canBeExported(Grid $grid): bool;
21+
}

src/Grid/Listener/ExportActionAdminGridListener.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,30 @@
1313

1414
namespace Sylius\GridImportExport\Grid\Listener;
1515

16+
use Sylius\Bundle\GridBundle\Doctrine\ORM\Driver as ORMDriver;
1617
use Sylius\Component\Grid\Definition\Action;
1718
use Sylius\Component\Grid\Definition\ActionGroup;
1819
use Sylius\Component\Grid\Event\GridDefinitionConverterEvent;
20+
use Sylius\GridImportExport\Grid\Checker\ExportableCheckerInterface;
1921

20-
final class ExportActionAdminGridListener
22+
final readonly class ExportActionAdminGridListener
2123
{
24+
public function __construct(
25+
private ExportableCheckerInterface $exportableChecker,
26+
) {
27+
}
28+
2229
public function addExportMainAction(GridDefinitionConverterEvent $event): void
2330
{
2431
$grid = $event->getGrid();
32+
if (ORMDriver::NAME !== $grid->getDriver()) {
33+
return;
34+
}
35+
36+
if (!$this->exportableChecker->canBeExported($grid)) {
37+
return;
38+
}
39+
2540
if (!$grid->hasActionGroup('main')) {
2641
$grid->addActionGroup(ActionGroup::named('main'));
2742
}

src/Provider/RequestBasedResourcesIdsProvider.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ public function getResourceIds(MetadataInterface $metadata, array $context = [])
3838
throw new ProviderException('Request is missing from the context.');
3939
}
4040

41-
return $this->doGetResourceIds($metadata, $request);
41+
return $this->doGetResourceIds($metadata, $request, $context['currentPage'] ?? false);
4242
}
4343

44-
private function doGetResourceIds(MetadataInterface $metadata, Request $request): array
44+
private function doGetResourceIds(MetadataInterface $metadata, Request $request, bool $currentPage): array
4545
{
4646
$resourceClass = $metadata->getClass('model');
4747
/** @var RepositoryInterface $repository */
@@ -64,8 +64,16 @@ private function doGetResourceIds(MetadataInterface $metadata, Request $request)
6464
}
6565

6666
$ids = [];
67+
if ($currentPage) {
68+
foreach ($paginator->getCurrentPageResults() as $item) {
69+
$ids[] = (string) $item->getId();
70+
}
71+
72+
return $ids;
73+
}
74+
6775
foreach ($paginator->autoPagingIterator() as $item) {
68-
$ids[] = $item->getId();
76+
$ids[] = (string) $item->getId();
6977
}
7078

7179
return $ids;

templates/admin/import_export/component/export_form.html.twig

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
1-
{# Rendered with \Sylius\GridImportExport\GridImportExport\Twig\Component\ExportResourceFormComponent #}
1+
{# Rendered with \Sylius\GridImportExport\Twig\Component\ExportResourceFormComponent #}
22

33
{% import '@SyliusAdmin/shared/helper/button.html.twig' as button %}
44

55
{% form_theme form '@SyliusAdmin/shared/form_theme.html.twig' %}
66

7-
{% set criteria = app.request.query.all()['criteria']|default({}) %}
7+
{% set export_parameters = {
8+
'grid': grid,
9+
'criteria': app.request.query.all()['criteria']|default({}),
10+
} %}
11+
12+
{% set page = app.request.query.get('page', null) %}
13+
{% if page is not null %}
14+
{% set export_parameters = export_parameters|merge({'page': page}) %}
15+
{% endif %}
816

917
<div class="dropdown">
10-
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
11-
{{ 'sylius_grid_import_export.ui.export'|trans }}
12-
</button>
18+
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
19+
{{ 'sylius_grid_import_export.ui.export'|trans }}
20+
</button>
1321
<div class="dropdown-menu p-4">
14-
{{ form_start(form, {'action': path('sylius_import_export.admin.resource.export', {'grid': grid, 'criteria': criteria}), 'attr': {'novalidate': 'novalidate'}}) }}
22+
{{ form_start(form, {'action': path('sylius_import_export.admin.resource.export', export_parameters), 'attr': {'novalidate': 'novalidate'}}) }}
1523

1624
<div class="mb-3">
1725
{{ form_row(form.format) }}
26+
{{ form_row(form.currentPage) }}
1827
</div>
1928

2029
<div class="d-flex justify-content-end">

translations/messages.en.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
sylius_grid_import_export:
2+
grid:
3+
form:
4+
export: Export
5+
format: Format
6+
current_page: Current page
27
ui:
38
export: "Export"
49
import_export: "Import / export"

0 commit comments

Comments
 (0)