<?php declare(strict_types=1);
namespace Acris\Cms;
use Acris\Cms\Core\Content\FormBuilder\Event\FormBuilderSendEvent;
use Shopware\Core\Content\Flow\Dispatching\Action\SendMailAction;
use Shopware\Core\Defaults;
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\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\IdSearchResult;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\System\SalesChannel\Aggregate\SalesChannelType\SalesChannelTypeEntity;
class AcrisCmsCS extends Plugin
{
const DEFAULT_SALES_CHANNEL_TYPE_ICON = 'default-building-shop';
const DEFAULT_SALES_CHANNEL_TYPE_ICON_NEW = 'regular-storefront';
const DEFAULT_MAIL_TEMPLATE_TYPE_FORM_BUILDER = 'acrisFormBuilder';
const DEFAULT_FLOW_EVENT_FORM_BUILDER_WAS_SENT_NAME = 'ACRIS Form builder was sent';
public function activate(ActivateContext $context): void
{
$this->insertDefaultData($context->getContext());
}
public function update(UpdateContext $updateContext): void
{
$this->insertDefaultData($updateContext->getContext());
}
private function insertDefaultData(Context $context): void
{
$this->insertDefaultMailTemplateAndFlow($context);
}
private function insertDefaultMailTemplateAndFlow(Context $context)
{
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
/** @var IdSearchResult $mailTemplateTypeFormBuilderSearchResult */
$mailTemplateTypeFormBuilderSearchResult = $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName', self::DEFAULT_MAIL_TEMPLATE_TYPE_FORM_BUILDER)), $context);
if (empty($mailTemplateTypeFormBuilderSearchResult->firstId())) {
$mailTemplateTypeFormBuilderId = Uuid::randomHex();
$mailTemplateFormBuilderId = Uuid::randomHex();
$mailTemplateTypeFormBuilderData = [
'id' => $mailTemplateTypeFormBuilderId,
'technicalName' => self::DEFAULT_MAIL_TEMPLATE_TYPE_FORM_BUILDER,
'availableEntities' => ['salesChannel' => 'sales_channel', 'mailSubject' => null],
'translations' => [
'de-DE' => [
'name' => 'ACRIS Form builder'
],
'en-GB' => [
'name' => 'ACRIS Formular Builder'
],
[
'name' => 'ACRIS Form builder',
'languageId' => Defaults::LANGUAGE_SYSTEM
]
],
'mailTemplates' => [
[
'id' => $mailTemplateFormBuilderId,
'systemDefault' => true,
'translations' => [
'de-DE' => [
'senderName' => '{{ salesChannel.name }}',
'subject' => '{{ mailSubject }}',
'description' => 'E-Mail mit der Information, dass eine neue Nachricht vom Formular Builder gesendet wurde',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/de-DE/acris-form-builder.html.twig'),
'contentPlain' => 'Kein Inhalt.'
],
'en-GB' => [
'senderName' => '{{ salesChannel.name }}',
'subject' => '{{ mailSubject }}',
'description' => 'E-mail informing that a new message was sent from the form builder',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/en-GB/acris-form-builder.html.twig'),
'contentPlain' => 'No content.'
],
[
'senderName' => '{{ salesChannel.name }}',
'subject' => '{{ mailSubject }}',
'description' => 'E-mail informing that a new message was sent from the form builder',
'contentHtml' => file_get_contents($this->path . '/Resources/mail-template/html/en-GB/acris-form-builder.html.twig'),
'contentPlain' => 'No content.',
'languageId' => Defaults::LANGUAGE_SYSTEM
]
]
]
]
];
$mailTemplateTypeRepository->upsert([$mailTemplateTypeFormBuilderData], $context);
$this->upsertFlowBuilder(self::DEFAULT_FLOW_EVENT_FORM_BUILDER_WAS_SENT_NAME, FormBuilderSendEvent::EVENT_NAME, $mailTemplateFormBuilderId, $mailTemplateTypeFormBuilderId, $context);
}
}
private function upsertFlowBuilder(string $name, string $eventName, string $mailTemplateId, string $mailTemplateTypeId, Context $context): void
{
$flowRepository = $this->container->get('flow.repository');
$flowRepository->upsert([[
"name" => $name,
"eventName" => $eventName,
"priority" => 1,
"active" => true,
"sequences" => [
[
"actionName" => SendMailAction::getName(),
"config" => [
"mailTemplateId" => $mailTemplateId,
'mail_template_type_id' => $mailTemplateTypeId,
"recipient" => [
"type" => "default",
"data" => []
]
],
"position" => 2
]
]
]], $context);
}
public function uninstall(UninstallContext $context): void
{
if ($context->keepUserData()) {
return;
}
$this->removeDefaultMailTemplateAndFlow($context->getContext());
}
private function removeDefaultMailTemplateAndFlow(Context $context)
{
$mailTemplateTypeRepository = $this->container->get('mail_template_type.repository');
/** @var IdSearchResult $mailTemplateTypeFormBuilderSearchResult */
$mailTemplateTypeFormBuilderSearchResult = $mailTemplateTypeRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('technicalName', self::DEFAULT_MAIL_TEMPLATE_TYPE_FORM_BUILDER)), $context);
if($mailTemplateTypeFormBuilderSearchResult->firstId()) {
$mailTemplateRepository = $this->container->get('mail_template.repository');
$mailTemplateSearchResult = $mailTemplateRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId', $mailTemplateTypeFormBuilderSearchResult->firstId())), $context);
foreach ($mailTemplateSearchResult->getIds() as $id) {
$mailTemplateRepository->delete([['id'=>$id]], $context);
}
$mailTemplateTypeRepository->delete([['id'=>$mailTemplateTypeFormBuilderSearchResult->firstId()]], $context);
}
$flowRepository = $this->container->get('flow.repository');
/** @var IdSearchResult $flowSearchResult */
$flowSearchResult = $flowRepository->searchIds((new Criteria())->addFilter(new EqualsAnyFilter('eventName', [FormBuilderSendEvent::EVENT_NAME])), $context);
if($flowSearchResult->firstId()) {
$deleteBusinessEvents = [];
foreach ($flowSearchResult->getIds() as $id) {
$deleteBusinessEvents[] = ['id' => $id];
}
if (!empty($deleteBusinessEvents)) {
$flowRepository->delete($deleteBusinessEvents, $context);
}
}
}
}