Extbase - Flash Message: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 24: Zeile 24:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Aufruf best practice:
+
In der Praxis schreibt man das ganze einfacher (siehe einfache Beispiele)
<syntaxhighlight lang="php">
 
// über Klasse einbinden
 
use \TYPO3\CMS\Core\Messaging\AbstractMessage
 
// und dann
 
AbstractMessage::funktion()
 
// oder
 
\TYPO3\CMS\Core\Messaging\AbstractMessage::funktion();
 
</syntaxhighlight>
 
  
 
== Beispiele ==
 
== Beispiele ==

Version vom 27. Juni 2015, 08:25 Uhr

Flash Messages sind Systemnachrichten die man sowohl im Backend als auch im Frontend ausgeben kann.

Siehe auch: Klassen ändern, FlashMessages im Backend, http://blog.sbtheke.de/web-development/typo3/typo3-extension-programmierung/extbase-flashmessages

Übersicht

Werden meist im Controller eingesetzt. Eine Message wird durch erzeugen einer Instanz von FlashMessage erzeugt:

$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. Man muß einfach den viewHelper im Fluid Template einsetzen

 <f:flashMessages />

In der Praxis schreibt man das ganze einfacher (siehe einfache Beispiele)

Beispiele

Einfache Beispiele

$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

$this->controllerContext->getFlashMessageQueue()->getAllMessages()
//oder
$this->controllerContext->getFlashMessageQueue()->getAllMessagesAndFlush()

Ausgeben von Meldungen im Fluid Template:

<f:flashMessages renderMode="div" />

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

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

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

Hinweis: Namespace schreibweise verwenden

//so
 \TYPO3\CMS\Core\Messaging\AbstractMessage:: ... 
// NICHT wie unten
 t3lib_Flashmessage::


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:

 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.