Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 8 additions & 77 deletions config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,70 +5,21 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<parameters>
<parameter key="sylius_import_export.export.form_class">Sylius\GridImportExport\Form\Type\ExportResourceType</parameter>
<parameter key="sylius_grid_import_export.export_files_directory">%kernel.project_dir%/etc/export</parameter>

<!-- Temp parameters, should go through config tree -->
<parameter key="sylius_import_export.grid.export.allowed_sections" type="collection">
<parameter>admin</parameter>
</parameter>
<parameter key="sylius_import_export.grid.export.allowed_resources" type="collection">
<parameter>sylius.product</parameter>
<parameter>sylius.payment</parameter>
<parameter>sylius.shipment</parameter>
<parameter>sylius.order</parameter>
<parameter>sylius.customer</parameter>
<parameter>sylius_grid_import_export.process</parameter>
</parameter>
<!-- -->
</parameters>
<imports>
<import resource="services/**.xml" />
</imports>

<services>
<service id="sylius_grid_import_export.exporter.csv" class="Sylius\GridImportExport\Exporter\CsvExporter">
<argument type="string">%sylius_grid_import_export.export_files_directory%</argument>
<tag name="sylius.grid_import_export.exporter" format="csv" />
</service>

<service id="sylius_grid_import_export.exporter.json" class="Sylius\GridImportExport\Exporter\JsonExporter">
<argument type="string">%sylius_grid_import_export.export_files_directory%</argument>
<tag name="sylius.grid_import_export.exporter" format="json" />
</service>

<service id="sylius_grid_import_export.exporter_resolver" class="Sylius\GridImportExport\Resolver\ExporterResolver">
<argument type="tagged_locator" tag="sylius.grid_import_export.exporter" index-by="format" />
</service>
<service id="Sylius\GridImportExport\Resolver\ExporterResolverInterface" alias="sylius_grid_import_export.exporter_resolver" />

<service id="sylius_import_export.provider.resource_data.default" class="Sylius\GridImportExport\Provider\DefaultResourceDataProvider">
<argument type="service" id="doctrine.orm.entity_manager" />
</service>

<service id="sylius_import_export.provider.resources_ids.request_based" class="Sylius\GridImportExport\Provider\RequestBasedResourcesIdsProvider">
<argument type="service" id="sylius.resource_controller.request_configuration_factory" />
<argument type="service" id="sylius.resource_controller.resources_collection_provider" />
<argument type="service" id="doctrine.orm.entity_manager" />
</service>

<service id="sylius_import_export.messenger.command_handler.export" class="Sylius\GridImportExport\Messenger\Handler\ExportCommandHandler">
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius_import_export.custom_factory.process" />
<argument type="service" id="sylius_grid_import_export.repository.process" />
<argument type="service" id="sylius_import_export.provider.resource_data.default" />
<argument type="service" id="sylius_import_export.registry.resource_data_provider" />
<argument type="service" id="sylius_grid_import_export.exporter_resolver" />

<tag name="messenger.message_handler" bus="sylius.command_bus" />
</service>

<service id="sylius_import_export.form.choice_loader.export_formats" class="Sylius\GridImportExport\Form\ChoiceLoader\ExportFormatsChoiceLoader">
<argument type="tagged_iterator" tag="sylius.grid_import_export.exporter" index-by="format" />
</service>

<service id="sylius_import_export.form.type.export" class="Sylius\GridImportExport\Form\Type\ExportResourceType">
<argument type="service" id="sylius_import_export.form.choice_loader.export_formats" />

<tag name="form.type" />
</service>

<service id="sylius_import_export.twig.component.export_resource" class="Sylius\GridImportExport\Twig\Component\ExportResourceFormComponent">
<argument type="service" id="form.factory" />
<argument>%sylius_import_export.export.form_class%</argument>
Expand All @@ -93,7 +44,9 @@

<service id="sylius_import_export.controller.export_action" class="Sylius\GridImportExport\Controller\ExportAction" public="true">
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius_import_export.provider.resources_ids.request_based" />
<argument type="service" id="sylius.grid.chain_provider" />
<argument type="service" id="sylius.resource_controller.parameters_parser" />
<argument type="service" id="sylius_import_export.provider.resources_ids" />
<argument type="service" id="form.factory" />
<argument type="service" id="sylius.command_bus" />
<argument>%sylius_import_export.export.form_class%</argument>
Expand All @@ -105,28 +58,6 @@
<argument type="service" id=".inner" />
</service>

<service id="sylius_import_export.grid.checker.exportable" class="Sylius\GridImportExport\Grid\Checker\ExportableChecker">
<argument type="service" id="request_stack" />
<argument type="service" id="sylius.resource_registry" />
<argument>%sylius_import_export.grid.export.allowed_sections%</argument>
<argument>%sylius_import_export.grid.export.allowed_resources%</argument>
</service>

