vendor/sition/blog/src/SitionBlog.php line 18

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Sition\Blog;
  4. use Doctrine\DBAL\Connection;
  5. use Shopware\Core\Framework\Context;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\Plugin;
  11. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  12. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  13. use Sition\Blog\Core\Content\Blog\BlogDefinition;
  14. class SitionBlog extends Plugin
  15. {
  16.     public function install(InstallContext $installContext): void
  17.     {
  18.         parent::install($installContext);
  19.         $this->createMediaFolder($installContext->getContext());
  20.     }
  21.     public function uninstall(UninstallContext $context): void
  22.     {
  23.         parent::uninstall($context);
  24.         if ($context->keepUserData()) {
  25.             return;
  26.         }
  27.         $this->deleteSeoRoute($context->getContext());
  28.         $this->deleteImages($context->getContext());
  29.         $this->deleteMediaFolder($context->getContext());
  30.         $this->deleteDefaultMediaFolder($context->getContext());
  31.         /**
  32.          * Delete blog related tables
  33.          */
  34.         $connection $this->container->get(Connection::class);
  35.         $connection->executeStatement('SET FOREIGN_KEY_CHECKS=0;');
  36.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog`');
  37.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_product`');
  38.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_tag`');
  39.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_translation`');
  40.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_category`');
  41.         $connection->executeStatement('DROP TABLE IF EXISTS `sition_blog_category_translation`');
  42.         $connection->executeStatement('ALTER TABLE `product` DROP COLUMN `blogs`;');
  43.         $connection->executeStatement('DELETE FROM `media_default_folder` WHERE `entity` = "sition_blog"');
  44.         $connection->executeStatement('DELETE FROM `media_folder` WHERE `name` = "Sition Blog Images"');
  45.         $connection->executeStatement('SET FOREIGN_KEY_CHECKS=1;');
  46.     }
  47.     public function createMediaFolder(Context $context): void
  48.     {
  49.         /** @var EntityRepositoryInterface $mediaFolderRepository */
  50.         $mediaFolderRepository $this->container->get('media_default_folder.repository');
  51.         $exists $mediaFolderRepository->search(
  52.             (new Criteria())->addFilter(new EqualsFilter('entity'BlogDefinition::ENTITY_NAME)),
  53.             $context
  54.         )->first();
  55.         if ($exists) {
  56.             return;
  57.         }
  58.         $mediaFolderRepository->create(
  59.             [
  60.                 [
  61.                     'entity' => BlogDefinition::ENTITY_NAME,  // The enity sets the relation
  62.                     'associationFields' => ['media'],
  63.                     'folder' => [
  64.                         'name' => 'Sition Blog Images',
  65.                         'useParentConfiguration' => false,
  66.                         'configuration' => [],
  67.                     ],
  68.                 ],
  69.             ],
  70.             $context
  71.         );
  72.     }
  73.     private function deleteImages(Context $context): void
  74.     {
  75.         // TODO: Do we need to keep this method when it's empty?
  76.     }
  77.     private function deleteMediaFolder(Context $context): void
  78.     {
  79.         $criteria = new Criteria();
  80.         $criteria->addFilter(
  81.             new EqualsFilter('name''Sition Blog Images')
  82.         );
  83.         /** @var EntityRepositoryInterface $mediaFolderRepository */
  84.         $mediaFolderRepository $this->container->get('media_folder.repository');
  85.         $mediaFolderRepository->search($criteria$context);
  86.         // Search for all media folders which match 'Sition Blog Images'
  87.         $mediaFolderIds $mediaFolderRepository->searchIds($criteria$context)->getIds();
  88.         if (!empty($mediaFolderIds)) {
  89.             $ids array_map(static function ($id) {
  90.                 return ['id' => $id];
  91.             }, $mediaFolderIds);
  92.             $mediaFolderRepository->delete($ids$context);
  93.         }
  94.     }
  95.     /**
  96.      * Delete the default media folder which is connected to the entity
  97.      */
  98.     private function deleteDefaultMediaFolder(Context $context): void
  99.     {
  100.         $criteria = new Criteria();
  101.         $criteria->addFilter(
  102.             new EqualsAnyFilter('entity', [
  103.                 BlogDefinition::ENTITY_NAME,
  104.             ])
  105.         );
  106.         /** @var EntityRepositoryInterface $mediaFolderRepository */
  107.         $mediaFolderRepository $this->container->get('media_default_folder.repository');
  108.         // Search for all default media folders which match the entity name
  109.         $mediaFolderIds $mediaFolderRepository->searchIds($criteria$context)->getIds();
  110.         if (!empty($mediaFolderIds)) {
  111.             $ids array_map(static function ($id) {
  112.                 return ['id' => $id];
  113.             }, $mediaFolderIds);
  114.             $mediaFolderRepository->delete($ids$context);
  115.         }
  116.     }
  117.     private function deleteSeoRoute(Context $context): void
  118.     {
  119.         /** @var EntityRepositoryInterface $seoUrlTemplateRepository */
  120.         $seoUrlTemplateRepository $this->container->get('seo_url_template.repository');
  121.         $criteria = new Criteria();
  122.         $criteria->addFilter(
  123.             new EqualsFilter('entityName''sition_blog')
  124.         );
  125.         $seoUrlTemplateRepository->search($criteria$context);
  126.         $seoUrlTemplateIds $seoUrlTemplateRepository->searchIds($criteria$context)->getIds();
  127.         if (!empty($seoUrlTemplateIds)) {
  128.             $ids array_map(static function ($id) {
  129.                 return ['id' => $id];
  130.             }, $seoUrlTemplateIds);
  131.             $seoUrlTemplateRepository->delete($ids$context);
  132.         }
  133.     }
  134. }