Extbase - Flash Message: Unterschied zwischen den Versionen
| (9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
Siehe auch: | Siehe auch: | ||
| − | http://blog.sbtheke.de/ | + | 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 == | ||
| + | Eine Message wird durch erzeugen einer Instanz von FlashMessage erzeugt außerhalb von Extbase geht das auch. | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $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); | ||
| + | </syntaxhighlight> | ||
| + | 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. | ||
| + | <syntaxhighlight lang="html5"> | ||
| + | <f:flashMessages /> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Man kann aber auch direkt eine Message rendern: | ||
| + | $message->render(); | ||
| + | |||
| + | === FlashMessage in Extbase === | ||
| + | In Extbase werden die FlashMessages i.d.R. im Controller erzeugt: | ||
| + | <syntaxhighlight lang="php">$this->addFlashMessage('This is a simple success message');</syntaxhighlight> | ||
| + | Mit allen Parametern | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $this->addFlashMessage( | ||
| + | $messageBody, | ||
| + | $messageTitle = '', | ||
| + | $severity = \TYPO3\CMS\Core\Messaging\AbstractMessage::OK, | ||
| + | $storeInSession = TRUE | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | Die Message wird dann über das Fluid Template gerendert: | ||
| + | <syntaxhighlight lang="html5"><f:flashMessages renderMode="div" /></syntaxhighlight> | ||
| + | |||
| + | Auch JavaScript Popups sind möglich (siehe Typo3 API) | ||
| + | |||
| + | == Beispiele == | ||
| + | === Einfache Beispiele === | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $this->addFlashMessage( | ||
| + | 'The message text.', | ||
| + | 'The title', | ||
| + | \TYPO3\CMS\Core\Messaging\AbstractMessage::OK | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | oder | ||
| + | <syntaxhighlight lang="php"> | ||
| + | //after class definition | ||
| + | use TYPO3\CMS\Core\Messaging\AbstractMessage; | ||
| + | ... | ||
| + | $this->addFlashMessage( | ||
| + | 'The message text.', | ||
| + | 'The title', | ||
| + | AbstractMessage::OK | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | oder ganz Ausführlich | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $this->controllerContext->getFlashMessageQueue()->enqueue( | ||
| + | $this->objectManager->get( | ||
| + | 'TYPO3\\CMS\\Core\\Messaging\\FlashMessage', | ||
| + | 'The message text.', | ||
| + | 'The title', | ||
| + | \TYPO3\CMS\Core\Messaging\AbstractMessage::OK | ||
| + | ) | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | === FlashMessages im Controller auslesen === | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $this->controllerContext->getFlashMessageQueue()->getAllMessages() | ||
| + | //oder | ||
| + | $this->controllerContext->getFlashMessageQueue()->getAllMessagesAndFlush() | ||
| + | </syntaxhighlight> | ||
| + | Ausgeben von Meldungen im Fluid Template: | ||
| + | |||
| + | <syntaxhighlight lang="html5"> | ||
| + | <f:flashMessages renderMode="div" /> | ||
| + | </syntaxhighlight> | ||
| + | ===Anpassen der CSS Klassen=== | ||
| + | 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''' | ||
| + | <syntaxhighlight lang="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' | ||
| + | ); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | Entsprechend ändert sich dann natürlich der Aufruf: | ||
| + | |||
| + | View | ||
| + | <syntaxhighlight lang="php"> | ||
| + | $this->controllerContext->getFlashMessageQueue()->enqueue( | ||
| + | $this->objectManager->get( | ||
| + | 'TYPO3\\MyExt\\Messaging\\FlashMessage', | ||
| + | 'The message text.', | ||
| + | 'The title', | ||
| + | \TYPO3\MyExt\Messaging\FlashMessage::OK | ||
| + | ) | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | 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 === | ||
| + | TYPO3 ab Version 6.1. Nutzbar z.B. in einem Hook, der beim Speichern eines Datensatzes greift. | ||
| + | |||
| + | <syntaxhighlight lang="php"> | ||
| + | /** @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); | ||
| + | </syntaxhighlight> | ||
| + | |||
| Zeile 15: | Zeile 152: | ||
</pre> | </pre> | ||
| − | |||
=== Flash Message Container in Extbase und Fluid === | === Flash Message Container in Extbase und Fluid === | ||
| + | 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: | Insgesamt stehen 5 verschiedene Message Klassen zur Verfügung die mit folgendem Code angesprochen werden: | ||
Aktuelle Version vom 27. Juni 2015, 08:36 Uhr
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.