Sammlung zu FlashMessages in Extbase.
FlashMessages erstellen
Anlegen einer FlashMessage im Controller:
$this->addFlashMessage( 'The message text.', 'The title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK ); |
oder
$this->controllerContext->getFlashMessageQueue()->enqueue( $this->objectManager->get( \TYPO3\CMS\Core\Messaging\FlashMessage::class, 'The message text.', 'The title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK ) ); |
Die zweite Funktion macht das gleiche wie die erste, die erste Funktion ist lediglich eine vereinfachte Variante der zweiten Funktion.
FlashMessages anzeigen
Im Controller
$this->controllerContext->getFlashMessageQueue()->getAllMessages() |
oder
$this->controllerContext->getFlashMessageQueue()->getAllMessagesAndFlush() |
In Fluid
<f:flashMessages /> |
Nur ausgeben, wenn tatsächlich Flash Messages vorhanden sind:
<f:flashMessages as="flashMessages"> <f:if condition="{flashMessages}"> <dl class="messages"> <f:for each="{flashMessages}" as="flashMessage"> <dt>{flashMessage.code}</dt> <dd>{flashMessage.message}</dd> </f:for> </dl> </f:if> </f:flashMessages> |
Anpassen der CSS Klassen
Kann sinnvoll, wenn man beispielsweise Bootstrap als Framework nutzt.
Geht vermutlich nur per XCLASS von \TYPO3\CMS\Core\Messaging\FlashMessage, damit wirklich ALLE Meldungen die eigenen CSS Klassen enthalten. Für die Änderung der CSS Klassen von Meldungen, die von einer eigenen Erweiterung erzeugt werden, gibt es folgende Möglichkeit:
EXT:my_ext/Classes/Messaging/FlashMessage.php
namespace TYPO3\MyExt\Messaging; class FlashMessage extends \TYPO3\CMS\Core\Messaging\FlashMessage { protected $classes = array( self::NOTICE => 'notice alert alert-info', self::INFO => 'info alert alert-info', self::OK => 'ok alert alert-success', self::WARNING => 'warning alert alert-warning', self::ERROR => 'error alert alert-danger' ); } |
Entsprechend ändert sich dann natürlich der Aufruf:
View
$this->controllerContext->getFlashMessageQueue()->enqueue( $this->objectManager->get( \Vendor\MyExt\Messaging\FlashMessage::class, 'The message text.', 'The title', \TYPO3\MyExt\Messaging\FlashMessage::OK ) ); |
FlashMessages in initializeAction()
Ist nicht möglich, da $this->contextController noch nicht bereitsteht.
Alternative: Funktion emitBeforeCallActionMethodSignal() nutzen, diese Funktion wird ebenfalls vor der Action aufgerufen:
/** * Called before all actions * * @param array $preparedArguments */ protected function emitBeforeCallActionMethodSignal(array $preparedArguments) { parent::emitBeforeCallActionMethodSignal($preparedArguments); $action = $this->request->getControllerActionName(); if(in_array($action, array('list', 'new'))) { $this->addFlashMessage('Text', 'Title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK); } } |
FlashMessages im Backend (TYPO3 ab Version 6.1)
Nutzbar z.B. in einem Hook, der beim Speichern eines Datensatzes greift.
use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageService; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @var FlashMessage $flashMessage */ $flashMessage = GeneralUtility::makeInstance( FlashMessage::class, 'message', 'title', FlashMessage::INFO, true // store in session ); $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class); $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier(); $defaultFlashMessageQueue->enqueue($flashMessage); |
Der letzte Abschnitt funktioniert ab TYPO3 7.0 nicht mehr, siehe:
https://wiki.typo3.org/TYPO3_CMS_7.0#Breaking:_.2357382_-_Remove_old_flash_message_API
Ich hatte die FlashMessages auf diese Weise „missbraucht“ um im Frontend aus der initializeAction in bestimmten Fällen eine Message auszugeben. Habe keine „neue“ Möglichkeit dafür gefunden leider.
Ah und für den zweitletzten Abschnitt: TYPO3 nutzt nun standardmässig die Bootstrap Klassen für die FlashMessages. Man kann die render-Funktion von \TYPO3\CMS\Core\Messaging\FlashMessage überschreiben wenn man das HTML anpassen will.
Ich habe nun den Artikel ergänzt, wie man FlashMessages in initializeAction verwenden kann.
Danke für die Infos. Weist du auch was man für FlashMessages in den initialize[Meineaction]Actions verwenden kann?