Skip to content

Commit 0d6c2aa

Browse files
Add configuration and improve section resolving
1 parent f33078f commit 0d6c2aa

File tree

10 files changed

+161
-42
lines changed

10 files changed

+161
-42
lines changed

config/services/grid.xml

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,10 @@
55
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
66
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
77
>
8-
<parameters>
9-
<!-- Temp parameters, should go through config tree -->
10-
<parameter key="sylius_import_export.grid.export.allowed_sections" type="collection">
11-
<parameter>admin</parameter>
12-
</parameter>
13-
<parameter key="sylius_import_export.grid.export.allowed_resources" type="collection">
14-
<parameter>sylius.product</parameter>
15-
<parameter>sylius.payment</parameter>
16-
<parameter>sylius.shipment</parameter>
17-
<parameter>sylius.order</parameter>
18-
<parameter>sylius.customer</parameter>
19-
<parameter>sylius_grid_import_export.process</parameter>
20-
</parameter>
21-
<!-- -->
22-
</parameters>
23-
248
<services>
259
<service id="sylius_import_export.grid.checker.exportable" class="Sylius\GridImportExport\Grid\Checker\ExportableChecker">
26-
<argument type="service" id="request_stack" />
2710
<argument type="service" id="sylius.resource_registry" />
28-
<argument>%sylius_import_export.grid.export.allowed_sections%</argument>
29-
<argument>%sylius_import_export.grid.export.allowed_resources%</argument>
11+
<argument>%sylius_import_export.export.resources%</argument>
3012
</service>
3113

3214
<service
@@ -39,6 +21,8 @@
3921
</service>
4022

4123
<service id="sylius_import_export.grid.listener.admin.export_action" class="Sylius\GridImportExport\Grid\Listener\ExportActionAdminGridListener">
24+
<argument type="service" id="request_stack" />
25+
<argument type="service" id="sylius.section_resolver.uri_based" on-invalid="null" />
4226
<argument type="service" id="sylius_import_export.grid.checker.exportable" />
4327

4428
<tag name="kernel.event_listener" event="sylius.grid.common" method="addExportActions" />

phpstan.neon

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ parameters:
77
ignoreErrors:
88
- identifier: missingType.generics
99
- identifier: missingType.iterableValue
10+
11+
excludePaths:
12+
- '%currentWorkingDirectory%/src/DependencyInjection/Configuration.php'

src/Controller/ExportAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Sylius\GridImportExport\Provider\ResourceIds\ResourcesIdsProviderInterface;
2020
use Sylius\Resource\Metadata\RegistryInterface;
2121
use Symfony\Component\Form\FormFactoryInterface;
22+
use Symfony\Component\Form\FormInterface;
2223
use Symfony\Component\HttpFoundation\RedirectResponse;
2324
use Symfony\Component\HttpFoundation\Request;
2425
use Symfony\Component\HttpFoundation\Response;
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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\DependencyInjection;
15+
16+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
18+
use Symfony\Component\Config\Definition\ConfigurationInterface;
19+
20+
final class Configuration implements ConfigurationInterface
21+
{
22+
public function getConfigTreeBuilder(): TreeBuilder
23+
{
24+
$treeBuilder = new TreeBuilder('sylius_grid_import_export');
25+
26+
/** @var ArrayNodeDefinition $rootNode */
27+
$rootNode = $treeBuilder->getRootNode();
28+
29+
$this->addExportConfiguration($rootNode);
30+
31+
return $treeBuilder;
32+
}
33+
34+
private function addExportConfiguration(ArrayNodeDefinition $node): void
35+
{
36+
$node
37+
->children()
38+
->arrayNode('export')
39+
->isRequired()
40+
->children()
41+
->scalarNode('default_provider')
42+
->defaultValue('orm')
43+
->cannotBeEmpty()
44+
->end()
45+
->scalarNode('default_section')
46+
->defaultValue('admin')
47+
->cannotBeEmpty()
48+
->end()
49+
->arrayNode('resources')
50+
->useAttributeAsKey('name')
51+
->normalizeKeys(false)
52+
->arrayPrototype()
53+
->beforeNormalization()
54+
->ifNull()
55+
->then(function () {
56+
return [];
57+
})
58+
->end()
59+
->children()
60+
->scalarNode('provider')
61+
->defaultNull()
62+
->end()
63+
->arrayNode('sections')
64+
->scalarPrototype()->end()
65+
->defaultValue([])
66+
->end()
67+
->end()
68+
->end()
69+
->end() // resources
70+
->end()
71+
->end() // export
72+
->end()
73+
;
74+
}
75+
}

