#typo3 #flash-message
#typo3 #flash-сообщение
Вопрос:
В Typo3 7.x мне нужно показывать флэш-сообщение после перенаправления на другое расширение. Почему-то сообщения там не отображаются:
// in powermail_extended:
$this->addFlashMessage('Some message', '', TYPO3CMSCoreMessagingAbstractMessage::NOTICE);
$uri = $this->uriBuilder->uriFor('form', [], 'Form', 'powermail', 'pi1');
$this->redirectToURI($uri);
Отображаются ли flash-сообщения только в том случае, если после перенаправления будет показан тот же плагин для внешнего интерфейса? Если да, то как я могу также показывать «чужие» flash-сообщения?
Комментарии:
1. Я думаю, что нашел решение, опубликую его позже…
2. Вероятно, вам придется отправлять их с параметрами get или каким-то образом обнаруживать их из тех же переменных после перенаправления.
3. Мне не нравится отправлять сообщение через параметры GET по причинам XSS…
Ответ №1:
Да, flash-сообщения находятся в разных очередях в зависимости от плагина внешнего интерфейса. В контроллере после перенаправления добавьте следующие строки:
protected function emitBeforeCallActionMethodSignal(array $preparedArguments) {
parent::emitBeforeCallActionMethodSignal($preparedArguments);
$this->addMessagesToDefaultQueue('extbase.flashmessages.tx_powermailextended_pi1' /* depending on your frontend plugin name */);
}
protected function addMessagesToDefaultQueue($queueId) {
$queue = $this->controllerContext->getFlashMessageQueue($queueId);
$msg = $queue->getAllMessagesAndFlush();
if ($msg) {
$defaultQueue = $this->controllerContext->getFlashMessageQueue();
foreach ($msg as $m) {
$defaultQueue->enqueue($m);
}
}
}
Это удалит сообщения из плагина перед перенаправлением и добавит их в «правильную» очередь.
Ответ №2:
Причиной, по которой сообщение не отображается другому плагину, является queueIdentifier
Когда вы перенаправляете на другой плагин, то <f:flashMessages />
пытается найти вашу текущую очередь flashMessage, которая была бы абсолютно пустой.
Я нашел простой способ показать flashMessage другому плагину.
TYPO3 версии 10.4x
например. powermail_extended
контроллер / действие плагина
public function createAction(){
$this->addFlashMessage('Some message', '', TYPO3CMSCoreMessagingAbstractMessage::NOTICE);
$uriBuilder = $this->objectManager->get(TYPO3CMSExtbaseMvcWebRoutingUriBuilder::class);
$uri = $uriBuilder
->reset()
->setTargetPageUid($GLOBALS['TSEF']->page['uid'])
->uriFor('form', [], 'Form', 'powermail', 'pi1');
$this->redirectToURI($uri);
}
Другой плагин, powermail
где вам нужно показывать flashMessage.
Все, что вам нужно, это изменить код в вашем представлении, например. плагин powermail
ExtendedView/Resources/Private/Templates/Form/Form.html
<f:flashMessages /> // this will show your default current plugin flashMessage
<f:flashMessages queueIdentifier="extbase.flashmessages.tx_powermailextended_pi1" /> // This will show your flashMessage from another plugin eg. powermail_extended
приветствую!