custom/plugins/AcrisProductInfoTextCS/src/AcrisProductInfoTextCS.php line 18

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\ProductInfoText;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\IdSearchResult;
  10. use Shopware\Core\Framework\Plugin;
  11. use Shopware\Core\Framework\Plugin\Context\ActivateContext;
  12. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  13. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  14. use Shopware\Core\Framework\Uuid\Uuid;
  15. class AcrisProductInfoTextCS extends Plugin
  16. {
  17.     const ACRIS_ORDER_CONFIRMATION_PRODUCT_INFO_TEXT 'acrisOrderConfirmationProductInfoText';
  18.     public function activate(ActivateContext $context): void
  19.     {
  20.         $this->insertDefaultMailTemplate($context->getContext());
  21.     }
  22.     public function postUpdate(UpdateContext $updateContext): void
  23.     {
  24.         if (version_compare($updateContext->getCurrentPluginVersion(), '3.1.0''<') && $updateContext->getPlugin()->isActive() === true) {
  25.             $this->insertDefaultMailTemplate($updateContext->getContext());
  26.         }
  27.     }
  28.     public function uninstall(UninstallContext $context): void
  29.     {
  30.         parent::uninstall($context);
  31.         if ($context->keepUserData()) {
  32.             return;
  33.         }
  34.         $connection $this->container->get(Connection::class);
  35.         $connection->executeUpdate('DROP TABLE IF EXISTS `acris_info_text_translation`');
  36.         $connection->executeUpdate('DROP TABLE IF EXISTS `acris_info_text_sales_channel`');
  37.         $connection->executeUpdate('DROP TABLE IF EXISTS `acris_info_text_stream`');
  38.         $this->removeInheritance($connection'rule''acrisProductInfoText');
  39.         $connection->executeStatement('DROP TABLE IF EXISTS `acris_info_text_rule`');
  40.         $connection->executeUpdate('DROP TABLE IF EXISTS `acris_info_text`');
  41.         $connection->executeStatement('DROP TABLE IF EXISTS `acris_info_text_rule`');
  42.         $this->removeInheritance($connection'product_stream''productInfoText');
  43.         $this->removeInheritance($connection'sales_channel''productInfoText');
  44.         $this->removeInheritance($connection'rule''productInfoText');
  45.         $this->removeDefaultMailTemplate($context->getContext());
  46.     }
  47.     protected function removeInheritance(Connection $connectionstring $entitystring $propertyName): void
  48.     {
  49.         $sql str_replace(
  50.             ['#table#''#column#'],
  51.             [$entity$propertyName],
  52.             'ALTER TABLE `#table#` DROP IF EXISTS `#column#`'
  53.         );
  54.         $connection->executeUpdate($sql);
  55.     }
  56.     private function insertDefaultMailTemplate(Context $context)
  57.     {
  58.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  59.         // ACRIS order confirmation
  60.         /** @var IdSearchResult $mailTemplateTypeOrderConfirmationSearchResult */
  61.         $mailTemplateTypeOrderConfirmationSearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName'self::ACRIS_ORDER_CONFIRMATION_PRODUCT_INFO_TEXT)), $context);
  62.         if (empty($mailTemplateTypeOrderConfirmationSearchResult->firstId())) {
  63.             $mailTemplateTypeOrderConfirmationId Uuid::randomHex();
  64.             $mailTemplateOrderConfirmationId Uuid::randomHex();
  65.             $mailTemplateTypOrderConfirmationData = [
  66.                 'id' => $mailTemplateTypeOrderConfirmationId,
  67.                 'technicalName' => self::ACRIS_ORDER_CONFIRMATION_PRODUCT_INFO_TEXT,
  68.                 'availableEntities' => ['order' => 'order''salesChannel' => 'sales_channel''editOrderUrl' => null],
  69.                 'translations' => [
  70.                     'de-DE' => [
  71.                         'name' => 'ACRIS Bestellbestätigung mit Produkt Info Texten'
  72.                     ],
  73.                     'en-GB' => [
  74.                         'name' => 'ACRIS order confirmation with product info texts'
  75.                     ]
  76.                 ],
  77.                 'name' => 'ACRIS order confirmation with with product info texts',
  78.                 'mailTemplates' => [
  79.                     [
  80.                         'id' => $mailTemplateOrderConfirmationId,
  81.                         'systemDefault' => true,
  82.                         'translations' => [
  83.                             'de-DE' => [
  84.                                 'senderName' => '{{ salesChannel.name }}',
  85.                                 'subject' => 'Ihre Bestellung bei {{ salesChannel.name }} (#{{ order.orderNumber }})',
  86.                                 'description' => 'ACRIS Mail Template mit Produkt Info Texten',
  87.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/de-DE/order-confirmation-product-info-texts.html.twig'),
  88.                                 'contentPlain' => file_get_contents($this->path '/Resources/mail-template/plain/de-DE/order-confirmation-product-info-texts.html.twig')
  89.                             ],
  90.                             'en-GB' => [
  91.                                 'senderName' => '{{ salesChannel.name }}',
  92.                                 'subject' => 'Your order at {{ salesChannel.name }} (#{{ order.orderNumber }})',
  93.                                 'description' => 'ACRIS Mail Template with product info texts',
  94.                                 'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation-product-info-texts.html.twig'),
  95.                                 'contentPlain' => file_get_contents($this->path '/Resources/mail-template/plain/en-GB/order-confirmation-product-info-texts.html.twig')
  96.                             ],
  97.                         ],
  98.                         'senderName' => '{{ salesChannel.name }}',
  99.                         'subject' => 'Your order at {{ salesChannel.name }} (#{{ order.orderNumber }})',
  100.                         'description' => 'ACRIS Mail Template with product info texts',
  101.                         'contentHtml' => file_get_contents($this->path '/Resources/mail-template/html/en-GB/order-confirmation-product-info-texts.html.twig'),
  102.                         'contentPlain' => file_get_contents($this->path '/Resources/mail-template/plain/en-GB/order-confirmation-product-info-texts.html.twig')
  103.                     ]
  104.                 ]
  105.             ];
  106.             $mailTemplateTypeRepository->upsert([$mailTemplateTypOrderConfirmationData], $context);
  107.         }
  108.     }
  109.     private function removeDefaultMailTemplate(Context $context)
  110.     {
  111.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  112.         /** @var IdSearchResult $mailTemplateTypeOrderConfirmationSearchResult */
  113.         $mailTemplateTypeOrderConfirmationSearchResult $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsAnyFilter('technicalName', [self::ACRIS_ORDER_CONFIRMATION_PRODUCT_INFO_TEXT])), $context);
  114.         if ($mailTemplateTypeOrderConfirmationSearchResult->firstId()) {
  115.             $mailTemplateRepository $this->container->get('mail_template.repository');
  116.             $eventActionRepository $this->container->get('event_action.repository');
  117.             $deleteTemplateTypeData = [];
  118.             $deleteTemplateData = [];
  119.             $isUsedInEvent false;
  120.             foreach ($mailTemplateTypeOrderConfirmationSearchResult->getIds() as $templateTypeId) {
  121.                 /** @var IdSearchResult $mailTemplateSearchResult */
  122.                 $mailTemplateSearchResult $mailTemplateRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId'$templateTypeId))->addFilter(new EqualsFilter('updatedAt'null)), $context);
  123.                 if ($eventActionRepository->search((new Criteria())->addFilter(new ContainsFilter('config'$templateTypeId)), $context)->getTotal() > 0) {
  124.                     $isUsedInEvent true;
  125.                 }
  126.                 if ($mailTemplateSearchResult->firstId() and !$isUsedInEvent) {
  127.                     foreach ($mailTemplateSearchResult->getIds() as $id) {
  128.                         if ($eventActionRepository->search((new Criteria())->addFilter(new ContainsFilter('config'$id)), $context)->getTotal() > 0) {
  129.                             $isUsedInEvent true;
  130.                         }
  131.                         $deleteTemplateData[] = ['id' => $id];
  132.                     }
  133.                 }
  134.                 $deleteTemplateTypeData[] = ['id' => $templateTypeId];
  135.             }
  136.             if (!empty($deleteTemplateData) and !$isUsedInEvent) {
  137.                 $mailTemplateRepository->delete($deleteTemplateData$context);
  138.             }
  139.             if (!empty($deleteTemplateData) and !empty($deleteTemplateTypeData and !$isUsedInEvent)) {
  140.                 $mailTemplateTypeRepository->delete($deleteTemplateTypeData$context);
  141.             }
  142.         }
  143.     }
  144. }