From 12706eb355d5382727363663fecfc11025575428 Mon Sep 17 00:00:00 2001
From: Torsten Oppermann <torsten@sgalinski.de>
Date: Mon, 17 Jul 2017 10:00:20 +0200
Subject: [PATCH] [TASK] Moving logic from mail controller to service class

---
 Classes/Controller/MailController.php | 100 ++++++++++----------------
 Classes/Service/BackendService.php    |  76 ++++++++++++++++++++
 2 files changed, 114 insertions(+), 62 deletions(-)

diff --git a/Classes/Controller/MailController.php b/Classes/Controller/MailController.php
index 735dfaa0..8c20c858 100644
--- a/Classes/Controller/MailController.php
+++ b/Classes/Controller/MailController.php
@@ -99,69 +99,45 @@ class MailController extends ActionController {
 		$this->view->assign('languages', $languages);
 		$this->view->assign('templates', MailTemplateService::getRegisterArray());
 
-		// get last selected languages
-		if ($selectedLanguageLeft === NULL) {
-			$selectedLanguageLeftFromSession = $this->session->getDataByKey('selectedLanguageLeft');
-			if ($selectedLanguageLeftFromSession !== NULL) {
-				$selectedLanguageLeft = $selectedLanguageLeftFromSession;
-			} else {
-				$selectedLanguageLeft = $languages[0];
-			}
-		}
-
-		if ($selectedLanguageRight === NULL) {
-			$selectedLanguageRightFromSession = $this->session->getDataByKey('selectedLanguageRight');
-			if ($selectedLanguageRightFromSession === NULL) {
-				if (isset($languages[1])) {
-					$selectedLanguageRight = $languages[1];
-				} else {
-					$selectedLanguageRight = $languages[0];
-				}
-			} else {
-				$selectedLanguageRight = $selectedLanguageRightFromSession;
-			}
-		}
+		// 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, $siteRootId
-		);
-		$templateRight = $this->templateRepository->findOneByTemplate(
-			$selectedExtension, $selectedTemplate, $selectedLanguageRight, $siteRootId
+		$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('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 . $selectedLanguageLeft . '.' . 'template.html';
+			$defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['left'] . '.' . 'template.html';
 			if (file_exists($defaultTemplateFile)) {
 				$this->view->assign('contentLeft', 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('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 . $selectedLanguageRight . '.' . 'template.html';
+			$defaultTemplateFile = $defaultTemplatePath . $selectedLanguages['right'] . '.' . 'template.html';
 			if (file_exists($defaultTemplateFile)) {
 				$this->view->assign('contentRight', file_get_contents($defaultTemplateFile));
 			}
@@ -171,47 +147,47 @@ class MailController extends ActionController {
 
 		if (is_array($subject)) {
 			$this->view->assign(
-				'subjectLeft', $templateLeft !== NULL ? $templateLeft->getSubject() :
-				$registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguageLeft]
+				'subjectLeft', $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]
+				'subjectRight', $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() :
+				$registerArray[$selectedExtension][$selectedTemplate]['subject'][$selectedLanguages['right']]
 			);
 		} else {
 			$langFile = GeneralUtility::readLLfile(
-				'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguageLeft
+				'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['left']
 			);
 
 			$translatedSubject = $langFile['default'][$subject][0]['target'];
-			if ($langFile[$selectedLanguageLeft][$subject][0]) {
-				$translatedSubject = $langFile[$selectedLanguageLeft][$subject][0]['target'];
+			if ($langFile[$selectedLanguages['left']][$subject][0]) {
+				$translatedSubject = $langFile[$selectedLanguages['left']][$subject][0]['target'];
 			}
 
 			$this->view->assign(
-				'subjectLeft', $templateLeft !== NULL ? $templateLeft->getSubject() :
+				'subjectLeft', $selectedTemplates['left'] !== NULL ? $selectedTemplates['left']->getSubject() :
 				$translatedSubject
 			);
 
 			$langFile = GeneralUtility::readLLfile(
-				'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguageRight
+				'EXT:' . $selectedExtension . '/Resources/Private/Language/locallang.xlf', $selectedLanguages['right']
 			);
 
 			$translatedSubject = $langFile['default'][$subject][0]['target'];
-			if ($langFile[$selectedLanguageLeft][$subject][0][$subject]) {
-				$translatedSubject = $langFile[$selectedLanguageRight][$subject][0]['target'];
+			if ($langFile[$selectedLanguages['left']][$subject][0][$subject]) {
+				$translatedSubject = $langFile[$selectedLanguages['right']][$subject][0]['target'];
 			}
 
 			$this->view->assign(
-				'subjectRight', $templateRight !== NULL ? $templateRight->getSubject() :
+				'subjectRight', $selectedTemplates['right'] !== NULL ? $selectedTemplates['right']->getSubject() :
 				$translatedSubject
 			);
 		}
 
 		$templateDescription = $registerArray[$selectedExtension][$selectedTemplate]['description'];
 		if (is_array($templateDescription)) {
-			$templateDescription = $templateDescription[$selectedLanguageLeft];
+			$templateDescription = $templateDescription[$selectedLanguages['left']];
 		} else {
 			$templateDescription = LocalizationUtility::translate(
 				$templateDescription, $selectedExtension
@@ -229,11 +205,11 @@ 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');
diff --git a/Classes/Service/BackendService.php b/Classes/Service/BackendService.php
index d21bf08d..b8a7790f 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;
@@ -42,6 +43,7 @@ use TYPO3\CMS\Lang\Domain\Repository\LanguageRepository;
  * Backend Service class
  */
 class BackendService {
+
 	/**
 	 * Get all pages the be user has access to
 	 *
@@ -136,4 +138,78 @@ class BackendService {
 
 		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 LanguageRepository $languageRepository */
+		$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;
+	}
 }
-- 
GitLab