src/DependencyInjection/SyliusGridImportExportExtension.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,29 @@ final class SyliusGridImportExportExtension extends Extension
2222
{
2323
public function load(array $configs, ContainerBuilder $container): void
2424
{
25+
$configuration = $this->processConfiguration(new Configuration(), $configs);
26+
27+
$this->processExportConfig($container, $configuration);
28+
2529
$loader = new XmlFileLoader($container, new FileLocator(dirname(__DIR__, 2) . '/config/'));
2630
$loader->load('services.xml');
2731
}
32+
33+
private function processExportConfig(ContainerBuilder $container, array &$config): void
34+
{
35+
$defaultProvider = $config['export']['default_provider'];
36+
$defaultSection = $config['export']['default_section'];
37+
38+
foreach ($config['export']['resources'] as $name => &$resource) {
39+
if (null === $resource['provider']) {
40+
$resource['provider'] = $defaultProvider;
41+
}
42+
if ([] === $resource['sections']) {
43+
$resource['sections'][] = $defaultSection;
44+
}
45+
}
46+
47+
$container->setParameter('sylius_import_export.export.default_provider', $defaultProvider);
48+
$container->setParameter('sylius_import_export.export.resources', $config['export']['resources']);
49+
}
2850
}

src/Grid/Checker/ExportableChecker.php

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,40 @@
1515

1616
use Sylius\Component\Grid\Definition\Grid;
1717
use Sylius\Resource\Metadata\RegistryInterface;
18-
use Symfony\Component\HttpFoundation\Request;
19-
use Symfony\Component\HttpFoundation\RequestStack;
2018

