diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 18959379..18ec6313 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -14,8 +14,8 @@ jobs: strategy: matrix: - php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + php: [ 8.1, 8.2, 8.3 ] + pimcore: [ ^11.1, ^11.2, ^11.3 ] dependencies: [ highest ] exclude: - php: 8.1 diff --git a/src/DataDefinitionsBundle/Command/ConvertExportDefinitionsToYaml.php b/src/DataDefinitionsBundle/Command/ConvertExportDefinitionsToYaml.php new file mode 100644 index 00000000..5de979d9 --- /dev/null +++ b/src/DataDefinitionsBundle/Command/ConvertExportDefinitionsToYaml.php @@ -0,0 +1,47 @@ +setName('data-definition:configuration:exporter:convert-to-yaml') + ->setDescription('Convert export definitions file to YAML files') + ->setHelp('This command converts export definitions file to YAML') + ->addArgument('file', InputArgument::OPTIONAL, 'Path to the PHP file', 'var/config/exportdefinitions.php'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $filePath = $input->getArgument('file'); + $data = require $filePath; + + foreach ($data as $entry) { + + $fileName = $entry['id'] . '.yaml'; + + $yamlData = [ + 'data_definitions' => [ + 'export_definitions' => [ + $entry['id'] => $entry + ] + ] + ]; + + $yaml = Yaml::dump($yamlData, 4, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK); + file_put_contents("var/config/export-definitions/{$fileName}", $yaml); + } + $output->writeln('YAML export definitions are generated under: var/config/export-definitions'); + + return Command::SUCCESS; + } +} diff --git a/src/DataDefinitionsBundle/Command/ConvertImportDefinitionsToYaml.php b/src/DataDefinitionsBundle/Command/ConvertImportDefinitionsToYaml.php new file mode 100644 index 00000000..c21bf20c --- /dev/null +++ b/src/DataDefinitionsBundle/Command/ConvertImportDefinitionsToYaml.php @@ -0,0 +1,46 @@ +setName('data-definition:configuration:importer:convert-to-yaml') + ->setDescription('Convert convert import file definitions to YAML files') + ->setHelp('This command converts convert import file definitions file to YAML files') + ->addArgument('file', InputArgument::OPTIONAL, 'Path to the PHP file', 'var/config/importdefinitions.php'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $filePath = $input->getArgument('file'); + $data = require $filePath; + + foreach ($data as $entry) { + + $fileName = $entry['id'] . '.yaml'; + $yamlData = [ + 'data_definitions' => [ + 'import_definitions' => [ + $entry['id'] => $entry + ] + ] + ]; + + $yaml = Yaml::dump($yamlData, 4, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK); + + file_put_contents("var/config/import-definitions/{$fileName}", $yaml); + } + $output->writeln('YAML import definitions configurations are generated under: var/config/import-definitions'); + + return Command::SUCCESS; + } +} diff --git a/src/DataDefinitionsBundle/Command/ImportAsyncCommand.php b/src/DataDefinitionsBundle/Command/ImportAsyncCommand.php index d74e908c..c7edb957 100644 --- a/src/DataDefinitionsBundle/Command/ImportAsyncCommand.php +++ b/src/DataDefinitionsBundle/Command/ImportAsyncCommand.php @@ -68,8 +68,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $params['userId'] = 0; } - $inputDefinition = $input->getOption('definition'); - $definition = $this->repository->findByName((string)$inputDefinition); + try { + $definition = $this->repository->find($input->getOption('definition')); + } catch (InvalidArgumentException $e) { + $definition = $this->repository->findByName($input->getOption('definition')); + } if (!$definition instanceof ImportDefinitionInterface) { throw new Exception('Import Definition not found'); diff --git a/src/DataDefinitionsBundle/Controller/AbstractDefinitionController.php b/src/DataDefinitionsBundle/Controller/AbstractDefinitionController.php index 8cf9e6de..b8dbb642 100644 --- a/src/DataDefinitionsBundle/Controller/AbstractDefinitionController.php +++ b/src/DataDefinitionsBundle/Controller/AbstractDefinitionController.php @@ -18,7 +18,6 @@ use CoreShop\Bundle\ResourceBundle\Controller\ResourceController; use CoreShop\Component\Resource\Model\ResourceInterface; -use Instride\Bundle\DataDefinitionsBundle\Repository\DefinitionRepository; use Pimcore\Model\DataObject; use Pimcore\Tool; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -26,12 +25,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Instride\Bundle\DataDefinitionsBundle\Model\ExportDefinitionInterface; -use Instride\Bundle\DataDefinitionsBundle\Model\ExportMapping\FromColumn; -/** - * @property DefinitionRepository $repository - */ abstract class AbstractDefinitionController extends ResourceController { public function getAction(Request $request): JsonResponse @@ -42,15 +36,4 @@ public function getAction(Request $request): JsonResponse return $this->viewHandler->handle(['data' => $resources, 'success' => true], ['group' => 'Detailed']); } - - protected function findOr404(int|string $id): ResourceInterface - { - $model = $this->repository->findByName((string)$id); - - if (null === $model || !$model instanceof ResourceInterface) { - throw new NotFoundHttpException(sprintf('The "%s" has not been found', $id)); - } - - return $model; - } } diff --git a/src/DataDefinitionsBundle/Controller/ExportDefinitionController.php b/src/DataDefinitionsBundle/Controller/ExportDefinitionController.php index 6b1b7e8d..83de7ce0 100644 --- a/src/DataDefinitionsBundle/Controller/ExportDefinitionController.php +++ b/src/DataDefinitionsBundle/Controller/ExportDefinitionController.php @@ -60,10 +60,10 @@ public function getConfigAction(): JsonResponse public function exportAction(Request $request): Response { - $id = $request->get('id'); + $id = (int)$request->get('id'); if ($id) { - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if ($definition instanceof ExportDefinitionInterface) { @@ -92,14 +92,15 @@ public function exportAction(Request $request): Response public function importAction(Request $request): JsonResponse { $id = (int)$request->get('id'); - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if ($id && $definition instanceof ExportDefinitionInterface && $request->files->has('Filedata')) { $uploadedFile = $request->files->get('Filedata'); if ($uploadedFile instanceof UploadedFile) { $jsonContent = file_get_contents($uploadedFile->getPathname()); - $data = $this->decodeJson($jsonContent, false); + $data = $this->decodeJson($jsonContent, false,[],false); + $form = $this->resourceFormFactory->create($this->metadata, $definition); $handledForm = $form->submit($data); @@ -120,8 +121,8 @@ public function importAction(Request $request): JsonResponse public function duplicateAction(Request $request): JsonResponse { - $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $id = (int)$request->get('id'); + $definition = $this->repository->find($id); $name = (string)$request->get('name'); if ($definition instanceof ExportDefinitionInterface && $name) { @@ -141,7 +142,7 @@ public function duplicateAction(Request $request): JsonResponse public function getColumnsAction(Request $request): JsonResponse { $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if (!$definition instanceof ExportDefinitionInterface || !$definition->getClass()) { return $this->viewHandler->handle(['success' => false]); diff --git a/src/DataDefinitionsBundle/Controller/ImportDefinitionController.php b/src/DataDefinitionsBundle/Controller/ImportDefinitionController.php index b8545cd3..6e591cbe 100644 --- a/src/DataDefinitionsBundle/Controller/ImportDefinitionController.php +++ b/src/DataDefinitionsBundle/Controller/ImportDefinitionController.php @@ -70,7 +70,7 @@ public function getConfigAction(): JsonResponse public function testDataAction(Request $request): JsonResponse { $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if ($definition instanceof ImportDefinitionInterface) { try { @@ -92,7 +92,7 @@ public function testDataAction(Request $request): JsonResponse public function getColumnsAction(Request $request): JsonResponse { $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if ($definition instanceof ImportDefinitionInterface && $definition->getClass()) { $customFromColumn = new FromColumn(); @@ -193,10 +193,10 @@ public function getColumnsAction(Request $request): JsonResponse public function exportAction(Request $request): Response { - $id = $request->get('id'); + $id = (int)$request->get('id'); if ($id) { - $definition = $this->repository->findByName($id); + $definition = $this->repository->find($id); if ($definition instanceof ImportDefinitionInterface) { @@ -224,15 +224,15 @@ public function exportAction(Request $request): Response public function importAction(Request $request): JsonResponse { - $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $id = (int)$request->get('id'); + $definition = $this->repository->find($id); if ($id && $definition instanceof ImportDefinitionInterface && $request->files->has('Filedata')) { $uploadedFile = $request->files->get('Filedata'); if ($uploadedFile instanceof UploadedFile) { $jsonContent = file_get_contents($uploadedFile->getPathname()); - $data = $this->decodeJson($jsonContent, false); + $data = $this->decodeJson($jsonContent, false,[],false); $form = $this->resourceFormFactory->create($this->metadata, $definition); $handledForm = $form->submit($data); @@ -253,8 +253,8 @@ public function importAction(Request $request): JsonResponse public function duplicateAction(Request $request): JsonResponse { - $id = $request->get('id'); - $definition = $this->repository->findByName($id); + $id = (int)$request->get('id'); + $definition = $this->repository->find($id); $name = (string)$request->get('name'); if ($definition instanceof ImportDefinitionInterface && $name) { diff --git a/src/DataDefinitionsBundle/DependencyInjection/Configuration.php b/src/DataDefinitionsBundle/DependencyInjection/Configuration.php index 5ae0cee9..7f51aa6b 100644 --- a/src/DataDefinitionsBundle/DependencyInjection/Configuration.php +++ b/src/DataDefinitionsBundle/DependencyInjection/Configuration.php @@ -55,6 +55,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->normalizeKeys(false) ->prototype('array') ->children() + ->integerNode('id')->end() ->scalarNode('name')->end() ->scalarNode('provider')->end() ->scalarNode('class')->end() @@ -98,6 +99,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->normalizeKeys(false) ->prototype('array') ->children() + ->integerNode('id')->end() ->scalarNode('name')->end() ->scalarNode('fetcher')->end() ->variableNode('fetcherConfig')->end() diff --git a/src/DataDefinitionsBundle/Form/Type/DefinitionChoiceType.php b/src/DataDefinitionsBundle/Form/Type/DefinitionChoiceType.php index de9da8e1..afd9dd3e 100644 --- a/src/DataDefinitionsBundle/Form/Type/DefinitionChoiceType.php +++ b/src/DataDefinitionsBundle/Form/Type/DefinitionChoiceType.php @@ -16,7 +16,7 @@ namespace Instride\Bundle\DataDefinitionsBundle\Form\Type; -use Instride\Bundle\DataDefinitionsBundle\Model\DataDefinitionInterface; +use CoreShop\Component\Resource\Repository\RepositoryInterface; use Instride\Bundle\DataDefinitionsBundle\Repository\DefinitionRepository; use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer; use Symfony\Component\Form\AbstractType; @@ -24,6 +24,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; +use Instride\Bundle\DataDefinitionsBundle\Model\DataDefinitionInterface; final class DefinitionChoiceType extends AbstractType { @@ -50,7 +51,7 @@ public function configureOptions(OptionsResolver $resolver): void }, $this->definitionRepository->findAll()); }, 'choice_label' => function ($val) { - $def = $this->definitionRepository->findByName($val); + $def = $this->definitionRepository->find($val); return $def !== null ? $def->getName() : null; }, diff --git a/src/DataDefinitionsBundle/Interpreter/DefinitionInterpreter.php b/src/DataDefinitionsBundle/Interpreter/DefinitionInterpreter.php index 228b6925..707f57e4 100644 --- a/src/DataDefinitionsBundle/Interpreter/DefinitionInterpreter.php +++ b/src/DataDefinitionsBundle/Interpreter/DefinitionInterpreter.php @@ -16,11 +16,11 @@ namespace Instride\Bundle\DataDefinitionsBundle\Interpreter; +use Instride\Bundle\DataDefinitionsBundle\Repository\DefinitionRepository; +use Pimcore\Model\DataObject; use Instride\Bundle\DataDefinitionsBundle\Context\InterpreterContextInterface; use Instride\Bundle\DataDefinitionsBundle\Importer\ImporterInterface; use Instride\Bundle\DataDefinitionsBundle\Model\ImportDefinitionInterface; -use Instride\Bundle\DataDefinitionsBundle\Repository\DefinitionRepository; -use Pimcore\Model\DataObject; class DefinitionInterpreter implements InterpreterInterface { @@ -30,9 +30,8 @@ public function __construct( ) { } - public function interpret(InterpreterContextInterface $context): mixed - { - $subDefinition = $this->definitionRepository->findByName($context->getConfiguration()['definition']); + public function interpret(InterpreterContextInterface $context): mixed { + $subDefinition = $this->definitionRepository->find($context->getConfiguration()['definition']); if (!$subDefinition instanceof ImportDefinitionInterface) { return null; diff --git a/src/DataDefinitionsBundle/Messenger/ImportRowMessage.php b/src/DataDefinitionsBundle/Messenger/ImportRowMessage.php index 40e3b2b4..fc0f6b19 100644 --- a/src/DataDefinitionsBundle/Messenger/ImportRowMessage.php +++ b/src/DataDefinitionsBundle/Messenger/ImportRowMessage.php @@ -18,18 +18,18 @@ class ImportRowMessage { - private int|string $definitionId; + private int $definitionId; private array $data; private array $params; - public function __construct(int|string $definitionId, array $data, array $params) + public function __construct(int $definitionId, array $data, array $params) { $this->definitionId = $definitionId; $this->data = $data; $this->params = $params; } - public function getDefinitionId(): int|string + public function getDefinitionId(): int { return $this->definitionId; } diff --git a/src/DataDefinitionsBundle/Model/AbstractDataDefinition.php b/src/DataDefinitionsBundle/Model/AbstractDataDefinition.php index 6af4875b..5c5334fd 100644 --- a/src/DataDefinitionsBundle/Model/AbstractDataDefinition.php +++ b/src/DataDefinitionsBundle/Model/AbstractDataDefinition.php @@ -91,11 +91,6 @@ public function getId(): int|string|null return $this->id; } - public function setId($id) - { - $this->id = $id; - } - public function getProvider() { return $this->provider; @@ -131,13 +126,6 @@ public function getName() return $this->name; } - public function setName($name) - { - $this->name = $name; - - $this->setId($name); - } - public function getMapping() { return $this->mapping; diff --git a/src/DataDefinitionsBundle/Model/DataDefinitionInterface.php b/src/DataDefinitionsBundle/Model/DataDefinitionInterface.php index 945da621..439dfaaf 100644 --- a/src/DataDefinitionsBundle/Model/DataDefinitionInterface.php +++ b/src/DataDefinitionsBundle/Model/DataDefinitionInterface.php @@ -21,6 +21,8 @@ interface DataDefinitionInterface extends ResourceInterface { + public function getId(): int|string|null; + /** * @param int $id */ diff --git a/src/DataDefinitionsBundle/Model/ExportDefinition.php b/src/DataDefinitionsBundle/Model/ExportDefinition.php index 88a6a3e2..f0db2ff7 100644 --- a/src/DataDefinitionsBundle/Model/ExportDefinition.php +++ b/src/DataDefinitionsBundle/Model/ExportDefinition.php @@ -41,24 +41,34 @@ class ExportDefinition extends AbstractDataDefinition implements ExportDefinitio */ public $fetchUnpublished = false; - public static function getById(int|string $name) + public static function getById(int $id): self { - return static::getByName($name); + $definitionEntry = new self(); + $dao = $definitionEntry->getDao(); + $dao->getById($id); + + return $definitionEntry; } - public static function getByName($id) + public static function getByName(string $name): self { - $definitionEntry = new ExportDefinition(); - $definitionEntry->setId($id); - /** - * @var \Instride\Bundle\DataDefinitionsBundle\Model\ExportDefinition\Dao|\Instride\Bundle\DataDefinitionsBundle\Model\ImportDefinition\Dao - */ + $definitionEntry = new self(); $dao = $definitionEntry->getDao(); - $dao->getByName($id); + $dao->getByName($name); return $definitionEntry; } + public function setId($id) + { + $this->id = (int)$id; + } + + public function setName($name) + { + $this->name = $name; + } + /** * @param bool $enableInheritance */ diff --git a/src/DataDefinitionsBundle/Model/ExportDefinition/Dao.php b/src/DataDefinitionsBundle/Model/ExportDefinition/Dao.php index 35f15b4d..181e4526 100644 --- a/src/DataDefinitionsBundle/Model/ExportDefinition/Dao.php +++ b/src/DataDefinitionsBundle/Model/ExportDefinition/Dao.php @@ -17,15 +17,15 @@ namespace Instride\Bundle\DataDefinitionsBundle\Model\ExportDefinition; use Exception; -use InvalidArgumentException; +use Instride\Bundle\DataDefinitionsBundle\Model\IdGenerator; +use Instride\Bundle\DataDefinitionsBundle\Model\ExportDefinition; use Pimcore\Model; use Instride\Bundle\DataDefinitionsBundle\Model\ExportMapping; -use function count; -use function in_array; -use function is_array; class Dao extends Model\Dao\PimcoreLocationAwareConfigDao { + use IdGenerator; + private const CONFIG_KEY = 'export_definitions'; /** @@ -54,7 +54,7 @@ protected function assignVariablesToModel($data): void $maps = array(); foreach ($this->model->getMapping() as $map) { - if (is_array($map)) { + if (\is_array($map)) { $mapObj = new ExportMapping(); $mapObj->setValues($map); @@ -68,34 +68,40 @@ protected function assignVariablesToModel($data): void } /** - * Get Definition by name. - * - * @param null $name - * @throws Exception + * @throws Model\Exception\NotFoundException */ - public function getByName(string $id = null): void + public function getById(string $id) { - if ($id != null) { - $this->model->setName($id); - } - - $data = $this->getDataByName($this->model->getName()); - - if ($data && $id != null) { - $data['id'] = $id; - } + $data = $this->getDataByName($id); if ($data) { $this->assignVariablesToModel($data); - $this->model->setName($data['id']); } else { throw new Model\Exception\NotFoundException(sprintf( - 'Thumbnail with ID "%s" does not exist.', - $this->model->getName() + 'Export Definition with ID "%s" does not exist.', + $id )); } } + public function getByName(string $name): void + { + foreach ($this->loadIdList() as $id) { + $definition = ExportDefinition::getById((int)$id); + + if ($definition->getName() === $name) { + $this->model = $definition; + $this->getById($id); + return; + } + } + + throw new Model\Exception\NotFoundException(sprintf( + 'Export Definition with Name "%s" does not exist.', + $name + )); + } + /** * Save Configuration * @@ -104,6 +110,11 @@ public function getByName(string $id = null): void public function save() { $ts = time(); + + if (!$this->model->getId()) { + $this->model->setId($this->model->getSuggestedId(new Listing())); + } + if (!$this->model->getCreationDate()) { $this->model->setCreationDate($ts); } @@ -112,6 +123,7 @@ public function save() $dataRaw = get_object_vars($this->model); $data = []; $allowedProperties = [ + 'id', 'name', 'provider', 'class', @@ -139,7 +151,7 @@ public function save() if ($value) { $data[$key] = array(); - if (is_array($value)) { + if (\is_array($value)) { foreach ($value as $map) { $data[$key][] = get_object_vars($map); } @@ -150,7 +162,7 @@ public function save() } } } - $this->saveData($this->model->getName(), $data); + $this->saveData((string)$this->model->getId(), $data); } protected function prepareDataStructureForYaml(string $id, mixed $data): mixed @@ -170,6 +182,6 @@ protected function prepareDataStructureForYaml(string $id, mixed $data): mixed */ public function delete() { - $this->deleteData($this->model->getName()); + $this->deleteData((string)$this->model->getId()); } } diff --git a/src/DataDefinitionsBundle/Model/ExportDefinition/Listing.php b/src/DataDefinitionsBundle/Model/ExportDefinition/Listing.php index f15344e7..39edcfd1 100644 --- a/src/DataDefinitionsBundle/Model/ExportDefinition/Listing.php +++ b/src/DataDefinitionsBundle/Model/ExportDefinition/Listing.php @@ -26,6 +26,7 @@ /** * @method loadList() + * @method getAllIds() */ class Listing extends AbstractModel implements CallableFilterListingInterface, CallableOrderListingInterface { diff --git a/src/DataDefinitionsBundle/Model/ExportDefinition/Listing/Dao.php b/src/DataDefinitionsBundle/Model/ExportDefinition/Listing/Dao.php index c6fe48c3..eb9b1718 100644 --- a/src/DataDefinitionsBundle/Model/ExportDefinition/Listing/Dao.php +++ b/src/DataDefinitionsBundle/Model/ExportDefinition/Listing/Dao.php @@ -24,8 +24,8 @@ class Dao extends ExportDefinition\Dao public function loadList(): array { $definitions = []; - foreach ($this->loadIdList() as $name) { - $definitions[] = ExportDefinition::getByName($name); + foreach ($this->loadIdList() as $id) { + $definitions[] = ExportDefinition::getById((int)$id); } if ($this->model->getFilter()) { @@ -39,6 +39,11 @@ public function loadList(): array return $definitions; } + public function getAllIds(): array + { + return $this->loadIdList(); + } + public function getTotalCount(): int { return count($this->loadList()); diff --git a/src/DataDefinitionsBundle/Model/IdGenerator.php b/src/DataDefinitionsBundle/Model/IdGenerator.php new file mode 100644 index 00000000..48ba15a6 --- /dev/null +++ b/src/DataDefinitionsBundle/Model/IdGenerator.php @@ -0,0 +1,27 @@ +getAllIds(); + + $maxNumber = 1; + + foreach ($ids as $id) { + if ((int)$id >= $maxNumber) { + $maxNumber = (int)$id + 1; + } + } + + return $maxNumber; + } + +} diff --git a/src/DataDefinitionsBundle/Model/ImportDefinition.php b/src/DataDefinitionsBundle/Model/ImportDefinition.php index eddf4c80..2d5184b1 100644 --- a/src/DataDefinitionsBundle/Model/ImportDefinition.php +++ b/src/DataDefinitionsBundle/Model/ImportDefinition.php @@ -86,24 +86,34 @@ class ImportDefinition extends AbstractDataDefinition implements ImportDefinitio */ public $persister; - public static function getById(int|string $name) + public static function getById(int $id): self { - return static::getByName((string)$name); + $definitionEntry = new self(); + $dao = $definitionEntry->getDao(); + $dao->getById((string)$id); + + return $definitionEntry; } - public static function getByName(string $id) + public static function getByName(string $name): self { - $definitionEntry = new ImportDefinition(); - $definitionEntry->setId($id); - /** - * @var \Instride\Bundle\DataDefinitionsBundle\Model\ExportDefinition\Dao|\Instride\Bundle\DataDefinitionsBundle\Model\ImportDefinition\Dao - */ + $definitionEntry = new self(); $dao = $definitionEntry->getDao(); - $dao->getByName($id); + $dao->getByName($name); return $definitionEntry; } + public function setId($id) + { + $this->id = (int)$id; + } + + public function setName($name) + { + $this->name = $name; + } + public function getLoader() { return $this->loader; diff --git a/src/DataDefinitionsBundle/Model/ImportDefinition/Dao.php b/src/DataDefinitionsBundle/Model/ImportDefinition/Dao.php index 6511910c..321dc912 100644 --- a/src/DataDefinitionsBundle/Model/ImportDefinition/Dao.php +++ b/src/DataDefinitionsBundle/Model/ImportDefinition/Dao.php @@ -17,13 +17,18 @@ namespace Instride\Bundle\DataDefinitionsBundle\Model\ImportDefinition; use Exception; +use Instride\Bundle\DataDefinitionsBundle\Model\IdGenerator; +use Instride\Bundle\DataDefinitionsBundle\Model\ImportDefinition; use Pimcore\Model; use Instride\Bundle\DataDefinitionsBundle\Model\ImportMapping; -use function in_array; -use function is_array; +/** + * @var ImportDefinition $model + */ class Dao extends Model\Dao\PimcoreLocationAwareConfigDao { + use IdGenerator; + private const CONFIG_KEY = 'import_definitions'; /** @@ -52,7 +57,7 @@ protected function assignVariablesToModel($data): void $maps = array(); foreach ($this->model->getMapping() as $map) { - if (is_array($map)) { + if (\is_array($map)) { $mapObj = new ImportMapping(); $mapObj->setValues($map); @@ -66,42 +71,55 @@ protected function assignVariablesToModel($data): void } /** - * Get Definition by name. - * - * @param null $name - * @throws Exception + * @throws Model\Exception\NotFoundException */ - public function getByName(string $id = null): void + public function getById(string $id) { - if ($id != null) { - $this->model->setName($id); - } + $data = $this->getDataByName($id); - $data = $this->getDataByName($this->model->getName()); - - if ($data && $id != null) { + if ($data) { $data['id'] = $id; } if ($data) { $this->assignVariablesToModel($data); - $this->model->setName($data['id']); } else { throw new Model\Exception\NotFoundException(sprintf( 'Import Definition with ID "%s" does not exist.', - $this->model->getName() + $id )); } } + public function getByName(string $name): void + { + foreach ($this->loadIdList() as $id) { + $definition = ImportDefinition::getById((int)$id); + + if ($definition->getName() === $name) { + $this->model = $definition; + $this->getById($id); + return; + } + } + + throw new Model\Exception\NotFoundException(sprintf( + 'Import Definition with Name "%s" does not exist.', + $name + )); + } + /** - * Save Configuration - * * @throws Exception */ public function save() { $ts = time(); + + if (!$this->model->getId()) { + $this->model->setId($this->getSuggestedId(new Listing())); + } + if (!$this->model->getCreationDate()) { $this->model->setCreationDate($ts); } @@ -110,6 +128,7 @@ public function save() $dataRaw = get_object_vars($this->model); $data = []; $allowedProperties = [ + 'id', 'name', 'provider', 'class', @@ -147,7 +166,7 @@ public function save() if ($value) { $data[$key] = array(); - if (is_array($value)) { + if (\is_array($value)) { foreach ($value as $map) { $data[$key][] = get_object_vars($map); } @@ -159,7 +178,8 @@ public function save() } } - $this->saveData($this->model->getName(), $data); + + $this->saveData((string)$this->model->getId(), $data); } protected function prepareDataStructureForYaml(string $id, mixed $data): mixed @@ -179,6 +199,6 @@ protected function prepareDataStructureForYaml(string $id, mixed $data): mixed */ public function delete() { - $this->deleteData($this->model->getName()); + $this->deleteData((string)$this->model->getId()); } } diff --git a/src/DataDefinitionsBundle/Model/ImportDefinition/Listing.php b/src/DataDefinitionsBundle/Model/ImportDefinition/Listing.php index 4a0fc49e..166d57c3 100644 --- a/src/DataDefinitionsBundle/Model/ImportDefinition/Listing.php +++ b/src/DataDefinitionsBundle/Model/ImportDefinition/Listing.php @@ -27,6 +27,7 @@ /** * @method loadList() + * @method getAllIds() */ class Listing extends AbstractModel implements CallableFilterListingInterface, CallableOrderListingInterface { diff --git a/src/DataDefinitionsBundle/Model/ImportDefinition/Listing/Dao.php b/src/DataDefinitionsBundle/Model/ImportDefinition/Listing/Dao.php index 90ea8472..e67a5efe 100644 --- a/src/DataDefinitionsBundle/Model/ImportDefinition/Listing/Dao.php +++ b/src/DataDefinitionsBundle/Model/ImportDefinition/Listing/Dao.php @@ -27,8 +27,8 @@ class Dao extends ImportDefinition\Dao public function loadList(): array { $definitions = []; - foreach ($this->loadIdList() as $name) { - $definitions[] = ImportDefinition::getByName($name); + foreach ($this->loadIdList() as $id) { + $definitions[] = ImportDefinition::getById((int)$id); } if ($this->model->getFilter()) { @@ -42,6 +42,11 @@ public function loadList(): array return $definitions; } + public function getAllIds(): array + { + return $this->loadIdList(); + } + public function getTotalCount(): int { return count($this->loadList()); diff --git a/src/DataDefinitionsBundle/ProcessManager/ExportDefinitionStartupFormResolver.php b/src/DataDefinitionsBundle/ProcessManager/ExportDefinitionStartupFormResolver.php index 83049a4d..917aa5b8 100644 --- a/src/DataDefinitionsBundle/ProcessManager/ExportDefinitionStartupFormResolver.php +++ b/src/DataDefinitionsBundle/ProcessManager/ExportDefinitionStartupFormResolver.php @@ -16,7 +16,7 @@ namespace Instride\Bundle\DataDefinitionsBundle\ProcessManager; -use Instride\Bundle\DataDefinitionsBundle\Repository\DefinitionRepository; +use CoreShop\Component\Resource\Repository\RepositoryInterface; use ProcessManagerBundle\Model\ExecutableInterface; use ProcessManagerBundle\Process\ProcessStartupFormResolverInterface; use Instride\Bundle\DataDefinitionsBundle\Form\Type\ProcessManager\ExportDefinitionObjectStartupForm; @@ -36,7 +36,7 @@ public function supports(ExecutableInterface $executable): bool return false; } - $definition = $this->definitionRepository->findByName($executable->getSettings()['definition']); + $definition = $this->definitionRepository->find($executable->getSettings()['definition']); if (!$definition instanceof ExportDefinitionInterface) { return false; diff --git a/src/DataDefinitionsBundle/Repository/DefinitionRepository.php b/src/DataDefinitionsBundle/Repository/DefinitionRepository.php index c110f5f3..431f851c 100644 --- a/src/DataDefinitionsBundle/Repository/DefinitionRepository.php +++ b/src/DataDefinitionsBundle/Repository/DefinitionRepository.php @@ -21,11 +21,6 @@ class DefinitionRepository extends PimcoreDaoRepository { - public function find($id) - { - return $this->findByName($id); - } - public function findByName(string $name): ?DataDefinitionInterface { $class = $this->metadata->getClass('model'); diff --git a/src/DataDefinitionsBundle/Resources/config/services/commands.yml b/src/DataDefinitionsBundle/Resources/config/services/commands.yml index 28f7439b..6e8f623e 100644 --- a/src/DataDefinitionsBundle/Resources/config/services/commands.yml +++ b/src/DataDefinitionsBundle/Resources/config/services/commands.yml @@ -52,3 +52,11 @@ services: - '@CoreShop\Bundle\ResourceBundle\Controller\ResourceFormFactoryInterface' tags: - { name: 'console.command', command: 'data-definitions:definition:import:export' } + + Instride\Bundle\DataDefinitionsBundle\Command\ConvertExportDefinitionsToYaml: + tags: + - { name: 'console.command', command: 'data-definition:configuration:exporter:convert-to-yaml' } + + Instride\Bundle\DataDefinitionsBundle\Command\ConvertImportDefinitionsToYaml: + tags: + - { name: 'console.command', command: 'data-definition:configuration:importer:convert-to-yaml' } \ No newline at end of file