<?php declare(strict_types=1);
namespace FourtwosixRecommendationForm;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeEntity;
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\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Uuid\Uuid;
class FourtwosixRecommendationForm extends Plugin
{
public const TEMPLATE_TYPE_NAME = 'RecommendationForm';
public const TEMPLATE_TYPE_TECHNICAL_NAME = 'recommendation_form';
public const MAIL_TEMPLATE_NAME = 'RecommendationFormTemplate';
public function install(InstallContext $installContext): void
{
/** @var EntityRepositoryInterface $mailTemplateTypeRepository */
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
/** @var EntityRepositoryInterface $mailTemplateRepository */
$mailTemplateRepository = $this->container->get('mail_template.repository');
$mailTemplateTypeId = Uuid::randomHex();
$mailTemplateType = [
[
'id' => $mailTemplateTypeId,
'name' => self::TEMPLATE_TYPE_NAME,
'technicalName' => self::TEMPLATE_TYPE_TECHNICAL_NAME,
'availableEntities' => [
'product' => 'product',
'salesChannel' => 'sales_channel',
'customer' => 'customer'
]
]
];
$mailTemplate = [
[
'id' => Uuid::randomHex(),
'mailTemplateTypeId' => $mailTemplateTypeId,
'subject' => [
'en-GB' => '{{ recommendationFormData.sName }} recommends you {{ recommendationFormData.sProduct }}',
'de-DE' => '{{ recommendationFormData.sName }} empfiehlt Ihnen {{ recommendationFormData.sProduct }}',
'it-IT' => '{{ recommendationFormData.sName }} consiglia {{ recommendationFormData.sProduct }}'
],
'contentPlain' => [
'en-GB' => 'Hello,\n\n{{ recommendationFormData.sName }} has found an interesting product for you at {{ salesChannel.name }} that you should take a look at:\n\n{{ recommendationFormData.sProduct }}\n{{ recommendationFormData.sProductLink }}\n\n{{ recommendationFormData.sComment }}',
'de-DE' => 'Hallo,\n\n{{ recommendationFormData.sName }} hat für Sie bei {{ salesChannel.name }} ein interessantes Produkt gefunden, das Sie sich anschauen sollten:\n\n{{ recommendationFormData.sProduct }}\n{{ recommendationFormData.sProductLink }}\n\n{{ recommendationFormData.sComment }}',
'it-IT' => 'Ciao,\n\n{{ recommendationFormData.sName }} ha trovato un prodotto interessante per lei da {{ salesChannel.name }} che dovreste guardare:\n\n{{ recommendationFormData.sProduct }}\n{{ recommendationFormData.sProductLink }}\n\n{{ recommendationFormData.sComment }}'
],
'contentHtml' => [
'en-GB' => '<div style="font-family:arial; font-size:12px;"><br/><br/><p>Hello,<br/><br/>{{ recommendationFormData.sName }} has found an interesting product for you at {{ salesChannel.name }} that you should take a look at:<br/><br/><strong><a href="{{ recommendationFormData.sProductLink }}">{{ recommendationFormData.sProduct }}</a></strong></p>{% if recommendationFormData.sComment %}<div style="border:2px solid black; border-radius: 5px; padding: 5px;">{{ recommendationFormData.sComment }}</div>{% endif %}</div>',
'de-DE' => '<div style="font-family:arial; font-size:12px;"><br/><br/><p>Hallo,<br/><br/>{{ recommendationFormData.sName }} hat für Sie bei {{ salesChannel.name }} ein interessantes Produkt gefunden, das Sie sich anschauen sollten:<br/><br/><strong><a href="{{ recommendationFormData.sProductLink }}">{{ recommendationFormData.sProduct }}</a></strong></p>{% if recommendationFormData.sComment %}<div style="border:2px solid black; border-radius: 5px; padding: 5px;">{{ recommendationFormData.sComment }}</div>{% endif %}</div>',
'it-IT' => '<div style="font-family:arial; font-size:12px;"><br/><br/><p>Ciao,<br/><br/>{{ recommendationFormData.sName }} ha trovato un prodotto interessante per lei da {{ salesChannel.name }} che dovreste guardare:<br/><br/><strong><a href="{{ recommendationFormData.sProductLink }}">{{ recommendationFormData.sProduct }}</a></strong></p>{% if recommendationFormData.sComment %}<div style="border:2px solid black; border-radius: 5px; padding: 5px;">{{ recommendationFormData.sComment }}</div>{% endif %}</div>'
]
]
];
try {
$mailTemplateTypeRepository->create($mailTemplateType, $installContext->getContext());
$mailTemplateRepository->create($mailTemplate, $installContext->getContext());
} catch (UniqueConstraintViolationException $exception) {
}
}
public function uninstall(UninstallContext $uninstallContext): void
{
if ($uninstallContext->keepUserData()) {
return;
}
/** @var EntityRepositoryInterface $mailTemplateTypeRepository */
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
/** @var EntityRepositoryInterface $mailTemplateRepository */
$mailTemplateRepository = $this->container->get('mail_template.repository');
/** @var MailTemplateTypeEntity $myCustomMailTemplateType */
$myCustomMailTemplateType = $mailTemplateTypeRepository->search(
(new Criteria())
->addFilter(new EqualsFilter('technicalName', self::TEMPLATE_TYPE_TECHNICAL_NAME)),
$uninstallContext
->getContext()
)->first();
$mailTemplateIds = $mailTemplateRepository->searchIds(
(new Criteria())
->addFilter(new EqualsFilter('mailTemplateTypeId', $myCustomMailTemplateType->getId())),
$uninstallContext
->getContext()
)->getIds();
$ids = array_map(static function ($id) {
return ['id' => $id];
}, $mailTemplateIds);
$mailTemplateRepository->delete($ids, $uninstallContext->getContext());
//Delete the TemplateType which were added by this Plugin
$mailTemplateTypeRepository->delete([
['id' => $myCustomMailTemplateType->getId()]
], $uninstallContext->getContext());
}
}