<?php namespace SGalinski\SgMail\Controller; /*************************************************************** * Copyright notice * * (c) sgalinski Internet Services (https://www.sgalinski.de) * * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is * free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ use SGalinski\SgMail\Domain\Model\Template; use SGalinski\SgMail\Service\MailTemplateService; use SGalinski\SgMail\Session\PhpSession; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; /** * Controller for the mail templating service module */ class MailController extends ActionController { /** * @var \TYPO3\CMS\Lang\Domain\Repository\LanguageRepository * @inject */ protected $languageRepository; /** * @var \SGalinski\SgMail\Domain\Repository\TemplateRepository * @inject */ protected $templateRepository; /** * @var \SGalinski\SgMail\Session\PhpSession */ protected $session; /** * Show template Selection and enable content input + mail preview * * @param string $selectedTemplate * @param string $selectedExtension * @param string $selectedLanguageLeft * @param string $selectedLanguageRight * @param string $selectedExtensionKey * @param string $selectedTemplateKey */ public function indexAction( $selectedTemplate = NULL, $selectedExtension = NULL, $selectedLanguageLeft = NULL, $selectedLanguageRight = NULL, $selectedExtensionKey = NULL, $selectedTemplateKey = NULL ) { if (!($this->session instanceof PhpSession)) { $this->session = $this->objectManager->get('SGalinski\SgMail\Session\PhpSession'); $this->session->setSessionKey('sg_mail_controller_session'); } $registerArray = MailTemplateService::getRegisterArray(); $activatedLanguages = $this->languageRepository->findSelected(); $languages = ['en']; foreach ($activatedLanguages as $language) { $languages[] = $language->getLocale(); } $this->view->assign('languages', $languages); $this->view->assign('templates', MailTemplateService::getRegisterArray()); // get last selected languages if ($selectedLanguageLeft === NULL) { $selectedLanguageLeft = $this->session->getDataByKey('selectedLanguageLeft'); if ($selectedLanguageLeft === NULL) { $selectedLanguageLeft = $languages[0]; } } if ($selectedLanguageRight === NULL) { $selectedLanguageRight = $this->session->getDataByKey('selectedLanguageRight'); if ($selectedLanguageRight === NULL) { if (isset($languages[1])) { $selectedLanguageRight = $languages[1]; } else { $selectedLanguageRight = $languages[0]; } } } if ($selectedTemplate === NULL) { $selectedExtension = key($registerArray); $selectedTemplate = key($registerArray[$selectedExtension]); } $selectedTemplateArray = $registerArray[$selectedExtension][$selectedTemplate]; $this->session->setDataByKey('selectedLanguageLeft', $selectedLanguageLeft); $this->session->setDataByKey('selectedLanguageRight', $selectedLanguageRight); $templateLeft = $this->templateRepository->findOneByTemplate( $selectedExtension, $selectedTemplate, $selectedLanguageLeft ); $templateRight = $this->templateRepository->findOneByTemplate( $selectedExtensionKey, $selectedTemplateKey, $selectedLanguageRight ); if ($templateLeft !== NULL) { $this->view->assign('contentLeft', $templateLeft->getContent()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; $defaultTemplateFile = $defaultTemplatePath . $selectedLanguageLeft . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { $this->view->assign('contentLeft', file_get_contents($defaultTemplateFile)); } } if ($templateRight !== NULL) { $this->view->assign('contentRight', $templateRight->getContent()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; $defaultTemplateFile = $defaultTemplatePath . $selectedLanguageRight . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { $this->view->assign('contentRight', file_get_contents($defaultTemplateFile)); } } $this->view->assign( 'subjectLeft', $templateLeft !== NULL ? $templateLeft->getSubject() : $registerArray[$selectedExtension][$selectedTemplate]['subjects'][$selectedLanguageLeft] ); $this->view->assign( 'subjectRight', $templateRight !== NULL ? $templateRight->getSubject() : $registerArray[$selectedExtension][$selectedTemplate]['subjects'][$selectedLanguageRight] ); $this->view->assign('selectedTemplate', $selectedTemplateArray); $this->view->assign('selectedTemplateKey', $selectedTemplate); $this->view->assign('selectedExtensionKey', $selectedExtension); $this->view->assign('selectedLanguageLeft', $selectedLanguageLeft); $this->view->assign('selectedLanguageRight', $selectedLanguageRight); } /** * Save content (left & right) * if left & right is the same language, the right content will apply only if its another language * * @param string $contentLeft * @param string $contentRight * @param string $selectedExtension * @param string $selectedTemplate * @param string $selectedLanguageLeft * @param string $selectedLanguageRight * @param string $subjectLeft * @param string $subjectRight */ public function saveAction( $contentLeft = NULL, $contentRight = NULL, $selectedExtension = NULL, $selectedTemplate = NULL, $selectedLanguageLeft = NULL, $selectedLanguageRight = NULL, $subjectLeft = NULL, $subjectRight = NULL ) { $this->saveTemplate($selectedExtension, $selectedTemplate, $selectedLanguageLeft, $contentLeft, $subjectLeft); if ($selectedLanguageLeft !== $selectedLanguageRight) { $this->saveTemplate( $selectedExtension, $selectedTemplate, $selectedLanguageRight, $contentRight, $subjectRight ); } $message = LocalizationUtility::translate('backend.success', 'sg_mail'); $this->addFlashMessage($message, '', FlashMessage::OK); $arguments = $this->request->getArguments(); $this->redirect('index', NULL, NULL, $arguments); } /** * Save or update the template in the DB, depending if it already exists or not * * @param string $selectedExtension * @param string $selectedTemplate * @param string $selectedLanguage * @param string $selectedContent * @param string $selectedSubject * @return Template $template */ private function saveTemplate( $selectedExtension, $selectedTemplate, $selectedLanguage, $selectedContent, $selectedSubject ) { /** @var Template $template */ $template = $this->templateRepository->findOneByTemplate( $selectedExtension, $selectedTemplate, $selectedLanguage ); $templateAlreadyExists = TRUE; $objectManager = GeneralUtility::makeInstance(ObjectManager::class); if ($template === NULL) { $templateAlreadyExists = FALSE; $template = $objectManager->get(Template::class); } $template->setExtensionKey($selectedExtension); $template->setTemplateName($selectedTemplate); $template->setLanguage($selectedLanguage); $template->setContent($selectedContent); $template->setSubject($selectedSubject); if ($templateAlreadyExists) { $this->templateRepository->update($template); } else { $this->templateRepository->add($template); } return $template; } /** * send a test email to a given address * redirect to index action * * @param string $emailAddress * @param string $selectedTemplateKey * @param string $selectedExtensionKey * @param string $selectedLanguageLeft * @param string $selectedLanguageRight */ public function sendTestMailAction( $emailAddress, $selectedExtensionKey, $selectedTemplateKey, $selectedLanguageLeft, $selectedLanguageRight ) { $objectManager = GeneralUtility::makeInstance(ObjectManager::class); /** @var \SGalinski\SgMail\Service\MailTemplateService $mailTemplateService */ $mailTemplateService = $objectManager->get(MailTemplateService::class); $mailTemplateService->setLanguage($selectedLanguageLeft); $mailTemplateService->setToAddresses($emailAddress); $mailTemplateService->setFromAddress('noreply@example.org'); $mailTemplateService->setTemplateName($selectedTemplateKey); $mailTemplateService->setExtensionKey($selectedExtensionKey); $mailIsSend = $mailTemplateService->sendEmail(TRUE); if ($selectedLanguageRight !== $selectedLanguageLeft) { /** @var \SGalinski\SgMail\Service\MailTemplateService $mailTemplateService */ $mailTemplateService = $objectManager->get(MailTemplateService::class); $mailTemplateService->setLanguage($selectedLanguageRight); $mailTemplateService->setToAddresses($emailAddress); $mailTemplateService->setFromAddress('noreply@example.org'); $mailTemplateService->setTemplateName($selectedTemplateKey); $mailTemplateService->setExtensionKey($selectedExtensionKey); $mailIsSend = $mailTemplateService->sendEmail(TRUE); } if ($mailIsSend) { $message = LocalizationUtility::translate('backend.success_mail', 'sg_mail'); $this->addFlashMessage($message, '', FlashMessage::OK); } else { $message = LocalizationUtility::translate('backend.failure_mail', 'sg_mail'); $this->addFlashMessage($message, '', FlashMessage::ERROR); } $arguments = $this->request->getArguments(); $this->redirect('index', NULL, NULL, $arguments); } }