Extbase - Flash Message
Flash Messages sind Systemnachrichten die man sowohl im Backend als auch im Frontend ausgeben kann.
Siehe auch:
TYPO3 Documentation: http://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/FlashMessages/Index.html
Klassen ändern, FlashMessages im Backend: http://blog.sbtheke.de/web-development/typo3/typo3-extension-programmierung/extbase-flashmessages
Einführung[Bearbeiten]
Eine Message wird durch erzeugen einer Instanz von FlashMessage erzeugt außerhalb von Extbase geht das auch.
$message = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
'My message text',
'Message Header', // the header is optional
\TYPO3\CMS\Core\Messaging\FlashMessage::WARNING, // the severity is optional as well and defaults to \TYPO3\CMS\Core\Messaging\FlashMessage::OK
TRUE // optional, whether the message should be stored in the session or only in the \TYPO3\CMS\Core\Messaging\FlashMessageQueue object (default is FALSE)
);
// add to message queue
\TYPO3\CMS\Core\Messaging\FlashMessageQueue::addMessage($message);
Den letzten Parameter braucht man, wenn z.B. per redirect weitergeleitet wird und die Nachrichten erhalten bleiben sollen. Im Template wird dann automatisch gerendert in dem
\TYPO3\CMS\Core\Messaging\FlashMessageQueue::renderFlashMessages()
aufgerufen wird. In Modulen werden die Messages oben ausgegeben oder man kann über den Marker ###FLASHMESSAGES### rendern. In Extbase nimmt man einfach den passenden viewHelper im Fluid Template.
<f:flashMessages />
Man kann aber auch direkt eine Message rendern:
$message->render();
FlashMessage in Extbase[Bearbeiten]
In Extbase werden die FlashMessages i.d.R. im Controller erzeugt:
$this->addFlashMessage('This is a simple success message');
Mit allen Parametern
$this->addFlashMessage(
$messageBody,
$messageTitle = '',
$severity = \TYPO3\CMS\Core\Messaging\AbstractMessage::OK,
$storeInSession = TRUE
);
Die Message wird dann über das Fluid Template gerendert:
<f:flashMessages renderMode="div" />
Auch JavaScript Popups sind möglich (siehe Typo3 API)
Beispiele[Bearbeiten]
Einfache Beispiele[Bearbeiten]
$this->addFlashMessage(
'The message text.',
'The title',
\TYPO3\CMS\Core\Messaging\AbstractMessage::OK
);
oder
//after class definition
use TYPO3\CMS\Core\Messaging\AbstractMessage;
...
$this->addFlashMessage(
'The message text.',
'The title',
AbstractMessage::OK
);
oder ganz Ausführlich
$this->controllerContext->getFlashMessageQueue()->enqueue(
$this->objectManager->get(
'TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
'The message text.',
'The title',
\TYPO3\CMS\Core\Messaging\AbstractMessage::OK
)
);
FlashMessages im Controller auslesen[Bearbeiten]
$this->controllerContext->getFlashMessageQueue()->getAllMessages()
//oder
$this->controllerContext->getFlashMessageQueue()->getAllMessagesAndFlush()
Ausgeben von Meldungen im Fluid Template:
<f:flashMessages renderMode="div" />
Anpassen der CSS Klassen[Bearbeiten]
Kann sinnvoll, wenn man beispielsweise Bootstrap als Framework nutzt.
In 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(
'TYPO3\\MyExt\\Messaging\\FlashMessage',
'The message text.',
'The title',
\TYPO3\MyExt\Messaging\FlashMessage::OK
)
);
Komplett für TYPO3 vermutlich nur per XCLASS von \TYPO3\CMS\Core\Messaging\FlashMessage, damit wirklich alle Meldungen die eigenen CSS Klassen enthalten.
FlashMessages im Backend[Bearbeiten]
TYPO3 ab Version 6.1. Nutzbar z.B. in einem Hook, der beim Speichern eines Datensatzes greift.
/** @var $flashMessage FlashMessage */
$flashMessage = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
htmlspecialchars($message),
htmlspecialchars($title),
\TYPO3\CMS\Core\Messaging\FlashMessage::ERROR,
true // store in session
);
/** @var $flashMessageService \TYPO3\CMS\Core\Messaging\FlashMessageService */
$flashMessageService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessageService');
$defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier();
$defaultFlashMessageQueue->enqueue($flashMessage);
Kurzübersicht aus t3-developer.com[Bearbeiten]
Hinweis: Namespace schreibweise verwenden
//so \TYPO3\CMS\Core\Messaging\AbstractMessage:: ... // NICHT wie unten t3lib_Flashmessage::
Flash Message Container in Extbase und Fluid[Bearbeiten]
http://t3-developer.com/extbase-fluid/cheats-extbase/controller/flash-messages/ (2015-06) Insgesamt stehen 5 verschiedene Message Klassen zur Verfügung die mit folgendem Code angesprochen werden:
t3lib_Flashmessage::NOTICE t3lib_Flashmessage::INFO t3lib_Flashmessage::OK t3lib_Flashmessage::WARNING t3lib_Flashmessage::ERROR
Nutzt man FlashMessages im Backend, rendert Typo3 direkt die bekannten Kästen (siehe Abbildung). Im Frontend kann man die Klassen im eigenem Stylesheet ansprechen.
Optional kann inzwischen auch ein Titel für jede Nachricht vergeben werden. Im Controller sieht das ganze dann so aus:
//löscht die Standard Nachrichten aus der Messagequeue
$this->flashMessages->flush();
// eigene Message setzten, "NOTICE" setzt hier den grauen Ausgabekasten im BE
$this->flashMessageContainer->add('Message Text','Titel optional', t3lib_Flashmessage::NOTICE);
$this->view->assign ...
Im View werden die FlashMessages dann durch
<f:flashMessages />
aufgerufen. Dieser erzeugt standardmäßig eine unsortierte Liste mit <ul><li>
Mit dem Aufruf
<f:flashMessages renderMode="div" />
werden die Messages (sofern mehrere in der Queue sind) mit divs gerendert.
Und im Frontend?
Wenn man die Message um die "t3lib_Flashmessage::NOTICE" ergänzt, erhalten die div's der Message eine entsprechende Klasse, zum Beispiel:
<div class="typo3-messages">
<div class="typo3-message message-notice">
<div class="message-header">Titel optional Text</div>
<div class="message-body">Message Text</div>
</div>
</div>
Anhand der div Class kann so ein individuelles Styling in Abhängigkeit der gewälten t3lib_Flashmessage erstellt werden.