21-
final class ExportableChecker implements ExportableCheckerInterface
19+
final readonly class ExportableChecker implements ExportableCheckerInterface
2220
{
23-
/**
24-
* @param array<array-key, string> $allowedSections
25-
* @param array<array-key, string> $allowedResources
26-
*/
21+
/** @param array<string, array{provider: string, sections: string[]}> $exportResourcesConfig */
2722
public function __construct(
28-
private RequestStack $requestStack,
2923
private RegistryInterface $resourceRegistry,
30-
private array $allowedSections,
31-
private array $allowedResources,
24+
private array $exportResourcesConfig,
3225
) {
3326
}
3427

35-
public function canBeExported(Grid $grid): bool
28+
public function canBeExported(Grid $grid, object|string|null $section): bool
3629
{
3730
$resourceClass = $grid->getDriverConfiguration()['class'] ?? null;
3831
if (null === $resourceClass) {
3932
return false;
4033
}
4134

42-
$request = $this->requestStack->getMainRequest();
43-
if (!$request instanceof Request) {
44-
return false;
35+
if (null === $section) {
36+
return true;
4537
}
4638

47-
if (!$request->attributes->has('_sylius')) {
48-
return false;
49-
}
39+
$resourceAlias = $this->resourceRegistry->getByClass($resourceClass)->getAlias();
5040

51-
$syliusAttributes = $request->attributes->all()['_sylius'];
52-
if (!in_array($syliusAttributes['section'] ?? null, $this->allowedSections)) {
41+
$resourceConfig = $this->exportResourcesConfig[$resourceAlias] ?? false;
42+
if (false === $resourceConfig) {
5343
return false;
5444
}
5545

56-
$resourceMetadata = $this->resourceRegistry->getByClass($resourceClass);
46+
foreach ($resourceConfig['sections'] as $configSection) {
47+
if (is_a($section, $configSection, true) || $section === $configSection) {
48+
return true;
49+
}
50+
}
5751

58-
return in_array($resourceMetadata->getAlias(), $this->allowedResources);
52+
return false;
5953
}
6054
}

src/Grid/Checker/ExportableCheckerInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717

1818
interface ExportableCheckerInterface
1919
{
20-
public function canBeExported(Grid $grid): bool;
20+
public function canBeExported(Grid $grid, object|string|null $section): bool;
2121
}

src/Grid/Listener/ExportActionAdminGridListener.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@
1313

1414
namespace Sylius\GridImportExport\Grid\Listener;
1515

16+
use Sylius\Bundle\CoreBundle\SectionResolver\SectionProviderInterface;
1617
use Sylius\Bundle\GridBundle\Builder\ActionGroup\ActionGroupInterface;
1718
use Sylius\Bundle\GridBundle\Doctrine\ORM\Driver as ORMDriver;
1819
use Sylius\Component\Grid\Definition\Action;
1920
use Sylius\Component\Grid\Definition\ActionGroup;
2021
use Sylius\Component\Grid\Definition\Grid;
2122
use Sylius\Component\Grid\Event\GridDefinitionConverterEvent;
2223
use Sylius\GridImportExport\Grid\Checker\ExportableCheckerInterface;
24+
use Symfony\Component\HttpFoundation\RequestStack;
2325

2426
final readonly class ExportActionAdminGridListener
2527
{
2628
private const EXPORT_ACTION_NAME = 'export';
2729

2830
public function __construct(
31+
private RequestStack $requestStack,
32+
private ?SectionProviderInterface $sectionProvider,
2933
private ExportableCheckerInterface $exportableChecker,
3034
) {
3135
}
@@ -37,10 +41,12 @@ public function addExportActions(GridDefinitionConverterEvent $event): void
3741
return;
3842
}
3943

40-
if (!$this->exportableChecker->canBeExported($grid)) {
44+
$section = $this->sectionProvider?->getSection() ?? $this->getRouteSection();
45+
if ($this->exportableChecker->canBeExported($grid, $section)) {
4146
return;
4247
}
4348

49+
// Introduce config for each case, default both
4450
$this->addInActionGroup($grid, ActionGroupInterface::MAIN_GROUP);
4551
$this->addInActionGroup($grid, ActionGroupInterface::BULK_GROUP);
4652
}
@@ -60,4 +66,14 @@ private function addInActionGroup(Grid $grid, string $groupName): void
6066

6167
$actionGroup->addAction($action);
6268
}
69+
70+
private function getRouteSection(): ?string
71+
{
72+
$request = $this->requestStack->getMainRequest();
73+
if (null === $request) {
74+
return null;
75+
}
76+
77+
return $request->attributes->all()['_sylius']['section'] ?? null;
78+
}
6379
}

src/Provider/ResourceData/GridResourceDataProvider.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
<?php
22

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+
312
declare(strict_types=1);
413

514
namespace Sylius\GridImportExport\Provider\ResourceData;

tests/TestApplication/config/config.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,18 @@ parameters:
88
twig:
99
paths:
1010
'%kernel.project_dir%/../../../tests/TestApplication/templates': ~
11+
12+
sylius_grid_import_export:
13+
export:
14+
default_provider: 'sylius_import_export.provider.resource_data.grid'
15+
default_section: 'admin'
16+
resources:
17+
sylius.order:
18+
sections:
19+
- 'Sylius\Bundle\AdminBundle\SectionResolver\AdminSection'
20+
sylius.customer:
21+
provider: 'sylius_import_export.provider.resource_data.dbal'
22+
sylius.promotion: ~
23+
sylius.product: ~
24+
sylius.shipment: ~
25+
sylius_grid_import_export.process: ~

0 commit comments

Comments
 (0)