<?php
declare(strict_types=1);
namespace Sition\Blog;
use Doctrine\DBAL\Connection;
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\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Sition\Blog\Core\Content\Blog\BlogDefinition;
class SitionBlog extends Plugin
{
public function install(InstallContext $installContext): void
{
parent::install($installContext);
$this->createMediaFolder($installContext->getContext());
}
public function uninstall(UninstallContext $context): void
{
parent::uninstall($context);
if ($context->keepUserData()) {
return;
}
$this->deleteSeoRoute($context->getContext());
$this->deleteImages($context->getContext());
$this->deleteMediaFolder($context->getContext());
$this->deleteDefaultMediaFolder($context->getContext());
/**
* Delete blog related tables
*/
$connection = $this->container->get(Connection::class);
$connection->executeStatement('SET FOREIGN_KEY_CHECKS=0;');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog`');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_product`');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_tag`');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_translation`');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_category`');
$connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_category_translation`');
$connection->executeStatement('ALTER TABLE `product` DROP COLUMN `blogs`;');
$connection->executeStatement('DELETE FROM `media_default_folder` WHERE `entity` = "sition_blog"');
$connection->executeStatement('DELETE FROM `media_folder` WHERE `name` = "Sition Blog Images"');
$connection->executeStatement('SET FOREIGN_KEY_CHECKS=1;');
}
public function createMediaFolder(Context $context): void
{
/** @var EntityRepositoryInterface $mediaFolderRepository */
$mediaFolderRepository = $this->container->get('media_default_folder.repository');
$exists = $mediaFolderRepository->search(
(new Criteria())->addFilter(new EqualsFilter('entity', BlogDefinition::ENTITY_NAME)),
$context
)->first();
if ($exists) {
return;
}
$mediaFolderRepository->create(
[
[
'entity' => BlogDefinition::ENTITY_NAME, // The enity sets the relation
'associationFields' => ['media'],
'folder' => [
'name' => 'Sition Blog Images',
'useParentConfiguration' => false,
'configuration' => [],
],
],
],
$context
);
}
private function deleteImages(Context $context): void
{
// TODO: Do we need to keep this method when it's empty?
}
private function deleteMediaFolder(Context $context): void
{
$criteria = new Criteria();
$criteria->addFilter(
new EqualsFilter('name', 'Sition Blog Images')
);
/** @var EntityRepositoryInterface $mediaFolderRepository */
$mediaFolderRepository = $this->container->get('media_folder.repository');
$mediaFolderRepository->search($criteria, $context);
// Search for all media folders which match 'Sition Blog Images'
$mediaFolderIds = $mediaFolderRepository->searchIds($criteria, $context)->getIds();
if (!empty($mediaFolderIds)) {
$ids = array_map(static function ($id) {
return ['id' => $id];
}, $mediaFolderIds);
$mediaFolderRepository->delete($ids, $context);
}
}
/**
* Delete the default media folder which is connected to the entity
*/
private function deleteDefaultMediaFolder(Context $context): void
{
$criteria = new Criteria();
$criteria->addFilter(
new EqualsAnyFilter('entity', [
BlogDefinition::ENTITY_NAME,
])
);
/** @var EntityRepositoryInterface $mediaFolderRepository */
$mediaFolderRepository = $this->container->get('media_default_folder.repository');
// Search for all default media folders which match the entity name
$mediaFolderIds = $mediaFolderRepository->searchIds($criteria, $context)->getIds();
if (!empty($mediaFolderIds)) {
$ids = array_map(static function ($id) {
return ['id' => $id];
}, $mediaFolderIds);
$mediaFolderRepository->delete($ids, $context);
}
}
private function deleteSeoRoute(Context $context): void
{
/** @var EntityRepositoryInterface $seoUrlTemplateRepository */
$seoUrlTemplateRepository = $this->container->get('seo_url_template.repository');
$criteria = new Criteria();
$criteria->addFilter(
new EqualsFilter('entityName', 'sition_blog')
);
$seoUrlTemplateRepository->search($criteria, $context);
$seoUrlTemplateIds = $seoUrlTemplateRepository->searchIds($criteria, $context)->getIds();
if (!empty($seoUrlTemplateIds)) {
$ids = array_map(static function ($id) {
return ['id' => $id];
}, $seoUrlTemplateIds);
$seoUrlTemplateRepository->delete($ids, $context);
}
}
}