custom/plugins/CogiAdvancedContactForm/src/CogiAdvancedContactForm.php line 26

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Cogi\CogiAdvancedContactForm;
  3. use Shopware\Core\Content\Cms\Aggregate\CmsSlotTranslation\CmsSlotTranslationEntity;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  9. use Shopware\Core\Framework\Plugin;
  10. use Shopware\Core\Framework\Plugin\Context\ActivateContext;
  11. use Shopware\Core\Framework\Plugin\Context\DeactivateContext;
  12. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  13. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  14. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  15. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  16. use Shopware\Core\Content\ImportExport\Exception\FileNotFoundException;
  17. use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeEntity;
  18. use Shopware\Core\Framework\Context;
  19. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  20. use Shopware\Core\Framework\Uuid\Uuid;
  21. use Shopware\Core\System\Language\LanguageEntity;
  22. class CogiAdvancedContactForm extends Plugin {
  23.     public const COGI_NEW_FORM_SUBMIT_TEMPLATE_TYPE_TECHNICAL_NAME 'cogi_advanced_contact_form_submit';
  24.     public function install(InstallContext $context): void {
  25.         // Install email templates
  26.         $this->installEmailTemplates($context->getContext());
  27.     }
  28.     public function update(UpdateContext $context): void {
  29.         parent::update($context);
  30.     }
  31.     public function activate(ActivateContext $context): void {
  32.         // your code you need to execute while your plugin gets activated
  33.     }
  34.     public function deactivate(DeactivateContext $context): void {
  35.         // your code you need to run while your plugin gets deactivated
  36.     }
  37.     public function uninstall(UninstallContext $context): void {
  38.         if ($context->keepUserData()) {
  39.             parent::uninstall($context);
  40.             return;
  41.         }
  42.         // Uninstall email templates
  43.         $this->removeEmailTemplate(self::COGI_NEW_FORM_SUBMIT_TEMPLATE_TYPE_TECHNICAL_NAME$context->getContext());
  44.         // region remove existing customFields data
  45.         /** @var EntityRepositoryInterface $cmsSlotTranslationRepository */
  46.         $cmsSlotTranslationRepository $this->container->get('cms_slot_translation.repository');
  47.         $criteria = new Criteria();
  48.         $criteria->addFilter(new ContainsFilter("customFields""cogiAdvancedContactForm"));
  49.         $result $cmsSlotTranslationRepository->search($criteria$context->getContext());
  50.         /** @var CmsSlotTranslationEntity $cmsItem */
  51.         foreach ($result->getElements() as $cmsItem) {
  52.             $newCustomFields $cmsItem->getCustomFields();
  53.             unset($newCustomFields['cogiAdvancedContactForm']);
  54.             if(count($newCustomFields) === 0){
  55.                 $newCustomFields null;
  56.             }
  57.             $cmsSlotTranslationRepository->update([
  58.                 [
  59.                     'cmsSlotId' => $cmsItem->getCmsSlotId(),
  60.                     'cmsSlotVersionId' => $cmsItem->getVersionId(),
  61.                     'languageId' => $cmsItem->getLanguageId(),
  62.                     'customFields' => $newCustomFields
  63.                 ]
  64.             ], $context->getContext());
  65.         }
  66.         // endregion
  67.     }
  68.     /**
  69.      * Installs all email templates
  70.      * @param $context
  71.      * @return void
  72.      */
  73.     public function installEmailTemplates($context) {
  74.         // To store owner: Application mail
  75.         $this->addEmailTemplate(
  76.             [
  77.                 'en-GB' => 'Advanced contact form - Message received',
  78.                 'de-DE' => 'Erweitertes Kontaktformular - Anfrage erhalten'
  79.             ],
  80.             self::COGI_NEW_FORM_SUBMIT_TEMPLATE_TYPE_TECHNICAL_NAME,
  81.             [
  82.                 'en-GB' => 'Contact form received - {{ salesChannel.name }}',
  83.                 'de-DE' => 'Kontaktanfrage erhalten - {{ salesChannel.name }}'
  84.             ],
  85.             [
  86.                 'en-GB' => 'This template is sent to shop administrators as soon as a visitor submits a contact form.',
  87.                 'de-DE' => 'Dieses Template wird an Shopbetreiber verschickt, sobald ein Besucher ein Kontakformular absendet.'
  88.             ],
  89.             [
  90.                 'salesChannel' => 'sales_channel'
  91.             ], $context);
  92.     }
  93.     /**
  94.      * Adds a single email template, if it does not already exist
  95.      * @param $templateTypeName
  96.      * @param $templateTypeTechnicalName
  97.      * @param $mailSubject
  98.      * @param $mailDescription
  99.      * @param $availableEntities
  100.      * @param Context $context
  101.      * @return void
  102.      */
  103.     public function addEmailTemplate($templateTypeName$templateTypeTechnicalName$mailSubject$mailDescription$availableEntitiesContext $context) {
  104.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  105.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  106.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  107.         $mailTemplateRepository $this->container->get('mail_template.repository');
  108.         $mailTemplateTypeId Uuid::randomHex();
  109.         $mailTemplateType = [
  110.             [
  111.                 'id' => $mailTemplateTypeId,
  112.                 'name' => $templateTypeName,
  113.                 'technicalName' => $templateTypeTechnicalName,
  114.                 'availableEntities' => $availableEntities
  115.             ]
  116.         ];
  117.         // Add fallback
  118.         $defaultLocalCode $this->getDefaultLocaleCode($context);
  119.         if (!in_array($defaultLocalCode, ['de-DE''en-GB'])) {
  120.             $mailTemplateType[0]['name'][$defaultLocalCode] = $templateTypeName['en-GB'];
  121.         }
  122.         $mailTemplate = [
  123.             [
  124.                 'id' => Uuid::randomHex(),
  125.                 'mailTemplateTypeId' => $mailTemplateTypeId,
  126.                 'senderName' => [
  127.                     'en-GB' => '{{ salesChannel.translated.name }}',
  128.                     'de-DE' => '{{ salesChannel.translated.name }}'
  129.                 ],
  130.                 'subject' => $mailSubject,
  131.                 'description' => $mailDescription,
  132.                 'contentPlain' => [
  133.                     'en-GB' => $this->getMailContent('en-GB'$templateTypeTechnicalName'plain'),
  134.                     'de-DE' => $this->getMailContent('de-DE'$templateTypeTechnicalName'plain')
  135.                 ],
  136.                 'contentHtml' => [
  137.                     'en-GB' => $this->getMailContent('en-GB'$templateTypeTechnicalName'html'),
  138.                     'de-DE' => $this->getMailContent('de-DE'$templateTypeTechnicalName'html')
  139.                 ]
  140.             ]
  141.         ];
  142.         // Add fallback
  143.         if (!in_array($defaultLocalCode, ['de-DE''en-GB'])) {
  144.             $mailTemplate[0]['senderName'][$defaultLocalCode] = '{{ salesChannel.translated.name }}';
  145.             $mailTemplate[0]['subject'][$defaultLocalCode] = $mailSubject['en-GB'];
  146.             $mailTemplate[0]['description'][$defaultLocalCode] = $mailDescription['en-GB'];
  147.             $mailTemplate[0]['contentPlain'][$defaultLocalCode] = $this->getMailContent('en-GB'$templateTypeTechnicalName'plain');
  148.             $mailTemplate[0]['contentHtml'][$defaultLocalCode] = $this->getMailContent('en-GB'$templateTypeTechnicalName'html');
  149.         }
  150.         try {
  151.             $mailTemplateTypeRepository->create($mailTemplateType$context);
  152.             $mailTemplateRepository->create($mailTemplate$context);
  153.         } catch (UniqueConstraintViolationException $exception) {
  154.         }
  155.     }
  156.     private function getDefaultLocaleCode($context): string {
  157.         /** @var EntityRepository $languageRepository */
  158.         $languageRepository $this->container->get('language.repository');
  159.         $criteria = new Criteria();
  160.         $criteria->addAssociation('locale');
  161.         $criteria->addFilter(new EqualsFilter('id'Defaults::LANGUAGE_SYSTEM));
  162.         /** @var LanguageEntity $languageEntity */
  163.         $languageEntity $languageRepository->search($criteria$context)->get(Defaults::LANGUAGE_SYSTEM);
  164.         return $languageEntity->getLocale()->getCode();
  165.     }
  166.     /**
  167.      * Gets the contant of a mail while considering the locale
  168.      * @param string $locale
  169.      * @param string $prefix
  170.      * @param string $type
  171.      * @return string
  172.      */
  173.     private function getMailContent(string $localestring $prefixstring $type): string {
  174.         $path $this->getPath() . '/Resources/email/' $locale '/';
  175.         switch ($type) {
  176.             case 'html':
  177.                 $ext 'html';
  178.                 break;
  179.             case 'plain':
  180.                 $ext 'txt';
  181.                 break;
  182.             default:
  183.                 $ext 'txt';
  184.         }
  185.         $file $path $prefix '.' $ext;
  186.         if (!is_file($file)) {
  187.             throw new FileNotFoundException($file);
  188.         }
  189.         return file_get_contents($file);
  190.     }
  191.     /**
  192.      * Removes a specific email template by templateTypeTechnicalName
  193.      * @param $templateTypeTechnicalName
  194.      * @param Context $context
  195.      * @return void
  196.      */
  197.     public function removeEmailTemplate($templateTypeTechnicalNameContext $context) {
  198.         /** @var EntityRepositoryInterface $mailTemplateTypeRepository */
  199.         $mailTemplateTypeRepository $this->container->get('mail_template_type.repository');
  200.         /** @var EntityRepositoryInterface $mailTemplateRepository */
  201.         $mailTemplateRepository $this->container->get('mail_template.repository');
  202.         /** @var MailTemplateTypeEntity $customMailTemplateType */
  203.         $customMailTemplateType $mailTemplateTypeRepository->search(
  204.             (new Criteria())
  205.                 ->addFilter(new EqualsFilter('technicalName'$templateTypeTechnicalName)),
  206.             $context
  207.         )->first();
  208.         if ($customMailTemplateType) {
  209.             $mailTemplateIds $mailTemplateRepository->searchIds(
  210.                 (new Criteria())
  211.                     ->addFilter(new EqualsFilter('mailTemplateTypeId'$customMailTemplateType->getId())),
  212.                 $context
  213.             )->getIds();
  214.             $ids array_map(static function ($id) {
  215.                 return ['id' => $id];
  216.             }, $mailTemplateIds);
  217.             $mailTemplateRepository->delete($ids$context);
  218.             // Delete the TemplateType which were added by this Plugin
  219.             $mailTemplateTypeRepository->delete([
  220.                 ['id' => $customMailTemplateType->getId()]
  221.             ], $context);
  222.         }
  223.     }
  224. }