vendor/store.shopware.com/acrisseoredirectcs/src/AcrisSeoRedirectCS.php line 21

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\SeoRedirect;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Content\ImportExport\Aggregate\ImportExportLog\ImportExportLogEntity;
  5. use Shopware\Core\Content\ImportExport\ImportExportProfileEntity;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  11. use Shopware\Core\Framework\Plugin;
  12. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  13. use SwagMigrationAssistant\SwagMigrationAssistant;
  14. use Symfony\Component\DependencyInjection\ContainerBuilder;
  15. use \Shopware\Core\Framework\Plugin\KernelPluginCollection;
  16. use Symfony\Component\Config\FileLocator;
  17. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  18. class AcrisSeoRedirectCS extends Plugin
  19. {
  20.     public function build(ContainerBuilder $container): void
  21.     {
  22.         parent::build($container);
  23.         $kernelPluginCollection = new KernelPluginCollection();
  24.         $migrationPlugin $kernelPluginCollection->get(SwagMigrationAssistant::class);
  25.         if ($migrationPlugin === null || $migrationPlugin->isActive() === false) {
  26.             return;
  27.         }
  28.         // Only load migration relevant classes if the SwagMigrationAssistant is available
  29.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__ '/DependencyInjection/'));
  30.         $loader->load('swag_sw5_migration_services.xml');
  31.     }
  32.     public function activate(Plugin\Context\ActivateContext $context): void
  33.     {
  34.         parent::activate($context);
  35.         $this->insertDefaultValues($context);
  36.     }
  37.     public function uninstall(UninstallContext $context): void
  38.     {
  39.         parent::uninstall($context);
  40.         if ($context->keepUserData()) {
  41.             return;
  42.         }
  43.         $connection $this->container->get(Connection::class);
  44.         $this->removeImportExportProfiles($connection$context->getContext());
  45.         $connection->executeUpdate('DROP TABLE IF EXISTS `acris_seo_redirect`');
  46.     }
  47.     public function insertDefaultValues(Plugin\Context\ActivateContext $context)
  48.     {
  49.         $importExportProfileRepository $this->container->get('import_export_profile.repository');
  50.         $defaultImportExportProfile = [
  51.             'name' => 'ACRIS SEO Redirect',
  52.             'label' => 'ACRIS SEO Redirect',
  53.             'systemDefault' => true,
  54.             'sourceEntity' => 'acris_seo_redirect',
  55.             'fileType' => 'text/csv',
  56.             'delimiter' => ';',
  57.             'enclosure' => '"',
  58.             'mapping' => [
  59.                 [
  60.                     'key' => 'id',
  61.                     'mappedKey' => 'id'
  62.                 ],
  63.                 [
  64.                     'key' => 'active',
  65.                     'mappedKey' => 'active'
  66.                 ],
  67.                 [
  68.                     'key' => 'oldUrl',
  69.                     'mappedKey' => 'old_url'
  70.                 ],
  71.                 [
  72.                     'key' => 'newUrl',
  73.                     'mappedKey' => 'new_url'
  74.                 ],
  75.                 [
  76.                     'key' => 'temporary',
  77.                     'mappedKey' => 'temporary'
  78.                 ],
  79.                 [
  80.                     'key' => 'redirectCount',
  81.                     'mappedKey' => 'redirect_count'
  82.                 ],
  83.                 [
  84.                     'key' => 'lastRedirectedOn',
  85.                     'mappedKey' => 'last_redirected_on'
  86.                 ],
  87.                 [
  88.                     'key' => 'lastRedirectedReferer',
  89.                     'mappedKey' => 'last_redirected_referer'
  90.                 ]
  91.             ],
  92.             'translations'  => [
  93.                 'en-GB' => [
  94.                     'label' => 'ACRIS SEO Redirect'
  95.                 ],
  96.                 'de-DE' => [
  97.                     'label' => 'ACRIS SEO Redirect'
  98.                 ]
  99.             ]
  100.         ];
  101.         $this->createIfNotExists($importExportProfileRepository, [['name' => 'name''value' => $defaultImportExportProfile['name']]], $defaultImportExportProfile$context->getContext());
  102.     }
  103.     private function createIfNotExists(EntityRepositoryInterface $repository, array $equalFields, array $dataContext $context)
  104.     {
  105.         $filters = [];
  106.         foreach ($equalFields as $equalField) {
  107.             $filters[] = new EqualsFilter($equalField['name'], $equalField['value']);
  108.         }
  109.         if(sizeof($filters) > 1) {
  110.             $filter = new MultiFilter(MultiFilter::CONNECTION_OR$filters);
  111.         } else {
  112.             $filter array_shift($filters);
  113.         }
  114.         $searchResult $repository->search((new Criteria())->addFilter($filter), $context);
  115.         if($searchResult->count() == 0) {
  116.             $repository->create([$data], $context);
  117.         }
  118.     }
  119.     private function removeImportExportProfiles(Connection $connectionContext $context): void
  120.     {
  121.         $importExportProfileRepository $this->container->get('import_export_profile.repository');
  122.         $importExportLogRepository $this->container->get('import_export_log.repository');
  123.         $searchResult $importExportProfileRepository->search((new Criteria())->addFilter(new EqualsFilter('sourceEntity''acris_seo_redirect')), $context);
  124.         $ids = [];
  125.         /** @var \Shopware\Core\Framework\Uuid\Uuid $uuid */
  126.         $uuid = new \Shopware\Core\Framework\Uuid\Uuid();
  127.         if($searchResult->getTotal() > && $searchResult->first()) {
  128.             /** @var ImportExportProfileEntity $entity */
  129.             foreach ($searchResult->getEntities() as $entity) {
  130.                 if ($entity->getSystemDefault() === true) {
  131.                     $importExportProfileRepository->update([
  132.                         ['id' => $entity->getId(), 'systemDefault' => false ]
  133.                     ], $context);
  134.                 }
  135.                 $logResult $importExportLogRepository->search((new Criteria())->addFilter(new EqualsFilter('profileId'$entity->getId())), $context);
  136.                 if ($logResult->getTotal() > && $logResult->first()) {
  137.                     /** @var ImportExportLogEntity $logEntity */
  138.                     foreach ($logResult->getEntities() as $logEntity) {
  139.                         $stmt $connection->prepare("UPDATE import_export_log SET profile_id = :profileId WHERE id = :id");
  140.                         $stmt->execute(['profileId' => null'id' => $uuid::fromHexToBytes($logEntity->getId()) ]);
  141.                     }
  142.                 }
  143.                 $ids[] = ['id' => $entity->getId()];
  144.             }
  145.             $importExportProfileRepository->delete($ids$context);
  146.         }
  147.     }
  148. }