<?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\BackendService; use SGalinski\SgMail\Service\MailTemplateService; use SGalinski\SgMail\Session\PhpSession; use TYPO3\CMS\Backend\Template\Components\DocHeaderComponent; use TYPO3\CMS\Backend\Utility\BackendUtility; 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 { /** * DocHeaderComponent * * @var DocHeaderComponent */ protected $docHeaderComponent; /** * @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 * @throws \InvalidArgumentException * @throws \UnexpectedValueException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ public function indexAction( $selectedTemplate = NULL, $selectedExtension = NULL, $selectedLanguageLeft = NULL, $selectedLanguageRight = NULL ) { $siteRootId = BackendService::getSiteRoot((int) GeneralUtility::_GP('id')); if (!($this->session instanceof PhpSession)) { $this->session = $this->objectManager->get('SGalinski\SgMail\Session\PhpSession'); $this->session->setSessionKey('sg_mail_controller_session'); } $registerArray = MailTemplateService::getRegisterArray(); // if no extensions are registered, redirect to empty action if (empty($registerArray)) { $this->redirect('empty'); } $languages = BackendService::getLanguages(); $this->view->assign('languages', $languages); $this->view->assign('templates', MailTemplateService::getRegisterArray()); // get language selection or read from cache or get default $selectedLanguages = BackendService::getSelectedLanguages( $selectedLanguageLeft, $selectedLanguageRight, $this->session, $languages ); if ($selectedTemplate === NULL || $selectedTemplate === '') { $selectedExtension = key($registerArray); $selectedTemplate = key($registerArray[$selectedExtension]); } $selectedTemplates = BackendService::getSelectedTemplates( $selectedExtension, $selectedTemplate, $selectedLanguages, $this->session, $siteRootId ); if ($selectedTemplates['left'] instanceof Template) { $this->view->assign('contentLeft', $selectedTemplates['left']->getContent()); $this->view->assign('fromNameLeft', $selectedTemplates['left']->getFromName()); $this->view->assign('fromMailLeft', $selectedTemplates['left']->getFromMail()); $this->view->assign('ccLeft', $selectedTemplates['left']->getCc()); $this->view->assign('bccLeft', $selectedTemplates['left']->getBcc()); $this->view->assign('replyToLeft', $selectedTemplates['left']->getReplyTo()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; $defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['left'] . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { $this->view->assign('contentLeft', file_get_contents($defaultTemplateFile)); } } if ($selectedTemplates['right'] instanceof Template) { $this->view->assign('contentRight', $selectedTemplates['right']->getContent()); $this->view->assign('fromNameRight', $selectedTemplates['right']->getFromName()); $this->view->assign('fromMailRight', $selectedTemplates['right']->getFromMail()); $this->view->assign('ccRight', $selectedTemplates['right']->getCc()); $this->view->assign('bccRight', $selectedTemplates['right']->getBcc()); $this->view->assign('replyToRight', $selectedTemplates['right']->getReplyTo()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; $defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['right'] . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { $this->view->assign('contentRight', file_get_contents($defaultTemplateFile)); } } $subject = $registerArray[$selectedExtension][$selectedTemplate]['subject']; if (is_array($subject)) { $this->view->assign( 'subjectLeft', $selectedTemplates['left'] !== NULL ? $selectedTemplates['left']->getSubject() : $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguages['left']] ); $this->view->assign( 'subjectRight', $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() : $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguages['right']] ); } else { $langFile = GeneralUtility::readLLfile( 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['left'] ); $translatedSubject = $langFile['default'][$subject][0]['target']; if ($langFile[$selectedLanguages['left']][$subject][0]) { $translatedSubject = $langFile[$selectedLanguages['left']][$subject][0]['target']; } $this->view->assign( 'subjectLeft', $selectedTemplates['left'] !== NULL ? $selectedTemplates['left']->getSubject() : $translatedSubject ); $langFile = GeneralUtility::readLLfile( 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['right'] ); $translatedSubject = $langFile['default'][$subject][0]['target']; if ($langFile[$selectedLanguages['left']][$subject][0][$subject]) { $translatedSubject = $langFile[$selectedLanguages['right']][$subject][0]['target']; } $this->view->assign( 'subjectRight', $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() : $translatedSubject ); } $templateDescription = $registerArray[$selectedExtension][$selectedTemplate]['description']; if (is_array($templateDescription)) { $templateDescription = $templateDescription[$selectedLanguages['left']]; } else { $templateDescription = LocalizationUtility::translate( $templateDescription, $selectedExtension ); } // create doc header component $pageUid = (int) GeneralUtility::_GP('id'); $pageInfo = BackendUtility::readPageAccess($pageUid, $GLOBALS['BE_USER']->getPagePermsClause(1)); if ($pageInfo) { $this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class); $this->docHeaderComponent->setMetaInformation($pageInfo); BackendService::makeButtons($this->docHeaderComponent, $this->request); $this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent()); $this->view->assign('templateDescription', $templateDescription); $this->view->assign('selectedTemplate', $registerArray[$selectedExtension][$selectedTemplate]); $this->view->assign('selectedTemplateKey', $selectedTemplate); $this->view->assign('selectedExtensionKey', $selectedExtension); $this->view->assign('selectedLanguageLeft', $selectedLanguages['left']); $this->view->assign('selectedLanguageRight', $selectedLanguages['right']); $this->view->assign('mode', 'editor'); } else { $this->view->assign('noPage', '1'); $this->addFlashMessage( LocalizationUtility::translate('backend.notice.OtherPages', 'SgMail'), '', FlashMessage::INFO ); $this->view->assign('pages', BackendService::getPages()); } } /** * 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 * @param string $fromNameLeft * @param string $fromMailLeft * @param string $ccLeft * @param string $bccLeft * @param string $replyToLeft * @param string $fromNameRight * @param string $fromMailRight * @param string $ccRight * @param string $bccRight * @param string $replyToRight * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ public function saveAction( $contentLeft = NULL, $contentRight = NULL, $selectedExtension = NULL, $selectedTemplate = NULL, $selectedLanguageLeft = NULL, $selectedLanguageRight = NULL, $subjectLeft = NULL, $subjectRight = NULL, $fromNameLeft = NULL, $fromMailLeft = NULL, $ccLeft = NULL, $bccLeft = NULL, $replyToLeft = NULL, $fromNameRight = NULL, $fromMailRight = NULL, $ccRight = NULL, $bccRight = NULL, $replyToRight = NULL ) { $this->saveTemplate( $selectedExtension, $selectedTemplate, $selectedLanguageLeft, $contentLeft, $subjectLeft, $fromNameLeft, $fromMailLeft, $ccLeft, $bccLeft, $replyToLeft ); if ($selectedLanguageLeft !== $selectedLanguageRight) { $this->saveTemplate( $selectedExtension, $selectedTemplate, $selectedLanguageRight, $contentRight, $subjectRight, $fromNameRight, $fromMailRight, $ccRight, $bccRight, $replyToRight ); } $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 * @param string $selectedFromName * @param string $selectedFromMail * @param string $selectedCc * @param string $selectedBcc * @param string $selectedReplyTo * @return Template $template * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException */ private function saveTemplate( $selectedExtension, $selectedTemplate, $selectedLanguage, $selectedContent, $selectedSubject, $selectedFromName, $selectedFromMail, $selectedCc, $selectedBcc, $selectedReplyTo ) { $pageUid = BackendService::getSiteRoot((int) GeneralUtility::_GP('id')); $siteRootId = BackendService::getSiteRoot($pageUid); /** @var Template $template */ $template = $this->templateRepository->findOneByTemplate( $selectedExtension, $selectedTemplate, $selectedLanguage, $siteRootId ); $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); $template->setFromName($selectedFromName); $template->setFromMail($selectedFromMail); $template->setCc($selectedCc); $template->setBcc($selectedBcc); $template->setReplyTo($selectedReplyTo); $template->setSiteRootId($siteRootId); 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 * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ 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); } /** * show a notice when no extension is registered */ public function emptyAction() { } /** * reset template values to default state for a specific language (delete from db) * * @param string $template * @param string $extensionKey * @param string $language * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ public function resetAction($template, $extensionKey, $language = '') { $this->templateRepository->deleteTemplate($extensionKey, $template, $language); $message = LocalizationUtility::translate('backend.template_reset', 'sg_mail'); $this->addFlashMessage($message, '', FlashMessage::OK); $arguments = $this->request->getArguments(); $this->redirect('index', NULL, NULL, $arguments); } }