<service
id="sylius_import_export.grid.array_to_definition_converter.common_event_dispatching"
class="Sylius\GridImportExport\Grid\Definition\CommonEventDispatchingArrayToDefinitionConverter"
decorates="sylius.grid.array_to_definition_converter"
>
<argument type="service" id="event_dispatcher" />
<argument type="service" id=".inner" />
</service>

<service id="sylius_import_export.grid.listener.admin.export_action" class="Sylius\GridImportExport\Grid\Listener\ExportActionAdminGridListener">
<argument type="service" id="sylius_import_export.grid.checker.exportable" />

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

<service id="sylius_grid_import_export.menu.admin_listener" class="Sylius\GridImportExport\Menu\AdminImportExportMenuListener">
<argument type="service" id="sylius_grid_import_export.menu.reorder" />
<tag name="kernel.event_listener" method="buildMenu" event="sylius.menu.admin.main" />
Expand Down
28 changes: 28 additions & 0 deletions config/services/exporter.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>

<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<parameters>
<parameter key="sylius_grid_import_export.export_files_directory">%kernel.project_dir%/etc/export</parameter>
</parameters>

<services>
<service id="sylius_grid_import_export.exporter.csv" class="Sylius\GridImportExport\Exporter\CsvExporter">
<argument type="string">%sylius_grid_import_export.export_files_directory%</argument>
<tag name="sylius.grid_import_export.exporter" format="csv" />
</service>

<service id="sylius_grid_import_export.exporter.json" class="Sylius\GridImportExport\Exporter\JsonExporter">
<argument type="string">%sylius_grid_import_export.export_files_directory%</argument>
<tag name="sylius.grid_import_export.exporter" format="json" />
</service>

<service id="sylius_grid_import_export.exporter_resolver" class="Sylius\GridImportExport\Resolver\ExporterResolver">
<argument type="tagged_locator" tag="sylius.grid_import_export.exporter" index-by="format" />
</service>
<service id="Sylius\GridImportExport\Resolver\ExporterResolverInterface" alias="sylius_grid_import_export.exporter_resolver" />
</services>
</container>
23 changes: 23 additions & 0 deletions config/services/form.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>

<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<parameters>
<parameter key="sylius_import_export.export.form_class">Sylius\GridImportExport\Form\Type\ExportResourceType</parameter>
</parameters>

<services>
<service id="sylius_import_export.form.choice_loader.export_formats" class="Sylius\GridImportExport\Form\ChoiceLoader\ExportFormatsChoiceLoader">
<argument type="tagged_iterator" tag="sylius.grid_import_export.exporter" index-by="format" />
</service>

<service id="sylius_import_export.form.type.export" class="Sylius\GridImportExport\Form\Type\ExportResourceType">
<argument type="service" id="sylius_import_export.form.choice_loader.export_formats" />

<tag name="form.type" />
</service>
</services>
</container>
31 changes: 31 additions & 0 deletions config/services/grid.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>

<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<service id="sylius_import_export.grid.checker.exportable" class="Sylius\GridImportExport\Grid\Checker\ExportableChecker">
<argument type="service" id="sylius.resource_registry" />
<argument>%sylius_import_export.export.resources%</argument>
</service>

<service
id="sylius_import_export.grid.array_to_definition_converter.common_event_dispatching"
class="Sylius\GridImportExport\Grid\Definition\CommonEventDispatchingArrayToDefinitionConverter"
decorates="sylius.grid.array_to_definition_converter"
>
<argument type="service" id="event_dispatcher" />
<argument type="service" id=".inner" />
</service>

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

<tag name="kernel.event_listener" event="sylius.grid.common" method="addExportActions" />
</service>
</services>
</container>
43 changes: 43 additions & 0 deletions config/services/provider.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" ?>

<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"
>
<services>
<service id="sylius_import_export.registry.resource_data_provider" class="Sylius\GridImportExport\Provider\Registry\ResourceDataProviderRegistry">
<argument>%sylius_import_export.export.resources%</argument>
<argument type="tagged_iterator" tag="sylius_import_export.resource_data_provider" index-by="service" />
</service>

<service id="sylius_import_export.provider.resource_data.dbal" class="Sylius\GridImportExport\Provider\ResourceData\DbalResourceDataProvider">
<argument type="service" id="doctrine.orm.entity_manager" />

<tag name="sylius_import_export.resource_data_provider" />
</service>

<service id="sylius_import_export.provider.resource_data.grid" class="Sylius\GridImportExport\Provider\ResourceData\GridResourceDataProvider">
<argument type="service" id="sylius.grid.chain_provider" />
<argument type="service" id="sylius.grid.data_source_provider" />

