<?php declare(strict_types=1);
namespace Acris\SeoRedirect;
use Doctrine\DBAL\Connection;
use Shopware\Core\Content\ImportExport\Aggregate\ImportExportLog\ImportExportLogEntity;
use Shopware\Core\Content\ImportExport\ImportExportProfileEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use SwagMigrationAssistant\SwagMigrationAssistant;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use \Shopware\Core\Framework\Plugin\KernelPluginCollection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
class AcrisSeoRedirectCS extends Plugin
{
public function build(ContainerBuilder $container): void
{
parent::build($container);
$kernelPluginCollection = new KernelPluginCollection();
$migrationPlugin = $kernelPluginCollection->get(SwagMigrationAssistant::class);
if ($migrationPlugin === null || $migrationPlugin->isActive() === false) {
return;
}
// Only load migration relevant classes if the SwagMigrationAssistant is available
$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/DependencyInjection/'));
$loader->load('swag_sw5_migration_services.xml');
}
public function activate(Plugin\Context\ActivateContext $context): void
{
parent::activate($context);
$this->insertDefaultValues($context);
}
public function uninstall(UninstallContext $context): void
{
parent::uninstall($context);
if ($context->keepUserData()) {
return;
}
$connection = $this->container->get(Connection::class);
$this->removeImportExportProfiles($connection, $context->getContext());
$connection->executeUpdate('DROP TABLE IF EXISTS `acris_seo_redirect`');
}
public function insertDefaultValues(Plugin\Context\ActivateContext $context)
{
$importExportProfileRepository = $this->container->get('import_export_profile.repository');
$defaultImportExportProfile = [
'name' => 'ACRIS SEO Redirect',
'label' => 'ACRIS SEO Redirect',
'systemDefault' => true,
'sourceEntity' => 'acris_seo_redirect',
'fileType' => 'text/csv',
'delimiter' => ';',
'enclosure' => '"',
'mapping' => [
[
'key' => 'id',
'mappedKey' => 'id'
],
[
'key' => 'active',
'mappedKey' => 'active'
],
[
'key' => 'oldUrl',
'mappedKey' => 'old_url'
],
[
'key' => 'newUrl',
'mappedKey' => 'new_url'
],
[
'key' => 'temporary',
'mappedKey' => 'temporary'
],
[
'key' => 'redirectCount',
'mappedKey' => 'redirect_count'
],
[
'key' => 'lastRedirectedOn',
'mappedKey' => 'last_redirected_on'
],
[
'key' => 'lastRedirectedReferer',
'mappedKey' => 'last_redirected_referer'
]
],
'translations' => [
'en-GB' => [
'label' => 'ACRIS SEO Redirect'
],
'de-DE' => [
'label' => 'ACRIS SEO Redirect'
]
]
];
$this->createIfNotExists($importExportProfileRepository, [['name' => 'name', 'value' => $defaultImportExportProfile['name']]], $defaultImportExportProfile, $context->getContext());
}
private function createIfNotExists(EntityRepositoryInterface $repository, array $equalFields, array $data, Context $context)
{
$filters = [];
foreach ($equalFields as $equalField) {
$filters[] = new EqualsFilter($equalField['name'], $equalField['value']);
}
if(sizeof($filters) > 1) {
$filter = new MultiFilter(MultiFilter::CONNECTION_OR, $filters);
} else {
$filter = array_shift($filters);
}
$searchResult = $repository->search((new Criteria())->addFilter($filter), $context);
if($searchResult->count() == 0) {
$repository->create([$data], $context);
}
}
private function removeImportExportProfiles(Connection $connection, Context $context): void
{
$importExportProfileRepository = $this->container->get('import_export_profile.repository');
$importExportLogRepository = $this->container->get('import_export_log.repository');
$searchResult = $importExportProfileRepository->search((new Criteria())->addFilter(new EqualsFilter('sourceEntity', 'acris_seo_redirect')), $context);
$ids = [];
/** @var \Shopware\Core\Framework\Uuid\Uuid $uuid */
$uuid = new \Shopware\Core\Framework\Uuid\Uuid();
if($searchResult->getTotal() > 0 && $searchResult->first()) {
/** @var ImportExportProfileEntity $entity */
foreach ($searchResult->getEntities() as $entity) {
if ($entity->getSystemDefault() === true) {
$importExportProfileRepository->update([
['id' => $entity->getId(), 'systemDefault' => false ]
], $context);
}
$logResult = $importExportLogRepository->search((new Criteria())->addFilter(new EqualsFilter('profileId', $entity->getId())), $context);
if ($logResult->getTotal() > 0 && $logResult->first()) {
/** @var ImportExportLogEntity $logEntity */
foreach ($logResult->getEntities() as $logEntity) {
$stmt = $connection->prepare("UPDATE import_export_log SET profile_id = :profileId WHERE id = :id");
$stmt->execute(['profileId' => null, 'id' => $uuid::fromHexToBytes($logEntity->getId()) ]);
}
}
$ids[] = ['id' => $entity->getId()];
}
$importExportProfileRepository->delete($ids, $context);
}
}
}