Как мне показывать flash-сообщения из другого расширения / плагина?

#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
  

приветствую!