<?php
namespace Frosh\TemplateMail\Subscriber;
use Frosh\TemplateMail\Event\TemplateMailBusinessEvent;
use Frosh\TemplateMail\Services\MailFinderService;
use Frosh\TemplateMail\Services\MailFinderServiceInterface;
use Frosh\TemplateMail\Services\MailLoader\TwigLoader;
use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeCollection;
use Shopware\Core\Content\MailTemplate\MailTemplateEntity;
use Shopware\Core\Content\MailTemplate\MailTemplateEvents;
use Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeSentEvent;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mime\Part\DataPart;
class MailTemplateSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $mailTemplateTypeRepository;
/**
* @var MailFinderServiceInterface
*/
private $mailFinderService;
private SystemConfigService $config;
public function __construct(
EntityRepositoryInterface $mailTemplateTypeRepository,
MailFinderServiceInterface $mailFinderService,
SystemConfigService $config
) {
$this->mailTemplateTypeRepository = $mailTemplateTypeRepository;
$this->mailFinderService = $mailFinderService;
$this->config = $config;
}
public static function getSubscribedEvents(): array
{
return [
MailTemplateEvents::MAIL_TEMPLATE_LOADED_EVENT => 'onMailTemplatesLoaded',
MailBeforeSentEvent::class => "addAttachments"
];
}
public function onMailTemplatesLoaded(EntityLoadedEvent $event): void
{
$twig = new TwigLoader();
$source = $event->getContext()->getSource();
$salesChannelId = Defaults::SALES_CHANNEL;
if ($source instanceof SalesChannelApiSource) {
$salesChannelId = $source->getSalesChannelId();
}
$businessEvent = new TemplateMailBusinessEvent($salesChannelId, $event->getContext());
$context = Context::createDefaultContext();
/** @var MailTemplateTypeCollection $mailTemplateTypes */
$mailTemplateTypes = $this->mailTemplateTypeRepository->search(new Criteria(), $context)->getEntities();
/** @var MailTemplateEntity $mailTemplateEntity */
foreach ($event->getEntities() as $mailTemplateEntity) {
$mailTemplateType = $mailTemplateTypes->get($mailTemplateEntity->getMailTemplateTypeId());
if($mailTemplateType === null) {
continue;
}
$technicalName = $mailTemplateType->getTechnicalName();
$html = $this->mailFinderService->findTemplateByTechnicalName(MailFinderService::TYPE_HTML, $technicalName, $businessEvent, false);
$plain = $this->mailFinderService->findTemplateByTechnicalName(MailFinderService::TYPE_PLAIN, $technicalName, $businessEvent, false);
$subject = $this->mailFinderService->findTemplateByTechnicalName(MailFinderService::TYPE_SUBJECT, $technicalName, $businessEvent, false);
$mailTemplateEntity->addExtension(
'froshTemplateMail',
new ArrayStruct([
'html' => $html,
'plain' => $plain,
'subject' => $subject,
'technicalName' => $technicalName
]));
}
}
public function addAttachments(MailBeforeSentEvent $event){
$mail = $event->getMessage();
$images = [];
$images[] = ["SamsonLogo", $this->config->get('FroshPlatformTemplateMail.config.Base64Logo')];
$images[] = ["Facebook", $this->config->get('FroshPlatformTemplateMail.config.Base64Facebook')];
$images[] = ["Instagram", $this->config->get('FroshPlatformTemplateMail.config.Base64Instagram')];
$images[] = ["Pinterest", $this->config->get('FroshPlatformTemplateMail.config.Base64Pinterest')];
$images[] = ["LinkedIn", $this->config->get('FroshPlatformTemplateMail.config.Base64LinkedIn')];
foreach ($images as $image){
$mail->embed(base64_decode($image[1]), $image[0], "image/png");
}
}
}