diff --git a/Classes/Controller/MailController.php b/Classes/Controller/MailController.php index bc005b705a6d82a48da3e52424da8813ec998884..ceaf6b33226fb8085a9ae0c687329ad7f9ede40a 100644 --- a/Classes/Controller/MailController.php +++ b/Classes/Controller/MailController.php @@ -24,6 +24,7 @@ namespace SGalinski\SgMail\Controller; * * 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; @@ -40,6 +41,22 @@ use TYPO3\CMS\Extbase\Utility\LocalizationUtility; * Controller for the mail templating service module */ class MailController extends ActionController { + // Fluid variables + const FLUID_VAR_CONTENT_LEFT = 'contentLeft'; + const FLUID_VAR_FROM_NAME_LEFT = 'fromNameLeft'; + const FLUID_VAR_FROM_MAIL_LEFT = 'fromMailLeft'; + const FLUID_VAR_CC_LEFT = 'ccLeft'; + const FLUID_VAR_BCC_LEFT = 'bccLeft'; + const FLUID_VAR_REPLY_TO_LEFT = 'replyToLeft'; + const FLUID_SUBJECT_LEFT = 'subjectLeft'; + const FLUID_VAR_CONTENT_RIGHT = 'contentRight'; + const FLUID_VAR_FROM_NAME_RIGHT = 'fromNameRight'; + const FLUID_VAR_FROM_MAIL_RIGHT = 'fromMailRight'; + const FLUID_VAR_CC_RIGHT = 'ccRight'; + const FLUID_VAR_BCC_RIGHT = 'bccRight'; + const FLUID_VAR_REPLY_TO_RIGHT = 'replyToRight'; + const FLUID_SUBJECT_RIGHT = 'subjectRight'; + /** * DocHeaderComponent * @@ -71,17 +88,19 @@ class MailController extends ActionController { * @param string $selectedExtension * @param string $selectedLanguageLeft * @param string $selectedLanguageRight - * @param string $selectedExtensionKey - * @param string $selectedTemplateKey * @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, $selectedExtensionKey = NULL, $selectedTemplateKey = 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 = $this->objectManager->get(PhpSession::class); $this->session->setSessionKey('sg_mail_controller_session'); } @@ -92,76 +111,52 @@ class MailController extends ActionController { $this->redirect('empty'); } - $activatedLanguages = $this->languageRepository->findSelected(); - $languages = ['en']; - foreach ($activatedLanguages as $language) { - $languages[] = $language->getLocale(); - } + $languages = BackendService::getLanguages(); $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]; - } - } - } + // 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]); } - $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( - $selectedExtension, $selectedTemplate, $selectedLanguageRight + $selectedTemplates = BackendService::getSelectedTemplates( + $selectedExtension, $selectedTemplate, $selectedLanguages, $this->session, $siteRootId ); - if ($templateLeft !== NULL) { - $this->view->assign('contentLeft', $templateLeft->getContent()); - $this->view->assign('fromNameLeft', $templateLeft->getFromName()); - $this->view->assign('fromMailLeft', $templateLeft->getFromMail()); - $this->view->assign('ccLeft', $templateLeft->getCc()); - $this->view->assign('bccLeft', $templateLeft->getBcc()); - $this->view->assign('replyToLeft', $templateLeft->getReplyTo()); + if ($selectedTemplates['left'] instanceof Template) { + $this->view->assign(self::FLUID_VAR_CONTENT_LEFT, $selectedTemplates['left']->getContent()); + $this->view->assign(self::FLUID_VAR_FROM_NAME_LEFT, $selectedTemplates['left']->getFromName()); + $this->view->assign(self::FLUID_VAR_FROM_MAIL_LEFT, $selectedTemplates['left']->getFromMail()); + $this->view->assign(self::FLUID_VAR_CC_LEFT, $selectedTemplates['left']->getCc()); + $this->view->assign(self::FLUID_VAR_BCC_LEFT, $selectedTemplates['left']->getBcc()); + $this->view->assign(self::FLUID_VAR_REPLY_TO_LEFT, $selectedTemplates['left']->getReplyTo()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; - $defaultTemplateFile = $defaultTemplatePath . $selectedLanguageLeft . '.' . 'template.html'; + $defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['left'] . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { - $this->view->assign('contentLeft', file_get_contents($defaultTemplateFile)); + $this->view->assign(self::FLUID_VAR_CONTENT_LEFT, file_get_contents($defaultTemplateFile)); } } - if ($templateRight !== NULL) { - $this->view->assign('contentRight', $templateRight->getContent()); - $this->view->assign('fromNameRight', $templateRight->getFromName()); - $this->view->assign('fromMailRight', $templateRight->getFromMail()); - $this->view->assign('ccRight', $templateRight->getCc()); - $this->view->assign('bccRight', $templateRight->getBcc()); - $this->view->assign('replyToRight', $templateRight->getReplyTo()); + if ($selectedTemplates['right'] instanceof Template) { + $this->view->assign(self::FLUID_VAR_CONTENT_RIGHT, $selectedTemplates['right']->getContent()); + $this->view->assign(self::FLUID_VAR_FROM_NAME_RIGHT, $selectedTemplates['right']->getFromName()); + $this->view->assign(self::FLUID_VAR_FROM_MAIL_RIGHT, $selectedTemplates['right']->getFromMail()); + $this->view->assign(self::FLUID_VAR_CC_RIGHT, $selectedTemplates['right']->getCc()); + $this->view->assign(self::FLUID_VAR_BCC_RIGHT, $selectedTemplates['right']->getBcc()); + $this->view->assign(self::FLUID_VAR_REPLY_TO_RIGHT, $selectedTemplates['right']->getReplyTo()); } else { $defaultTemplatePath = $registerArray[$selectedExtension][$selectedTemplate]['templatePath']; - $defaultTemplateFile = $defaultTemplatePath . $selectedLanguageRight . '.' . 'template.html'; + $defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['right'] . '.' . 'template.html'; if (file_exists($defaultTemplateFile)) { - $this->view->assign('contentRight', file_get_contents($defaultTemplateFile)); + $this->view->assign(self::FLUID_VAR_CONTENT_RIGHT, file_get_contents($defaultTemplateFile)); } } @@ -169,51 +164,33 @@ class MailController extends ActionController { if (is_array($subject)) { $this->view->assign( - 'subjectLeft', $templateLeft !== NULL ? $templateLeft->getSubject() : - $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguageLeft] + self::FLUID_SUBJECT_LEFT, $selectedTemplates['left'] !== NULL ? $selectedTemplates['left']->getSubject() : + $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguages['left']] ); $this->view->assign( - 'subjectRight', $templateRight !== NULL ? $templateRight->getSubject() : - $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguageRight] + self::FLUID_SUBJECT_RIGHT, $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() : + $registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguages['right']] ); } else { - $langFile = GeneralUtility::readLLfile( - 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguageLeft + $translatedSubjects = BackendService::getTranslatedTemplateSubject( + $subject, $selectedExtension, $selectedLanguages ); - $translatedSubject = ''; - - if ($langFile[$selectedLanguageLeft][$subject][0]) { - $translatedSubject = $langFile[$selectedLanguageLeft][$subject][0]['target']; - } else { - $translatedSubject = $langFile['default'][$subject][0]['target']; - } $this->view->assign( - 'subjectLeft', $templateLeft !== NULL ? $templateLeft->getSubject() : - $translatedSubject - ); - - $langFile = GeneralUtility::readLLfile( - 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguageRight + self::FLUID_SUBJECT_LEFT, $selectedTemplates['left'] !== NULL ? $selectedTemplates['left']->getSubject() : + $translatedSubjects['left'] ); - $translatedSubject = ''; - - if ($langFile[$selectedLanguageLeft][$subject][0][$subject]) { - $translatedSubject = $langFile[$selectedLanguageRight][$subject][0]['target']; - } else { - $translatedSubject = $langFile['default'][$subject][0]['target']; - } $this->view->assign( - 'subjectRight', $templateRight !== NULL ? $templateRight->getSubject() : - $translatedSubject + self::FLUID_SUBJECT_RIGHT, $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() : + $translatedSubjects['right'] ); } $templateDescription = $registerArray[$selectedExtension][$selectedTemplate]['description']; if (is_array($templateDescription)) { - $templateDescription = $templateDescription[$selectedLanguageLeft]; + $templateDescription = $templateDescription[$selectedLanguages['left']]; } else { $templateDescription = LocalizationUtility::translate( $templateDescription, $selectedExtension @@ -231,20 +208,13 @@ class MailController extends ActionController { $this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent()); $this->view->assign('templateDescription', $templateDescription); - $this->view->assign('selectedTemplate', $selectedTemplateArray); + $this->view->assign('selectedTemplate', $registerArray[$selectedExtension][$selectedTemplate]); $this->view->assign('selectedTemplateKey', $selectedTemplate); $this->view->assign('selectedExtensionKey', $selectedExtension); - $this->view->assign('selectedLanguageLeft', $selectedLanguageLeft); - $this->view->assign('selectedLanguageRight', $selectedLanguageRight); + $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()); } - } /** @@ -269,6 +239,11 @@ class MailController extends ActionController { * @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, @@ -307,14 +282,19 @@ class MailController extends ActionController { * @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 ) { + $siteRootId = BackendService::getSiteRoot((int) GeneralUtility::_GP('id')); + /** @var Template $template */ $template = $this->templateRepository->findOneByTemplate( - $selectedExtension, $selectedTemplate, $selectedLanguage + $selectedExtension, $selectedTemplate, $selectedLanguage, $siteRootId ); $templateAlreadyExists = TRUE; @@ -334,6 +314,7 @@ class MailController extends ActionController { $template->setCc($selectedCc); $template->setBcc($selectedBcc); $template->setReplyTo($selectedReplyTo); + $template->setSiteRootId($siteRootId); if ($templateAlreadyExists) { $this->templateRepository->update($template); @@ -353,6 +334,10 @@ class MailController extends ActionController { * @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 @@ -403,6 +388,9 @@ class MailController extends ActionController { * @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); diff --git a/Classes/Controller/QueueController.php b/Classes/Controller/QueueController.php index a6ddd72fe21400ab83383203dfe1aa6d997da190..c67adeb953610e503ee3855b9f546338bfa9f925 100644 --- a/Classes/Controller/QueueController.php +++ b/Classes/Controller/QueueController.php @@ -24,12 +24,11 @@ namespace SGalinski\SgMail\Controller; * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ + +use SGalinski\SgMail\Service\BackendService; use SGalinski\SgMail\Service\MailTemplateService; -use TYPO3\CMS\Backend\Template\Components\ButtonBar; use TYPO3\CMS\Backend\Template\Components\DocHeaderComponent; use TYPO3\CMS\Backend\Utility\BackendUtility; -use TYPO3\CMS\Core\Imaging\Icon; -use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; @@ -60,6 +59,8 @@ class QueueController extends ActionController { /** * @param string $selectedTemplate * @param string $selectedExtension + * @throws \InvalidArgumentException + * @throws \UnexpectedValueException */ public function indexAction($selectedTemplate = NULL, $selectedExtension = NULL) { $registerArray = MailTemplateService::getRegisterArray(); @@ -68,32 +69,40 @@ class QueueController extends ActionController { $selectedExtension = key($registerArray); $selectedTemplate = key($registerArray[$selectedExtension]); } - $queue = $this->mailRepository->findAllEntries($selectedExtension, $selectedTemplate); + + $siteRootId = BackendService::getSiteRoot((int) GeneralUtility::_GP('id')); + $queue = $this->mailRepository->findAllEntries($selectedExtension, $selectedTemplate, $siteRootId); // create doc header component $pageUid = (int) GeneralUtility::_GP('id'); $pageInfo = BackendUtility::readPageAccess($pageUid, $GLOBALS['BE_USER']->getPagePermsClause(1)); - $this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class); - $this->docHeaderComponent->setMetaInformation($pageInfo); - $this->makeButtons(); - $this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent()); + if ($pageInfo) { + $this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class); - $this->view->assign('selectedTemplateKey', $selectedTemplate); - $this->view->assign('selectedExtensionKey', $selectedExtension); - $this->view->assign('templates', $registerArray); - $this->view->assign('queue', $queue); - $this->view->assign('mode', 'queue'); + $this->docHeaderComponent->setMetaInformation($pageInfo); + $this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent()); + BackendService::makeButtons($this->docHeaderComponent, $this->request); + + $this->view->assign('selectedTemplateKey', $selectedTemplate); + $this->view->assign('selectedExtensionKey', $selectedExtension); + $this->view->assign('templates', $registerArray); + $this->view->assign('queue', $queue); + $this->view->assign('mode', 'queue'); + } } /** * send or resend a mail in the queue * * @param int $uid - * @param string $selectedExtension - * @param string $selectedTemplate + * @throws \InvalidArgumentException + * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException + * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException + * @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException + * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ - public function sendMailAction($uid, $selectedExtension, $selectedTemplate) { + public function sendMailAction($uid) { $mailService = new MailTemplateService(); $mailService->sendMailFromQueue($uid); @@ -102,36 +111,4 @@ class QueueController extends ActionController { $arguments = $this->request->getArguments(); $this->redirect('index', NULL, NULL, $arguments); } - - /** - * create buttons for the backend module header - */ - private function makeButtons() { - /** @var ButtonBar $buttonBar */ - $buttonBar = $this->docHeaderComponent->getButtonBar(); - - /** @var IconFactory $iconFactory */ - $iconFactory = GeneralUtility::makeInstance(IconFactory::class); - - // Refresh - $refreshButton = $buttonBar->makeLinkButton() - ->setHref(GeneralUtility::getIndpEnv('REQUEST_URI')) - ->setTitle(LocalizationUtility::translate('LLL:EXT:lang/locallang_core.xlf:labels.reload', '')) - ->setIcon($iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL)); - $buttonBar->addButton($refreshButton, ButtonBar::BUTTON_POSITION_RIGHT); - - // shortcut button - $shortcutButton = $buttonBar->makeShortcutButton() - ->setModuleName($this->request->getPluginName()) - ->setGetVariables( - [ - 'id', - 'M' - ] - ) - ->setSetVariables([]); - - $buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT); - $this->docHeaderComponent->getButtonBar(); - } } diff --git a/Classes/Domain/Model/Mail.php b/Classes/Domain/Model/Mail.php index 0d0f46def35f76932e057134841b15226e62cb69..9db628c5d703ccd7863da3cacb7f2dad318b4b27 100644 --- a/Classes/Domain/Model/Mail.php +++ b/Classes/Domain/Model/Mail.php @@ -39,6 +39,11 @@ class Mail extends AbstractEntity { const PRIORITY_HIGH = 150; const PRIORITY_HIGHEST = 200; + /** + * @var int + */ + protected $siteRootId = 0; + /** * @var string */ @@ -291,4 +296,18 @@ class Mail extends AbstractEntity { public function setSendingTime($sendingTime) { $this->sendingTime = $sendingTime; } + + /** + * @return int + */ + public function getSiteRootId() { + return $this->siteRootId; + } + + /** + * @param int $siteRootId + */ + public function setSiteRootId($siteRootId) { + $this->siteRootId = (int) $siteRootId; + } } diff --git a/Classes/Domain/Model/Template.php b/Classes/Domain/Model/Template.php index 6df62cfb0f0aa116a4559176f9e35c47d065e543..150033895a51a004ed060b85d4ce178d8fa0d2d2 100644 --- a/Classes/Domain/Model/Template.php +++ b/Classes/Domain/Model/Template.php @@ -32,6 +32,11 @@ use TYPO3\CMS\Extbase\DomainObject\AbstractEntity; * Template domain model */ class Template extends AbstractEntity { + /** + * @var int + */ + protected $siteRootId = 0; + /** * @var string */ @@ -221,4 +226,18 @@ class Template extends AbstractEntity { public function setReplyTo($replyTo) { $this->replyTo = trim($replyTo); } + + /** + * @return int + */ + public function getSiteRootId() { + return $this->siteRootId; + } + + /** + * @param int $siteRootId + */ + public function setSiteRootId($siteRootId) { + $this->siteRootId = (int) $siteRootId; + } } diff --git a/Classes/Domain/Repository/MailRepository.php b/Classes/Domain/Repository/MailRepository.php index fefae2383ac4dfed84de47ac87106c4eac53383d..a611a204da83ee3c7ad405fb5514b7afc07ab2aa 100644 --- a/Classes/Domain/Repository/MailRepository.php +++ b/Classes/Domain/Repository/MailRepository.php @@ -55,10 +55,11 @@ class MailRepository extends AbstractRepository { * * @param string $extensionKey * @param string $templateName + * @param int $siteroot * @param int $limit * @return array|QueryResultInterface */ - public function findAllEntries($extensionKey, $templateName, $limit = NULL) { + public function findAllEntries($extensionKey, $templateName, $siteroot = 0, $limit = NULL) { $query = $this->createQuery(); if ($limit) { $query->setLimit($limit); @@ -66,6 +67,7 @@ class MailRepository extends AbstractRepository { $constraintsAnd[] = $query->equals('extension_key', $extensionKey); $constraintsAnd[] = $query->equals('template_name', $templateName); + $constraintsAnd[] = $query->equals('site_root_id', (int) $siteroot); $query->setOrderings(['tstamp' => Query::ORDER_DESCENDING]); return $query->matching($query->logicalAnd($constraintsAnd))->execute(TRUE); diff --git a/Classes/Domain/Repository/TemplateRepository.php b/Classes/Domain/Repository/TemplateRepository.php index 978b320f04302a393d5f0946cf4f2411dc39c7e3..d8663f06a7b8d735b43b9ea200b03562d46669b9 100644 --- a/Classes/Domain/Repository/TemplateRepository.php +++ b/Classes/Domain/Repository/TemplateRepository.php @@ -38,10 +38,11 @@ class TemplateRepository extends AbstractRepository { * @param string $extensionKey * @param string $templateName * @param string $language + * @param int $siteRoot * * @return Template */ - public function findOneByTemplate($extensionKey, $templateName, $language) { + public function findOneByTemplate($extensionKey, $templateName, $language, $siteRoot = 0) { $query = $this->createQuery(); $querySettings = $this->objectManager->get(Typo3QuerySettings::class); @@ -50,13 +51,14 @@ class TemplateRepository extends AbstractRepository { $constraintsAnd[] = $query->equals('extension_key', $extensionKey); $constraintsAnd[] = $query->equals('template_name', $templateName); $constraintsAnd[] = $query->equals('language', $language); + $constraintsAnd[] = $query->equals('site_root_id', (int) $siteRoot); $query->matching( $query->logicalAnd($constraintsAnd) ); /** @var Template $template */ - $template = $query->execute()->getFirst(); + $template = $query->setLimit(1)->execute()->getFirst(); return $template; } diff --git a/Classes/Service/BackendService.php b/Classes/Service/BackendService.php index 678d6551b70c39057b46d0a92c9515292eae3495..e57b32502bfa0bef85a3312776c4a5c4cc6af7d7 100644 --- a/Classes/Service/BackendService.php +++ b/Classes/Service/BackendService.php @@ -26,6 +26,7 @@ namespace SGalinski\SgMail\Service; * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ +use SGalinski\SgMail\Domain\Repository\TemplateRepository; use TYPO3\CMS\Backend\Template\Components\ButtonBar; use TYPO3\CMS\Backend\Template\Components\DocHeaderComponent; use TYPO3\CMS\Backend\Utility\BackendUtility; @@ -34,12 +35,15 @@ use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Request; +use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; +use TYPO3\CMS\Lang\Domain\Repository\LanguageRepository; /** * Backend Service class */ class BackendService { + /** * Get all pages the be user has access to * @@ -94,4 +98,151 @@ class BackendService { $buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT); $docHeaderComponent->getButtonBar(); } + + /** + * Retrieves the next site root in the page hierarchy from the current page + * + * @param int $currentPid + * @return int + */ + public static function getSiteRoot($currentPid) { + $rootLine = BackendUtility::BEgetRootLine((int) $currentPid); + $siteRoot = ['uid' => 0]; + + foreach ($rootLine as $page) { + if ($page['is_siteroot'] === '1') { + $siteRoot = $page; + break; + } + } + + return $siteRoot['uid']; + } + + /** + * get an array of all the locales for the activated languages + * + * @return array + * @throws \InvalidArgumentException + */ + public static function getLanguages() { + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + /** @var LanguageRepository $languageRepository */ + $languageRepository = $objectManager->get(LanguageRepository::class); + $activatedLanguages = $languageRepository->findSelected(); + + $languages = ['en']; + foreach ($activatedLanguages as $language) { + $languages[] = $language->getLocale(); + } + + return $languages; + } + + /** + * Get the previous selected languages, the actual selection or the default + * format ['left' => languagecode, 'right' => ...] + * + * @param string $selectedLanguageLeft + * @param string $selectedLanguageRight + * @param \SGalinski\SgMail\Session\PhpSession $session + * @param array $languages + * @return array + */ + public static function getSelectedLanguages( + $selectedLanguageLeft, $selectedLanguageRight, $session, array $languages + ) { + $selectedLanguages = [ + 'left' => $selectedLanguageLeft, + 'right' => $selectedLanguageRight + ]; + + if ($selectedLanguageLeft === NULL) { + $selectedLanguageLeftFromSession = $session->getDataByKey('selectedLanguageLeft'); + if ($selectedLanguageLeftFromSession !== NULL) { + $selectedLanguages['left'] = $selectedLanguageLeftFromSession; + } else { + $selectedLanguages['left'] = $languages[0]; + } + } + + if ($selectedLanguageRight === NULL) { + $selectedLanguageRightFromSession = $session->getDataByKey('selectedLanguageRight'); + if ($selectedLanguageRightFromSession === NULL) { + if (isset($languages[1])) { + $selectedLanguages['right'] = $languages[1]; + } else { + $selectedLanguages['right'] = $languages[0]; + } + } else { + $selectedLanguages['right'] = $selectedLanguageRightFromSession; + } + } + return $selectedLanguages; + } + + /** + * Get the selected templates for the selected language + * + * @param string $selectedExtension + * @param string $selectedTemplate + * @param array $selectedLanguages + * @param \SGalinski\SgMail\Session\PhpSession $session + * @param int $siteRootId + * @return array + * @throws \InvalidArgumentException + */ + public static function getSelectedTemplates( + $selectedExtension, $selectedTemplate, array $selectedLanguages, &$session, $siteRootId + ) { + $selectedTemplates = []; + + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + /** @var TemplateRepository $templateRepository */ + $templateRepository = $objectManager->get(TemplateRepository::class); + + $session->setDataByKey('selectedLanguageLeft', $selectedLanguages['left']); + $session->setDataByKey('selectedLanguageRight', $selectedLanguages['right']); + + $selectedTemplates['left'] = $templateRepository->findOneByTemplate( + $selectedExtension, $selectedTemplate, $selectedLanguages['left'], $siteRootId + ); + $selectedTemplates['right'] = $templateRepository->findOneByTemplate( + $selectedExtension, $selectedTemplate, $selectedLanguages['right'], $siteRootId + ); + + return $selectedTemplates; + } + + /** + * Get the translated subjects for the selected mail templates + * + * @param $subject + * @param $selectedExtension + * @param $selectedLanguages + * @return array + */ + public static function getTranslatedTemplateSubject($subject, $selectedExtension, $selectedLanguages) { + $translatedSubjects = []; + + $langFile = GeneralUtility::readLLfile( + 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['left'] + ); + $translatedSubjectLeft = $langFile['default'][$subject][0]['target']; + if ($langFile[$selectedLanguages['left']][$subject][0]) { + $translatedSubjectLeft = $langFile[$selectedLanguages['left']][$subject][0]['target']; + } + $translatedSubjects['left'] = $translatedSubjectLeft; + + $langFile = GeneralUtility::readLLfile( + 'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['right'] + ); + $translatedSubjectRight = $langFile['default'][$subject][0]['target']; + if ($langFile[$selectedLanguages['right']][$subject][0]) { + $translatedSubjectRight = $langFile[$selectedLanguages['right']][$subject][0]['target']; + } + $translatedSubjects['right'] = $translatedSubjectRight; + + return $translatedSubjects; + } } diff --git a/Classes/Service/FormhandlerFinisherService.php b/Classes/Service/FormhandlerFinisherService.php index 22b7e65309978f31ed286979f876ea86f790435e..319fc75b8fd66309789214880483a024e822a506 100644 --- a/Classes/Service/FormhandlerFinisherService.php +++ b/Classes/Service/FormhandlerFinisherService.php @@ -69,6 +69,8 @@ class FormhandlerFinisherService extends AbstractFinisher { * Needed to hook into Formhandler * * @return array $gp + * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException + * @throws \InvalidArgumentException */ public function process() { if (!isset($this->settings['to_address'])) { @@ -92,12 +94,4 @@ class FormhandlerFinisherService extends AbstractFinisher { return $this->gp; } - - /** - * Needed to hook into Formhandler - * simply returns true - */ - public function validateConfig() { - parent::validateConfig(); - } } diff --git a/Classes/Service/MailTemplateService.php b/Classes/Service/MailTemplateService.php index 0c716e4fb77000b16472c43ce9c977f9a3dd928a..1d62bc647448228613a3e16911f6539d45387df3 100644 --- a/Classes/Service/MailTemplateService.php +++ b/Classes/Service/MailTemplateService.php @@ -140,11 +140,6 @@ class MailTemplateService { */ protected $objectManager; - /** - * @var array - */ - private $attachments = []; - /** * MailTemplateService constructor. * @@ -282,42 +277,20 @@ class MailTemplateService { return self::$registerArray; } - /** - * Sets the predefined values for this template, supplied by the Editor, if possible - * values for cc, bcc, replyTo, fromMail and fromName - * - * @param string $extensionKey - * @param string $templateName - * @param string $language - * @return bool - */ - public function loadPredefinedValuesForTemplate($extensionKey, $templateName, $language) { - /** @var Template $template */ - $template = $this->templateRepository->findOneByTemplate( - $this->extensionKey, $this->templateName, $this->language - ); - - if ($template !== NULL) { - $this->setCcAddresses(GeneralUtility::trimExplode(',', $template->getCc())); - $this->setBccAddresses(GeneralUtility::trimExplode(',', $template->getBcc())); - $this->setReplyToAddress($template->getReplyTo()); - $this->setFromAddress($template->getFromMail(), $template->getFromName()); - return TRUE; - } - - return FALSE; - } - /** * Send the Email * * @param boolean $isPreview * @return boolean email was sent or added to mail queue successfully? + * @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException */ public function sendEmail($isPreview = FALSE) { + $pageUid = (int) GeneralUtility::_GP('id'); + $siteRootId = BackendService::getSiteRoot($pageUid); + /** @var Template $template */ $template = $this->templateRepository->findOneByTemplate( - $this->extensionKey, $this->templateName, $this->language + $this->extensionKey, $this->templateName, $this->language, $siteRootId ); // if there is a template, prefer those values @@ -364,7 +337,7 @@ class MailTemplateService { /** @var StandaloneView $emailView */ $emailView = $this->objectManager->get(StandaloneView::class); - if (null === $defaultTemplateContent) { + if (NULL === $defaultTemplateContent) { $emailView->setTemplateSource($template->getContent()); $subject = $template->getSubject(); } else { @@ -435,6 +408,10 @@ class MailTemplateService { $mail->setSendingTime($sendingTime); $mail->setReplyTo($this->replyToAddress); + $pageUid = (int) GeneralUtility::_GP('id'); + $siteRootId = BackendService::getSiteRoot($pageUid); + $mail->setSiteRootId($siteRootId); + $mailRepository = $this->objectManager->get(MailRepository::class); $mailRepository->add($mail); $this->persistenceManager->persistAll(); diff --git a/Classes/Updates/MigrateData.php b/Classes/Updates/MigrateData.php new file mode 100644 index 0000000000000000000000000000000000000000..3dec9e5b28520f41dcbad43a4346edae272827f8 --- /dev/null +++ b/Classes/Updates/MigrateData.php @@ -0,0 +1,124 @@ +<?php + +namespace SGalinski\SgMail\Updates; + +/*************************************************************** + * 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\Service\BackendService; +use TYPO3\CMS\Install\Updates\AbstractUpdate; + +/** + * Migrate template db entries to the correct root pages + */ +class MigrateData extends AbstractUpdate { + /** + * @var string + */ + protected $title = 'Find all templates & queue entries without site root and assign the correct site root id'; + + /** + * @var \TYPO3\CMS\Extbase\Object\ObjectManager + */ + protected $objectManager = NULL; + + /** + * @var array + */ + protected $tables = [ + 'tx_sgmail_domain_model_mail', 'tx_sgmail_domain_model_template' + ]; + + /** + * Checks whether updates are required. + * + * @param string &$description The description for the update + * @return bool Whether an update is required (TRUE) or not (FALSE) + */ + public function checkForUpdate(&$description) { + $description = 'Set the site_root_id for all the queue entries and templates if not set or pid = 0'; + + $databaseConnection = $this->getDatabaseConnection(); + $where = 'site_root_id = 0'; + + foreach ($this->tables as $table) { + $result = $databaseConnection->exec_SELECTquery('*', $table, $where); + if ($result->num_rows > 0) { + return TRUE; + } + } + + return FALSE; + } + + /** + * Performs the accordant updates. + * + * @param array &$dbQueries Queries done in this update + * @param mixed &$customMessages Custom messages + * @return bool Whether everything went smoothly or not + */ + public function performUpdate(array &$dbQueries, &$customMessages) { + $databaseConnection = $this->getDatabaseConnection(); + + foreach ($this->tables as $table) { + $where = 'site_root_id = 0'; + $result = $databaseConnection->exec_SELECTquery('uid, pid', $table, $where)->fetch_all(); + $dbQueries[] = $databaseConnection->debug_lastBuiltQuery; + + /** @var array $result */ + foreach ($result as $row) { + $siteRootId = BackendService::getSiteRoot($row[1]); + + if ($siteRootId === NULL) { + $this->retrieveFirstSiteRoot(); + } + + $where = 'uid = ' . $row[0]; + $databaseConnection->exec_UPDATEquery($table, $where, ['site_root_id' => $siteRootId]); + $dbQueries[] = $databaseConnection->debug_lastBuiltQuery; + } + } + + return TRUE; + } + + /** + * get the first site root that is not pid = 0 + * + * @return int + */ + private function retrieveFirstSiteRoot() { + $databaseConnection = $this->getDatabaseConnection(); + $where = "is_siteroot = 1 AND uid <> '0'"; + $pagesResult = $databaseConnection->exec_SELECTgetSingleRow('uid', 'pages', $where, '', '', '1'); + $dbQueries[] = $databaseConnection->debug_lastBuiltQuery; + + if (empty($pagesResult)) { + return 0; + } else { + return $pagesResult[0][0]; + } + } +} diff --git a/Configuration/TCA/tx_sgmail_domain_model_mail.php b/Configuration/TCA/tx_sgmail_domain_model_mail.php index 4289d3eb8bd65f80c654ff8a5decf698988225f6..5ec2f25f362218ca2fc4a7f9972f278975a54b00 100644 --- a/Configuration/TCA/tx_sgmail_domain_model_mail.php +++ b/Configuration/TCA/tx_sgmail_domain_model_mail.php @@ -32,7 +32,7 @@ return [ 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', - 'searchFields' => 'mail_subject, mail_body, to_address, from_address, from_name, bcc_addresses, cc_addresses, extension_key, template_name', + 'searchFields' => 'mail_subject, mail_body, to_address, from_address, from_name, bcc_addresses, cc_addresses, extension_key, template_name, site_root_id', 'dividers2tabs' => TRUE, 'delete' => 'deleted', 'enablecolumns' => [ @@ -42,11 +42,11 @@ return [ 'iconfile' => 'EXT:sg_mail/Resources/Public/Icons/ModuleIconTCA.svg' ], 'interface' => [ - 'showRecordFieldList' => 'hidden, mail_subject, mail_body, to_address, from_address, sent, priority, from_name, bcc_addresses, cc_addresses, extension_key, template_name', + 'showRecordFieldList' => 'hidden, mail_subject, mail_body, to_address, from_address, sent, priority, from_name, bcc_addresses, cc_addresses, extension_key, template_name, site_root_id', ], 'types' => [ '1' => [ - 'showitem' => 'hidden;;1, sent, priority, to_address, from_address, mail_subject, mail_body, from_name, bcc_addresses, cc_addresses, extension_key, template_name' + 'showitem' => 'hidden;;1, sent, priority, to_address, from_address, mail_subject, mail_body, from_name, bcc_addresses, cc_addresses, extension_key, template_name, site_root_id' ], ], 'columns' => [ @@ -157,6 +157,14 @@ return [ 'config' => [ 'type' => 'input' ], + ], + 'site_root_id' => [ + 'exclude' => TRUE, + 'label' => 'LLL:EXT:sg_mail/Resources/Private/Language/locallang_db.xlf:tx_sgmail_domain_model_mail.site_root_id', + 'config' => [ + 'type' => 'input', + 'eval' => 'int' + ], ] ] ]; diff --git a/Configuration/TCA/tx_sgmail_domain_model_template.php b/Configuration/TCA/tx_sgmail_domain_model_template.php index 0980b396627013466fd67f035c4428c2cc2d68da..49a0bb917216fdf5e7bd571c34bb2db47352ed60 100644 --- a/Configuration/TCA/tx_sgmail_domain_model_template.php +++ b/Configuration/TCA/tx_sgmail_domain_model_template.php @@ -33,7 +33,7 @@ return [ 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', - 'searchFields' => 'extension_key, template_name, language, subject, fromName, fromMail, replyTo', + 'searchFields' => 'extension_key, template_name, language, subject, fromName, fromMail, replyTo, site_root_id', 'dividers2tabs' => TRUE, 'delete' => 'deleted', 'enablecolumns' => [ @@ -43,11 +43,11 @@ return [ 'iconfile' => 'EXT:sg_mail/Resources/Public/Icons/ModuleIconTCA.svg' ], 'interface' => [ - 'showRecordFieldList' => 'extension_key, template_name, language, content, subject, fromName, fromMail, cc, bcc, replyTo' + 'showRecordFieldList' => 'extension_key, template_name, language, content, subject, fromName, fromMail, cc, bcc, replyTo, site_root_id' ], 'types' => [ '1' => [ - 'showitem' => 'hidden;;1, extension_key, template_name, language, content, subject, fromName, fromMail, cc, bcc, replyTo' + 'showitem' => 'hidden;;1, extension_key, template_name, language, content, subject, fromName, fromMail, cc, bcc, replyTo, site_root_id' ], ], 'columns' => [ @@ -133,6 +133,14 @@ return [ 'config' => [ 'type' => 'input' ], + ], + 'site_root_id' => [ + 'exclude' => TRUE, + 'label' => 'LLL:EXT:sg_mail/Resources/Private/Language/locallang_db.xlf:tx_sgmail_domain_model_template.site_root_id', + 'config' => [ + 'type' => 'input', + 'eval' => 'int' + ], ] ] ]; diff --git a/Configuration/TypoScript/setup.ts b/Configuration/TypoScript/setup.ts index 6847a026b6b51e4c0db9aeb16d035fc910b747ca..b992c26575d438b8993c448de649b716506609f0 100644 --- a/Configuration/TypoScript/setup.ts +++ b/Configuration/TypoScript/setup.ts @@ -10,10 +10,10 @@ module.tx_sgmail { # default from address default.from = noreply@example.org - # comma-separated list of additional bcc adresses + # comma-separated list of additional bcc addresses default.bcc = - # comma-separated list of additional cc adresses + # comma-separated list of additional cc addresses default.cc = } diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf index 1626e77940f2823312bc4631d8f465bbfbfd5292..665c0138b72c681cc6f2f788fcc1be5462e8c494 100644 --- a/Resources/Private/Language/de.locallang_db.xlf +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -57,6 +57,10 @@ <source>Sent</source> <target>Gesendet</target> </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.site_root_id" approved="yes"> + <source>Site root id</source> + <target>Site root id</target> + </trans-unit> <trans-unit id="tx_sgmail_domain_model_mail.template_name" approved="yes"> <source>Template Name</source> <target>Template Name</target> diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index 08e95fb6c9f6b7c41f697524b55c23234dd0eece..59049aae939e3ea1cfb1beac711043b186a07478 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -9,90 +9,93 @@ <authorEmail>torsten@sgalinski.de</authorEmail> </header> <body> - <trans-unit id="tx_sgmail_domain_model_mail"> - <source>Mail Queue Entry</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.bcc_addresses"> - <source>BCC Addresses</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.cc_addresses"> - <source>CC Addresses</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.extension_key"> - <source>Extension Key</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.from_address"> - <source>Sender email address</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.from_name"> - <source>Sender Name</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.mail_body"> - <source>Mail text</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.mail_subject"> - <source>Mail subject</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.priority"> - <source>Priority (Lowest = 0 | Low = 50 | Medium = 100 | High = 150 | Highest = 200)</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.reply_to"> - <source>Reply To</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.sending_time"> - <source>Sent at</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.sent"> - <source>Sent</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.template_name"> - <source>Template Name</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_mail.to_address"> - <source>Receiver email address</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template"> - <source>Template</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.bcc"> - <source>BCC (Blind Carbon Copy Receiver)</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.bcc_addresses"> - <source>BCC-Adressen</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.cc"> - <source>CC (Carbon Copy Receiver)</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.cc_addresses"> - <source>CC-Adressen</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.content"> - <source>Content</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.extension_key"> - <source>Extension Key</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.fromMail"> - <source>Sender-E-Mail-Address</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.fromName"> - <source>Sender Name</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.from_name"> - <source>Sender Name</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.language"> - <source>Language</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.replyTo"> - <source>Reply To</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.subject"> - <source>Subject</source> - </trans-unit> - <trans-unit id="tx_sgmail_domain_model_template.template_name"> - <source>Template Name</source> - </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail"> + <source>Mail Queue Entry</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.bcc_addresses"> + <source>BCC Addresses</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.cc_addresses"> + <source>CC Addresses</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.extension_key"> + <source>Extension Key</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.from_address"> + <source>Sender email address</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.from_name"> + <source>Sender Name</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.mail_body"> + <source>Mail text</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.mail_subject"> + <source>Mail subject</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.priority"> + <source>Priority (Lowest = 0 | Low = 50 | Medium = 100 | High = 150 | Highest = 200)</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.reply_to"> + <source>Reply To</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.sending_time"> + <source>Sent at</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.sent"> + <source>Sent</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.site_root_id"> + <source>Site root id</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.template_name"> + <source>Template Name</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_mail.to_address"> + <source>Receiver email address</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template"> + <source>Template</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.bcc"> + <source>BCC (Blind Carbon Copy Receiver)</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.bcc_addresses"> + <source>BCC-Adressen</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.cc"> + <source>CC (Carbon Copy Receiver)</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.cc_addresses"> + <source>CC-Adressen</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.content"> + <source>Content</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.extension_key"> + <source>Extension Key</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.fromMail"> + <source>Sender-E-Mail-Address</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.fromName"> + <source>Sender Name</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.from_name"> + <source>Sender Name</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.language"> + <source>Language</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.replyTo"> + <source>Reply To</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.subject"> + <source>Subject</source> + </trans-unit> + <trans-unit id="tx_sgmail_domain_model_template.template_name"> + <source>Template Name</source> + </trans-unit> </body> </file> </xliff> \ No newline at end of file diff --git a/Resources/Private/Layouts/Default.html b/Resources/Private/Layouts/Default.html index 95736c2d1922036cb02ca666e0885f91e1b695e2..fa0a2b97789aabf116a17b67c0d4337477bcf949 100644 --- a/Resources/Private/Layouts/Default.html +++ b/Resources/Private/Layouts/Default.html @@ -6,119 +6,104 @@ <div class="module" data-module-id="" data-module-name=""> <div class="module-docheader t3js-module-docheader"> <div class="module-docheader-bar module-docheader-bar-navigation t3js-module-docheader-bar t3js-module-docheader-bar-navigation"> - <f:if condition="{noPage}"> - <f:then></f:then> - <f:else> - <div class="module-docheader-bar-column-left"> + <div class="module-docheader-bar-column-left"> + <f:be.menus.actionMenu> + <f:if condition="{mode} == 'queue'"> + <f:then> + <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.mail_queue')}" + controller="Queue" + action="index" + arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.mail_queue')}" + controller="Queue" + action="index" + arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" /> + </f:else> + </f:if> + <f:if condition="{mode} == 'editor'"> + <f:then> + <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.template_editor')}" + controller="Mail" + action="index" + arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.template_editor')}" + controller="Mail" + action="index" + arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" /> + </f:else> + </f:if> + </f:be.menus.actionMenu> + </div> + <div class="module-docheader-bar-column-right"> + <span class="typo3-docheader-pagePath"><f:translate key="LLL:EXT:lang/locallang_core.xlf:labels.path" />: <f:format.raw>{docHeader.metaInformation.path}</f:format.raw></span> + <f:format.raw>{docHeader.metaInformation.recordInformation}</f:format.raw> + </div> + </div> + <div class="module-docheader-bar module-docheader-bar-buttons t3js-module-docheader-bar t3js-module-docheader-bar-buttons"> + <div class="module-docheader-bar-column-left"> + <div class="btn-toolbar" role="toolbar" aria-label=""> + <f:if condition="{templates}"> <f:be.menus.actionMenu> - <f:if condition="{mode} == 'queue'"> - <f:then> - <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.mail_queue')}" - controller="Queue" - action="index" - arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> + <f:for each="{templates}" as="template" key="extensionKey"> + <f:if condition="{mode} == 'queue'"> + <sgm:be.menus.actionMenuOptionGroup label="{extensionKey}"> + <f:for each="{template}" as="currentTemplate" key="templateKey"> + <sgm:extendedIf condition="{selectedTemplateKey} == {templateKey}" + and="{selectedExtensionKey} == {extensionKey}"> + <f:then> + <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" + controller="Queue" + action="index" + arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" + controller="Queue" + action="index" + arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" /> + </f:else> + </sgm:extendedIf> + </f:for> + </sgm:be.menus.actionMenuOptionGroup> + </f:if> <f:else> - <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.mail_queue')}" - controller="Queue" - action="index" - arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" /> + <f:if condition="{mode} == 'editor'"> + <sgm:be.menus.actionMenuOptionGroup label="{extensionKey}"> + <f:for each="{template}" as="currentTemplate" key="templateKey"> + <sgm:extendedIf condition="{selectedTemplateKey} == {templateKey}" + and="{selectedExtensionKey} == {extensionKey}"> + <f:then> + <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" + controller="Mail" + action="index" + arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" + controller="Mail" + action="index" + arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" /> + </f:else> + </sgm:extendedIf> + </f:for> + </sgm:be.menus.actionMenuOptionGroup> + </f:if> </f:else> - </f:if> - <f:if condition="{mode} == 'editor'"> - <f:then> - <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.template_editor')}" - controller="Mail" - action="index" - arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> - <f:else> - <sgm:be.menus.actionMenuItem label="{f:translate(key:'backend.template_editor')}" - controller="Mail" - action="index" - arguments="{selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}" /> - </f:else> - </f:if> + </f:for> </f:be.menus.actionMenu> - </div> - <div class="module-docheader-bar-column-right"> - <span class="typo3-docheader-pagePath"><f:translate key="LLL:EXT:lang/locallang_core.xlf:labels.path" />: <f:format.raw>{docHeader.metaInformation.path}</f:format.raw></span> - <f:format.raw>{docHeader.metaInformation.recordInformation}</f:format.raw> - </div> - </f:else> - </f:if> - </div> - <div class="module-docheader-bar module-docheader-bar-buttons t3js-module-docheader-bar t3js-module-docheader-bar-buttons"> - <f:if condition="{noPage}"> - <f:then></f:then> - <f:else> - <div class="module-docheader-bar-column-left"> - <div class="btn-toolbar" role="toolbar" aria-label=""> - <f:if condition="{templates}"> - <f:be.menus.actionMenu> - <f:for each="{templates}" as="template" key="extensionKey"> - <f:if condition="{mode} == 'queue'"> - <sgm:be.menus.actionMenuOptionGroup label="{extensionKey}"> - <f:for each="{template}" as="currentTemplate" key="templateKey"> - <sgm:extendedIf condition="{selectedTemplateKey} == {templateKey}" - and="{selectedExtensionKey} == {extensionKey}"> - <f:then> - <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" - controller="Queue" - action="index" - arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> - <f:else> - <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" - controller="Queue" - action="index" - arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" /> - </f:else> - </sgm:extendedIf> - </f:for> - </sgm:be.menus.actionMenuOptionGroup> - </f:if> - <f:else> - <f:if condition="{mode} == 'editor'"> - <sgm:be.menus.actionMenuOptionGroup label="{extensionKey}"> - <f:for each="{template}" as="currentTemplate" key="templateKey"> - <sgm:extendedIf condition="{selectedTemplateKey} == {templateKey}" - and="{selectedExtensionKey} == {extensionKey}"> - <f:then> - <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" - controller="Mail" - action="index" - arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> - <f:else> - <sgm:be.menus.actionMenuItem label="{currentTemplate.templateName}" - controller="Mail" - action="index" - arguments="{selectedTemplate: templateKey, selectedExtension: extensionKey}" /> - </f:else> - </sgm:extendedIf> - </f:for> - </sgm:be.menus.actionMenuOptionGroup> - </f:if> - </f:else> - </f:for> - </f:be.menus.actionMenu> - </f:if> - </div> - </div> - </f:else> - </f:if> + </f:if> + </div> + </div> <div class="module-docheader-bar-column-right"> - <f:if condition="{noPage}"> - <f:then></f:then> - <f:else> - <f:render partial="ButtonBar" arguments="{buttons:docHeader.buttons.right}" /> - </f:else> - </f:if> + <f:render partial="ButtonBar" arguments="{buttons:docHeader.buttons.right}" /> </div> </div> </div> diff --git a/Resources/Private/Templates/Mail/Index.html b/Resources/Private/Templates/Mail/Index.html index b5b5f3f32741bda6034c4464f9f215df73f4a4fc..00a638f7fbd4fa596bb1fc3a1946197741f56f19 100644 --- a/Resources/Private/Templates/Mail/Index.html +++ b/Resources/Private/Templates/Mail/Index.html @@ -5,233 +5,205 @@ <f:section name="iconButtons"> </f:section> <f:section name="content"> - <f:flashMessages/> - <f:if condition="{noPage}"> + <f:flashMessages /> + <f:if condition="{selectedTemplate}"> <f:then> - <f:if condition="{pages}"> - <div class="panel panel-default recordlist"> - <div class="table-fit"> - <table data-table="pages" class="table table-striped table-hover"> - <tbody> - <f:for each="{pages}" as="page"> - <tr data-uid="{page.uid}"> - <td nowrap="nowrap" class="col-title"> - <a href="#" onclick="sgMailGoToPage({page.uid}); return false;"> - <sgm:backend.icon table="pages" row="{page}" clickMenu="0" /> - {page.title} - </a> - </td> - </tr> - </f:for> - </tbody> - </table> + <div class="form-group col-md-6"> + <p>{templateDescription}</p> + </div> + <div class="form-group col-md-2 col-md-offset-3"> + <f:link.action class="reset-btn reset-all-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset_all')}</f:link.action> + </div> + <div class="col-md-12"> + <table class="table table-hover"> + <thead> + <tr> + <th><f:translate key="backend.marker" /></th> + <th><f:translate key="backend.type" /></th> + <th><f:translate key="backend.value" /></th> + <th><f:translate key="backend.usage" /></th> + <th><f:translate key="backend.description" /></th> + </tr> + </thead> + <f:for each="{selectedTemplate.marker}" as="marker"> + <tr> + <td>{marker.marker}</td> + <td> + <f:if condition="{marker.type}"> + <f:then> + <f:translate key="{marker.type}">{marker.type}</f:translate> + </f:then> + <f:else> + <f:translate key="backend.marker.type.string" /> + </f:else> + </f:if> + </td> + <td> + <f:if condition="{sgm:isArray(value: '{marker.value}')}"> + <f:then> + <f:for each="{marker.value}" as="value" key="key"> + {key}: {value} + <br /> + </f:for> + </f:then> + <f:else> + <f:translate key="{marker.value}">{marker.value}</f:translate> + </f:else> + </f:if> + </td> + <td> + <f:if condition="{marker.usage}"> + <f:then> + {marker.usage} + </f:then> + <f:else> + <![CDATA[{]]>{marker.marker}<![CDATA[}]]> + </f:else> + </f:if> + </td> + <td> + <f:translate key="{marker.description}">{marker.description}</f:translate> + </td> + </tr> + </f:for> + </table> + </div> + <f:form class="col-md-12" method="post" controller="Mail" action="sendTestMail"> + <f:form.submit class="btn-primary btn form-group" value="{f:translate(key:'backend.send_test')}" /> + <f:form.textfield name="emailAddress" type="email" required="TRUE" class="email-input form-group" placeholder="{f:translate(key:'backend.email')}" /> + <f:form.hidden name="selectedLanguageLeft" value="{selectedLanguageLeft}" /> + <f:form.hidden name="selectedLanguageRight" value="{selectedLanguageRight}" /> + <f:form.hidden name="selectedTemplate" value="{selectedTemplateKey}" /> + <f:form.hidden name="selectedExtensionKey" value="{selectedTemplate.extension}" /> + <f:form.hidden name="selectedExtension" value="{selectedTemplate.extension}" /> + <f:form.hidden name="selectedTemplateKey" value="{selectedTemplateKey}" /> + </f:form> + <f:form method="post" controller="Mail" action="save"> + <div class="col-md-12 form-group"> + <f:form.submit class="btn-save-backend btn-success btn col-md-2 form-group" value="{f:translate(key:'backend.save')}" /> + </div> + <div class="col-md-6"> + <div class="form-group"> + <label class="">{f:translate(key:'backend.select_language')}</label> + <f:be.menus.actionMenu> + <f:for each="{languages}" as="language"> + <sgm:extendedIf condition="{language} == {selectedLanguageLeft}"> + <f:then> + <sgm:be.menus.actionMenuItem label="{language}" + controller="Mail" + action="index" + arguments="{selectedLanguageLeft: language, selectedLanguageRight: selectedLanguageRight, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{language}" + controller="Mail" + action="index" + arguments="{selectedLanguageLeft: language, selectedLanguageRight: selectedLanguageRight, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" /> + </f:else> + </sgm:extendedIf> + </f:for> + </f:be.menus.actionMenu> + </div> + <div class="form-group"> + <f:link.action class="reset-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, language: selectedLanguageLeft, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset')}</f:link.action> + </div> + <div class="form-group"> + <label for="fromNameLeft" class="">{f:translate(key:'backend.fromName')}</label> + <f:form.textfield type="text" class="form-control" value="{fromNameLeft}" name="fromNameLeft" /> + </div> + <div class="form-group"> + <label for="fromMailLeft" class="">{f:translate(key:'backend.fromMail')}</label> + <f:form.textfield type="email" class="form-control" value="{fromMailLeft}" name="fromMailLeft" /> + </div> + <div class="form-group"> + <label for="ccLeft" class="">{f:translate(key:'backend.cc')}</label> + <f:form.textfield type="text" class="form-control" value="{ccLeft}" name="ccLeft" /> + </div> + <div class="form-group"> + <label for="bccLeft" class="">{f:translate(key:'backend.bcc')}</label> + <f:form.textfield type="text" class="form-control" value="{bccLeft}" name="bccLeft" /> </div> + <div class="form-group"> + <label for="replyToLeft" class="">{f:translate(key:'backend.replyTo')}</label> + <f:form.textfield type="text" class="form-control" value="{replyToLeft}" name="replyToLeft" /> + </div> + <div class="form-group"> + <label for="subjectLeft" class="">{f:translate(key:'backend.subject')}</label> + <f:form.textfield type="text" class="form-control" value="{subjectLeft}" name="subjectLeft" /> + </div> + <label for="contentLeft" class="">{f:translate(key:'backend.content')}</label> + <f:form.textarea class="form-control" rows="25" name="contentLeft" value="{contentLeft}" /> + <f:form.hidden name="selectedLanguageLeft" value="{selectedLanguageLeft}" /> + <f:form.hidden name="selectedLanguageRight" value="{selectedLanguageRight}" /> + <f:form.hidden name="selectedTemplate" value="{selectedTemplateKey}" /> + <f:form.hidden name="selectedExtensionKey" value="{selectedTemplate.extension}" /> + <f:form.hidden name="selectedExtension" value="{selectedTemplate.extension}" /> + <f:form.hidden name="selectedTemplateKey" value="{selectedTemplateKey}" /> </div> - </f:if> - </f:then> - <f:else> - <f:if condition="{selectedTemplate}"> - <f:then> - <div class="form-group col-md-6"> - <p>{templateDescription}</p> - </div> - <div class="form-group col-md-2 col-md-offset-3"> - <f:link.action class="reset-btn reset-all-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset_all')}</f:link.action> - </div> - <div class="col-md-12"> - <table class="table table-hover"> - <thead> - <tr> - <th><f:translate key="backend.marker" /></th> - <th><f:translate key="backend.type" /></th> - <th><f:translate key="backend.value" /></th> - <th><f:translate key="backend.usage" /></th> - <th><f:translate key="backend.description" /></th> - </tr> - </thead> - <f:for each="{selectedTemplate.marker}" as="marker"> - <tr> - <td>{marker.marker}</td> - <td> - <f:if condition="{marker.type}"> - <f:then> - <f:translate key="{marker.type}">{marker.type}</f:translate> - </f:then> - <f:else> - <f:translate key="backend.marker.type.string" /> - </f:else> - </f:if> - </td> - <td> - <f:if condition="{sgm:isArray(value: '{marker.value}')}"> - <f:then> - <f:for each="{marker.value}" as="value" key="key"> - {key}: {value} - <br /> - </f:for> - </f:then> - <f:else> - <f:translate key="{marker.value}">{marker.value}</f:translate> - </f:else> - </f:if> - </td> - <td> - <f:if condition="{marker.usage}"> - <f:then> - {marker.usage} - </f:then> - <f:else> - <![CDATA[{]]>{marker.marker}<![CDATA[}]]> - </f:else> - </f:if> - </td> - <td> - <f:translate key="{marker.description}">{marker.description}</f:translate> - </td> - </tr> + <div class="col-md-6"> + <div class="form-group"> + <label class="">{f:translate(key:'backend.select_language')}</label> + <f:be.menus.actionMenu> + <f:for each="{languages}" as="language"> + <sgm:extendedIf condition="{language} == {selectedLanguageRight}"> + <f:then> + <sgm:be.menus.actionMenuItem label="{language}" + controller="Mail" + action="index" + arguments="{selectedLanguageLeft: selectedLanguageLeft, selectedLanguageRight: language, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" + additionalAttributes="{selected: 'selected'}" /> + </f:then> + <f:else> + <sgm:be.menus.actionMenuItem label="{language}" + controller="Mail" + action="index" + arguments="{selectedLanguageLeft: selectedLanguageLeft, selectedLanguageRight: language, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" /> + </f:else> + </sgm:extendedIf> </f:for> - </table> - </div> - <f:form class="col-md-12" method="post" controller="Mail" action="sendTestMail"> - <f:form.submit class="btn-primary btn form-group" value="{f:translate(key:'backend.send_test')}" /> - <f:form.textfield name="emailAddress" type="email" required="TRUE" class="email-input form-group" placeholder="{f:translate(key:'backend.email')}" /> - <f:form.hidden name="selectedLanguageLeft" value="{selectedLanguageLeft}"></f:form.hidden> - <f:form.hidden name="selectedLanguageRight" value="{selectedLanguageRight}"></f:form.hidden> - <f:form.hidden name="selectedTemplate" value="{selectedTemplateKey}"></f:form.hidden> - <f:form.hidden name="selectedExtensionKey" value="{selectedTemplate.extension}"></f:form.hidden> - <f:form.hidden name="selectedExtension" value="{selectedTemplate.extension}"></f:form.hidden> - <f:form.hidden name="selectedTemplateKey" value="{selectedTemplateKey}"></f:form.hidden> - </f:form> - <f:form method="post" controller="Mail" action="save"> - <div class="col-md-12 form-group"> - <f:form.submit class="btn-save-backend btn-success btn col-md-2 form-group" value="{f:translate(key:'backend.save')}" /> - </div> - <div class="col-md-6"> - <div class="form-group"> - <label class="">{f:translate(key:'backend.select_language')}</label> - <f:be.menus.actionMenu> - <f:for each="{languages}" as="language"> - <sgm:extendedIf condition="{language} == {selectedLanguageLeft}"> - <f:then> - <sgm:be.menus.actionMenuItem label="{language}" - controller="Mail" - action="index" - arguments="{selectedLanguageLeft: language, selectedLanguageRight: selectedLanguageRight, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> - <f:else> - <sgm:be.menus.actionMenuItem label="{language}" - controller="Mail" - action="index" - arguments="{selectedLanguageLeft: language, selectedLanguageRight: selectedLanguageRight, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" /> - </f:else> - </sgm:extendedIf> - </f:for> - </f:be.menus.actionMenu> - </div> - <div class="form-group"> - <f:link.action class="reset-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, language: selectedLanguageLeft, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset')}</f:link.action> - </div> - <div class="form-group"> - <label for="fromNameLeft" class="">{f:translate(key:'backend.fromName')}</label> - <f:form.textfield type="text" class="form-control" value="{fromNameLeft}" name="fromNameLeft"></f:form.textfield> - </div> - <div class="form-group"> - <label for="fromMailLeft" class="">{f:translate(key:'backend.fromMail')}</label> - <f:form.textfield type="email" class="form-control" value="{fromMailLeft}" name="fromMailLeft"></f:form.textfield> - </div> - <div class="form-group"> - <label for="ccLeft" class="">{f:translate(key:'backend.cc')}</label> - <f:form.textfield type="text" class="form-control" value="{ccLeft}" name="ccLeft"></f:form.textfield> - </div> - <div class="form-group"> - <label for="bccLeft" class="">{f:translate(key:'backend.bcc')}</label> - <f:form.textfield type="text" class="form-control" value="{bccLeft}" name="bccLeft"></f:form.textfield> - </div> - <div class="form-group"> - <label for="replyToLeft" class="">{f:translate(key:'backend.replyTo')}</label> - <f:form.textfield type="text" class="form-control" value="{replyToLeft}" name="replyToLeft"></f:form.textfield> - </div> - <div class="form-group"> - <label for="subjectLeft" class="">{f:translate(key:'backend.subject')}</label> - <f:form.textfield type="text" class="form-control" value="{subjectLeft}" name="subjectLeft"></f:form.textfield> - </div> - <label for="contentLeft" class="">{f:translate(key:'backend.content')}</label> - <f:form.textarea class="form-control" rows="25" name="contentLeft" value="{contentLeft}"></f:form.textarea> - <f:form.hidden name="selectedLanguageLeft" value="{selectedLanguageLeft}"></f:form.hidden> - <f:form.hidden name="selectedLanguageRight" value="{selectedLanguageRight}"></f:form.hidden> - <f:form.hidden name="selectedTemplate" value="{selectedTemplateKey}"></f:form.hidden> - <f:form.hidden name="selectedExtensionKey" value="{selectedTemplate.extension}"></f:form.hidden> - <f:form.hidden name="selectedExtension" value="{selectedTemplate.extension}"></f:form.hidden> - <f:form.hidden name="selectedTemplateKey" value="{selectedTemplateKey}"></f:form.hidden> - </div> - - <div class="col-md-6"> - <div class="form-group"> - <label class="">{f:translate(key:'backend.select_language')}</label> - <f:be.menus.actionMenu> - <f:for each="{languages}" as="language"> - <sgm:extendedIf condition="{language} == {selectedLanguageRight}"> - <f:then> - <sgm:be.menus.actionMenuItem label="{language}" - controller="Mail" - action="index" - arguments="{selectedLanguageLeft: selectedLanguageLeft, selectedLanguageRight: language, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" - additionalAttributes="{selected: 'selected'}" /> - </f:then> - <f:else> - <sgm:be.menus.actionMenuItem label="{language}" - controller="Mail" - action="index" - arguments="{selectedLanguageLeft: selectedLanguageLeft, selectedLanguageRight: language, selectedTemplate: selectedTemplateKey, selectedExtensionKey: selectedTemplate.extension, selectedExtension: selectedTemplate.extension, selectedTemplateKey: selectedTemplateKey}" /> - </f:else> - </sgm:extendedIf> - </f:for> - </f:be.menus.actionMenu> - </div> - <div class="form-group"> - <f:link.action class="reset-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, language: selectedLanguageRight, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset')}</f:link.action> - </div> - <div class="form-group"> - <label for="fromNameRight" class="">{f:translate(key:'backend.fromName')}</label> - <f:form.textfield type="text" class="form-control" value="{fromNameRight}" name="fromNameRight"></f:form.textfield> - </div> - <div class="form-group"> - <label for="fromMailRight" class="">{f:translate(key:'backend.fromMail')}</label> - <f:form.textfield type="email" class="form-control" value="{fromMailRight}" name="fromMailRight"></f:form.textfield> - </div> - <div class="form-group"> - <label for="ccRight" class="">{f:translate(key:'backend.cc')}</label> - <f:form.textfield type="text" class="form-control" value="{ccRight}" name="ccRight"></f:form.textfield> - </div> - <div class="form-group"> - <label for="bccRight" class="">{f:translate(key:'backend.bcc')}</label> - <f:form.textfield type="text" class="form-control" value="{bccRight}" name="bccRight"></f:form.textfield> - </div> - <div class="form-group"> - <label for="replyToRight" class="">{f:translate(key:'backend.replyTo')}</label> - <f:form.textfield type="text" class="form-control" value="{replyToRight}" name="replyToRight"></f:form.textfield> - </div> - <div class="form-group"> - <label for="subjectRight" class="">{f:translate(key:'backend.subject')}</label> - <f:form.textfield type="text" class=" form-control" value="{subjectRight}" name="subjectRight"></f:form.textfield> - </div> - <label for="contentRight" class="">{f:translate(key:'backend.content')}</label> - <f:form.textarea class="form-control" rows="25" name="contentRight" value="{contentRight}"></f:form.textarea> - </div> - <div class="col-md-2"> - <div class="form-group"> - <f:form.submit class="btn-save-backend btn-success btn form-control" value="{f:translate(key:'backend.save')}" /> - </div> - </div> - </f:form> - </f:then> - <f:else> - <f:render partial="Mail/Empty" /> - </f:else> - - </f:if> + </f:be.menus.actionMenu> + </div> + <div class="form-group"> + <f:link.action class="reset-btn btn-danger btn form-group" action="reset" arguments="{template: selectedTemplateKey, language: selectedLanguageRight, extensionKey: selectedTemplate.extension}">{f:translate(key:'backend.button_reset')}</f:link.action> + </div> + <div class="form-group"> + <label for="fromNameRight" class="">{f:translate(key:'backend.fromName')}</label> + <f:form.textfield type="text" class="form-control" value="{fromNameRight}" name="fromNameRight" /> + </div> + <div class="form-group"> + <label for="fromMailRight" class="">{f:translate(key:'backend.fromMail')}</label> + <f:form.textfield type="email" class="form-control" value="{fromMailRight}" name="fromMailRight" /> + </div> + <div class="form-group"> + <label for="ccRight" class="">{f:translate(key:'backend.cc')}</label> + <f:form.textfield type="text" class="form-control" value="{ccRight}" name="ccRight" /> + </div> + <div class="form-group"> + <label for="bccRight" class="">{f:translate(key:'backend.bcc')}</label> + <f:form.textfield type="text" class="form-control" value="{bccRight}" name="bccRight" /> + </div> + <div class="form-group"> + <label for="replyToRight" class="">{f:translate(key:'backend.replyTo')}</label> + <f:form.textfield type="text" class="form-control" value="{replyToRight}" name="replyToRight" /> + </div> + <div class="form-group"> + <label for="subjectRight" class="">{f:translate(key:'backend.subject')}</label> + <f:form.textfield type="text" class=" form-control" value="{subjectRight}" name="subjectRight" /> + </div> + <label for="contentRight" class="">{f:translate(key:'backend.content')}</label> + <f:form.textarea class="form-control" rows="25" name="contentRight" value="{contentRight}" /> + </div> + <div class="col-md-2"> + <div class="form-group"> + <f:form.submit class="btn-save-backend btn-success btn form-control" value="{f:translate(key:'backend.save')}" /> + </div> + </div> + </f:form> + </f:then> + <f:else> + <f:render partial="Mail/Empty" /> </f:else> </f:if> </f:section> diff --git a/Resources/Private/Templates/Queue/Index.html b/Resources/Private/Templates/Queue/Index.html index 4a0673c2371c1180d266089c55989796c5f9fc17..25c16288bc54f4f074621faca9dd5de17887c419 100644 --- a/Resources/Private/Templates/Queue/Index.html +++ b/Resources/Private/Templates/Queue/Index.html @@ -35,7 +35,7 @@ <td> <f:if condition="{mail.sent} == '0'"> <f:then> - <f:link.action class="btn btn-default btn-send-now" controller="Queue" action="sendMail" arguments="{uid: mail.uid, selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}"> + <f:link.action class="btn btn-default btn-send-now" controller="Queue" action="sendMail" arguments="{uid: mail.uid}"> <span class="t3js-icon icon icon-size-small icon-state-default actions-document-import-t3d"> <span class="icon-markup"> <img src="/typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-document-import-t3d.svg" width="16" height="16"> @@ -45,7 +45,7 @@ </f:link.action> </f:then> <f:else> - <f:link.action class="btn btn-default btn-resend" controller="Queue" action="sendMail" arguments="{uid: mail.uid, selectedTemplate: selectedTemplateKey, selectedExtension: selectedExtensionKey}"> + <f:link.action class="btn btn-default btn-resend" controller="Queue" action="sendMail" arguments="{uid: mail.uid}"> <span class="t3js-icon icon icon-size-small icon-state-default icon-actions-insert-reference"> <span class="icon-markup"> <img src="/typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-insert-reference.svg" width="16" height="16"> diff --git a/ext_localconf.php b/ext_localconf.php index 96443a64af78df48f5028c02a620ce152f762f79..0c0d4ff455c941f0854926a1bfdf883ff7a69deb 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -35,6 +35,10 @@ $extPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('sg_mail' $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \SGalinski\SgMail\Command\SendMailCommandController::class; +// add upgrade wizard for moving all db entries to their respected siteroot +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['tx_sgmail_migrate_data'] = \SGalinski\SgMail\Updates\MigrateData::class; + + if (TYPO3_MODE === 'BE') { $tsPath = $extPath . 'Configuration/TypoScript/'; \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScriptSetup(file_get_contents($tsPath . 'setup.ts')); diff --git a/ext_tables.sql b/ext_tables.sql index 1a81b1b79b951579db32cfb89ed4123cb7065a1a..a22cf39508fa23c7db2ee742e6460a2a9e52f572 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -15,6 +15,7 @@ CREATE TABLE tx_sgmail_domain_model_mail ( template_name varchar(30) DEFAULT '' NOT NULL, reply_to varchar(30) DEFAULT '' NOT NULL, sending_time int(11) unsigned DEFAULT '0' NOT NULL, + site_root_id int(11) unsigned DEFAULT '0' NOT NULL, tstamp int(11) unsigned DEFAULT '0' NOT NULL, crdate int(11) unsigned DEFAULT '0' NOT NULL, @@ -32,6 +33,7 @@ CREATE TABLE tx_sgmail_domain_model_template ( uid int(11) NOT NULL auto_increment, pid int(11) DEFAULT '0' NOT NULL, + site_root_id int(11) unsigned DEFAULT '0' NOT NULL, subject text NOT NULL, extension_key varchar(255) DEFAULT '' NOT NULL, template_name varchar(255) DEFAULT '' NOT NULL,