Skip to content
Snippets Groups Projects
QueueController.php 9.13 KiB
Newer Older
namespace SGalinski\SgMail\Controller;

/***************************************************************
 *  Copyright notice
 *
 *  (c) sgalinski Internet Services (https://www.sgalinski.de)
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
use SGalinski\SgMail\Domain\Repository\MailRepository;
use SGalinski\SgMail\Service\BackendService;
use SGalinski\SgMail\Service\MailTemplateService;
use SGalinski\SgMail\Session\PhpSession;
use TYPO3\CMS\Backend\Template\Components\DocHeaderComponent;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Messaging\FlashMessage;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;

/**
 * Controller for the mail templating service module
 */
class QueueController extends ActionController {
	/**
	 * DocHeaderComponent
	 *
	 * @var DocHeaderComponent
	 */
	protected $docHeaderComponent;

	 */
	protected $mailRepository;

	/**
	 * Inject the MailRepository
	 *
	 * @param MailRepository $mailRepository
	 */
	public function injectMailRepository(MailRepository $mailRepository) {
		$this->mailRepository = $mailRepository;
	}

	/**
	 * @var \SGalinski\SgMail\Session\PhpSession
	 */
	protected $session;

	/**
	 * @param ViewInterface $view
	 */
	public function initializeView(ViewInterface $view) {
		parent::initializeView($view);
		$pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
Torsten Oppermann's avatar
Torsten Oppermann committed
		$pageRenderer->addJsInlineCode(
			'typo3_version', 'TYPO3.version='
			. VersionNumberUtility::convertVersionNumberToInteger(VersionNumberUtility::getCurrentTypo3Version())
Torsten Oppermann's avatar
Torsten Oppermann committed
			. ';'
		);
		if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) {
			$pageRenderer->loadExtJS();
		}
		$view->assign('controller', 'Queue');
	/**
	 * @param string $selectedTemplate
	 * @param string $selectedExtension
	 * @throws \InvalidArgumentException
	 * @throws \UnexpectedValueException
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
	 * @throws \BadFunctionCallException
	 * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException
	 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
	public function indexAction($selectedTemplate = NULL, $selectedExtension = NULL, array $filters = []) {
		$pageUid = (int) GeneralUtility::_GP('id');
		$this->initSessionAndTemplateFilter($filters);
		$this->view->assign('selectedTemplateFilter', $filters['filterTemplate']);
		$this->view->assign('selectedExtensionFilter', $filters['filterExtension']);

		$registerArray = BackendService::getNonBlacklistedTemplates($pageUid);
		if ($selectedTemplate === NULL || $selectedTemplate === '') {
			$selectedExtension = \key($registerArray);
			$selectedTemplate = \key($registerArray[$selectedExtension]);
		// create doc header component
		$pageInfo = BackendUtility::readPageAccess($pageUid, $GLOBALS['BE_USER']->getPagePermsClause(1));
		if ($pageInfo && (int) $pageInfo['is_siteroot'] === 1) {
			$queue = $this->mailRepository->findAllEntries($pageUid, 0, $filters);
			$this->view->assign('selectedTemplateKey', $selectedTemplate);
			$this->view->assign('selectedExtensionKey', $selectedExtension);
			$this->view->assign('templates', $registerArray);
			$this->view->assign('templatesFilter', BackendService::getTemplatesForFilter($pageUid));
			$this->view->assign('languages', BackendService::getLanguagesForFilter());
			if (!$filters['filterSent']) {
				$filters['filterSent'] = 0;
			}
			$this->view->assign('filters', $filters);
			$this->view->assign('queue', $queue);
			$this->view->assign(
				'filterFields', [
					BackendService::SENDER_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.from', 'SgMail'
					),
					BackendService::RECIPIENT_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.to', 'SgMail'
					),
					BackendService::SUBJECT_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.subject', 'SgMail'
					),
					BackendService::MAILTEXT_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.mailtext', 'SgMail'
					),
					BackendService::CC_FILTER_OPTION => LocalizationUtility::translate('backend.filter.cc', 'SgMail'),
					BackendService::BCC_FILTER_OPTION => LocalizationUtility::translate('backend.filter.bcc', 'SgMail'),
					BackendService::FROM_NAME_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.from_name', 'SgMail'
					),
					BackendService::REPLY_TO_NAME_FILTER_OPTION => LocalizationUtility::translate(
						'backend.filter.reply_to', 'SgMail'
					),
		} else {
			$this->view->assign('pages', BackendService::getPages());
		$this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class);
		if ($pageInfo === FALSE) {
			$pageInfo = ['uid' => $pageUid];
		}
		$this->docHeaderComponent->setMetaInformation($pageInfo);
		BackendService::makeButtons($this->docHeaderComponent, $this->request);
		$this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent());
		$this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version));

	/**
	 * send or resend a mail in the queue
	 *
	 * @param int $uid
Torsten Oppermann's avatar
Torsten Oppermann committed
	 * @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
	 * @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException
	public function sendMailAction($uid) {
		$mailService = new MailTemplateService();
		if ($mailService->sendMailFromQueue($uid)) {
			$message = LocalizationUtility::translate('backend.success_mail_queue', 'sg_mail');
			$this->addFlashMessage($message, '', FlashMessage::OK);
		} else {
			$message = LocalizationUtility::translate(
				'backend.error_mail_queue',
				'sg_mail',
				[\implode(', ', $mailService->getMailMessage()->getFailedRecipients())]
			);
			$this->addFlashMessage($message, '', FlashMessage::ERROR);
		}
		$this->redirect('index', NULL, NULL, $this->request->getArguments());

	/**
	 * Download the queue data as a csv file, respecting the filter settings
	 *
	 * @param array $filters
Torsten Oppermann's avatar
Torsten Oppermann committed
	 * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
	 * @throws \InvalidArgumentException
	 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
	public function exportAction(array $filters = []) {
		$this->initSessionAndTemplateFilter($filters);
		// stop output buffering because it's pointless here
		ob_end_clean();
Torsten Oppermann's avatar
Torsten Oppermann committed
		header('Content-Type: application/force-download');
		header('Content-Transfer-Encoding: Binary');
		header('Content-Disposition: attachment; filename="export.csv"');
		BackendService::writeCsvFromQueue($filters);
Torsten Oppermann's avatar
Torsten Oppermann committed
		exit(0);

	/**
	 * @param array $filters
	 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
	 */
	protected function initSessionAndTemplateFilter(array &$filters) {
		if (!($this->session instanceof PhpSession)) {
			$this->session = $this->objectManager->get(PhpSession::class);
			$this->session->setSessionKey('sg_mail_controller_session');
		} else {
			$this->session->setSessionKey('sg_mail_controller_session');
		}

		if ($this->request->hasArgument('controller')) {
			$this->session->setDataByKey('mode', $this->request->getArgument('controller'));
		}

		// save the Template filter to the session
		if (!isset($_SESSION[$this->session->getSessionKey()]['filterTemplate'])
			|| (isset($_POST['filterTemplate']) && $this->session->getDataByKey('filterTemplate') !== $_POST['filterTemplate'])) {
			$this->session->setDataByKey('filterTemplate', $_POST['filterTemplate']);
		}

		$filterTemplate = $this->session->getDataByKey('filterTemplate') ?? $_POST['filterTemplate'];
		$filters['filterExtension'] = $filterTemplate;
		$filters['filterTemplate'] = $filterTemplate;

		if ($_POST['filterTemplate'] !== '') {
			$extensionTemplateFilterArray = explode('###', $filterTemplate);
			$filters['filterExtension'] = $extensionTemplateFilterArray[0];
			$filters['filterTemplate'] = $extensionTemplateFilterArray[1];
		}
	}