<tag name="sylius_import_export.resource_data_provider" />
</service>

<service id="sylius_import_export.provider.resources_ids" class="Sylius\GridImportExport\Provider\ResourceIds\CompositeResourceIdsProvider">
<argument type="tagged_iterator" tag="sylius_import_export.resource_ids_provider" />
</service>

<service id="sylius_import_export.provider.resources_ids.request_based" class="Sylius\GridImportExport\Provider\ResourceIds\RequestBasedResourcesIdsProvider">
<argument type="service" id="sylius.resource_controller.request_configuration_factory" />
<argument type="service" id="sylius.resource_controller.resources_collection_provider" />
<argument type="service" id="doctrine.orm.entity_manager" />

<tag name="sylius_import_export.resource_ids_provider" />
</service>

<service id="sylius_import_export.provider.resources_ids.static" class="Sylius\GridImportExport\Provider\ResourceIds\StaticResourceIdsProvider">
<tag name="sylius_import_export.resource_ids_provider" priority="512" />
</service>
</services>
</container>
3 changes: 3 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ parameters:
ignoreErrors:
- identifier: missingType.generics
- identifier: missingType.iterableValue

excludePaths:
- '%currentWorkingDirectory%/src/DependencyInjection/Configuration.php'
37 changes: 20 additions & 17 deletions src/Controller/ExportAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@

namespace Sylius\GridImportExport\Controller;

use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
use Sylius\Component\Grid\Provider\GridProviderInterface;
use Sylius\GridImportExport\Messenger\Command\ExportCommand;
use Sylius\GridImportExport\Provider\ResourcesIdsProviderInterface;
use Sylius\GridImportExport\Provider\ResourceIds\ResourcesIdsProviderInterface;
use Sylius\Resource\Metadata\RegistryInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
Expand All @@ -26,6 +28,8 @@ final class ExportAction
{
public function __construct(
private RegistryInterface $metadataRegistry,
private GridProviderInterface $gridProvider,
private ParametersParserInterface $parametersParser,
private ResourcesIdsProviderInterface $resourcesIdsProvider,
private FormFactoryInterface $formFactory,
private MessageBusInterface $commandBus,
Expand All @@ -44,28 +48,27 @@ public function __invoke(Request $request, string $grid): Response
$format = $data['format'];
$resourceClass = $data['resourceClass'];

$resourceIds = $this->resolveResourceIds($request, $data);
$metadata = $this->metadataRegistry->getByClass($resourceClass);
$gridConfiguration = $this->gridProvider->get($grid);

$resourceIds = $this->resourcesIdsProvider->getResourceIds(
metadata: $metadata,
context: ['request' => $request, 'ids' => $data['ids'] ?? []],
);

$parameters = $this->parametersParser->parseRequestValues(
$gridConfiguration->getDriverConfiguration(),
$request,
);

$this->commandBus->dispatch(new ExportCommand(
resource: $resourceClass,
resource: $metadata->getAlias(),
grid: $grid,
format: $format,
resourceIds: $resourceIds,
parameters: $parameters,
));

return new RedirectResponse($request->headers->get('referer') ?? '/');
}

private function resolveResourceIds(Request $request, array $formData): array
{
if (isset($formData['ids']) && [] !== $formData['ids']) {
return $formData['ids'];
}

$metadata = $this->metadataRegistry->getByClass($formData['resourceClass']);

return $this->resourcesIdsProvider->getResourceIds(
metadata: $metadata,
context: ['request' => $request],
);
}
}
75 changes: 75 additions & 0 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\GridImportExport\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('sylius_grid_import_export');

/** @var ArrayNodeDefinition $rootNode */
$rootNode = $treeBuilder->getRootNode();

$this->addExportConfiguration($rootNode);

return $treeBuilder;
}

private function addExportConfiguration(ArrayNodeDefinition $node): void
{
$node
->children()
->arrayNode('export')
->isRequired()
->children()
->scalarNode('default_provider')
->defaultValue('sylius_import_export.provider.resource_data.grid')
->cannotBeEmpty()
->end()
->scalarNode('default_section')
->defaultValue('admin')
->cannotBeEmpty()
->end()
->arrayNode('resources')
->useAttributeAsKey('name')
->normalizeKeys(false)
->arrayPrototype()
->beforeNormalization()
->ifNull()
->then(function () {
return [];
})
->end()
->children()
->scalarNode('provider')
->defaultNull()
->end()
->arrayNode('sections')
->scalarPrototype()->end()
->defaultValue([])
->end()
->end()
->end()
->end() // resources
->end()
->end() // export
->end()
;
}
}
Loading