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;
* @var 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);
$pageRenderer->addJsInlineCode(
'typo3_version', 'TYPO3.version='
. VersionNumberUtility::convertVersionNumberToInteger(VersionNumberUtility::getCurrentTypo3Version())
if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) {
$pageRenderer->loadExtJS();
}
$view->assign('controller', 'Queue');
/**
* @param string $selectedTemplate
* @param string $selectedExtension
* @param array $filters

Torsten Oppermann
committed
* @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);

Torsten Oppermann
committed
$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());

Torsten Oppermann
committed
$this->view->assign('mode', 'queue');

Torsten Oppermann
committed
if (!$filters['filterSent']) {
$filters['filterSent'] = 0;
}
$this->view->assign('filters', $filters);
$this->view->assign('queue', $queue);
$this->view->assign(
'filterFields', [

Torsten Oppermann
committed
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());

Torsten Oppermann
committed
}
$this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class);
if ($pageInfo === FALSE) {
$pageInfo = ['uid' => $pageUid];
}
$this->docHeaderComponent->setMetaInformation($pageInfo);
BackendService::makeButtons($this->docHeaderComponent, $this->request);

Torsten Oppermann
committed
$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
* @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
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
* @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();
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding: Binary');
header('Content-Disposition: attachment; filename="export.csv"');
BackendService::writeCsvFromQueue($filters);
/**
* @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];
}
}