La Interfaz ManagerInterface en Magento2 nos permite mostrar mensajes en pantalla para notificar errores, advertencias, excepciones, etc …
Estos pueden ser mostrados tanto en el Frontend como el Backend de Magento.
Este tipo de mensajes puede sernos útil cuando deseamos mostrar alertas al usuario sobre acciones que acaba de realizar o acciones futuras que necesita saber.
Para este tipo de tareas Magento pone a nuestra disposición la Interfaz llamada ManagerInterface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php use Magento Framework\Message\ManagerInterface; Class MyClass { protected messageManager; public function __construct( ManagerInterface $messageManager ) { $this->_messageManager = $messageManager; } } |
Estos son algunos de los métodos más comunes utilizados para mostrar este tipo mensajes. Fueron incluidos desde Magento2.2.6>
1 2 3 4 |
$this->_messageManager->addErrorMessage(__("Error")); $this->_messageManager->addWarningMessage(__("Advertencia")); $this->_messageManager->addNoticeMessage(__("Notificación")); $this->_messageManager->addSuccessMessage(__("Éxito")); |
Aunque métodos como addError() y similares pueden seguir usándose, es mejor que empecemos a acostumbrarnos a utilizar estos nuevos.
Mensajes de Notificación Complejos
Cuando necesitamos que este tipo de mensajes ofrezca mayor información, como puede ser incluir una serie de parámetros, tendremos que usar otro tipo de métodos.
Por ejemplo, si deseamos incluir una URL en un mensaje de notificación este no funcionaría correctamente.
1 |
$this->messageManager->addNoticeMessage(__('Check configuration Module first doing <a href="https://example.com">click here</a>')); |
Por lo que para conseguir que funcione este tipo de mensajes necesitamos utilizar otra serie de métodos implementados en la Interfaz.
1 2 3 4 |
addComplexSuccessMessage($identifier, array $data = [], $group = null); addComplexErrorMessage($identifier, array $data = [], $group = null); addComplexWarningMessage($identifier, array $data = [], $group = null); addComplexNoticeMessage($identifier, array $data = [], $group = null); |
Lo primero que debemos hacer es declarar en nuestro fichero de dependencias di.xml una serie de instrucciones.
Es muy importante que las declaremos en el fichero de dependencias correspondiente o el mensaje no se mostrará correctamente.
1 2 |
/etc/adminhtml/di.xml /etc/frontend/di.xml |
1 2 3 4 5 6 7 8 9 10 11 12 |
<type name="Magento\Framework\View\Element\Message\MessageConfigurationsPool"> <arguments> <argument name="configurationsMap" xsi:type="array"> <item name="configurationNotice" xsi:type="array"> <item name="renderer" xsi:type="const">\Magento\Framework\View\Element\Message\Renderer\BlockRenderer::CODE</item> <item name="data" xsi:type="array"> <item name="template" xsi:type="string">Vendor_News::messages/configurationNotice.phtml</item> </item> </item> </argument> </arguments> </type> |
Ahora vamos a utilizar el método addComplexNoticeMessage() para mostrar un mensaje al usuario en el controlador o bloque de nuestro módulo.
En mi caso voy a mostrar un mensaje de notificación para indicar al usuario que debe configurar el módulo antes de usarlo.
1 2 3 4 5 6 7 |
$this->_messageManager->addComplexNoticeMessage( 'configurationNotice', [ 'message' => 'Check configuration Module first doing ', 'url' => $this->_helper->getUrl('route/controller/action') ] ); |
Por último necesitamos crear el Template que declaramos en nuestro fichero di.xml para este tipo de mensaje.
Lo crearemos en view/adminhtml/templates/messages/ y lo llamaremos configurationNotice.phtml
1 2 3 4 |
<?php echo $block->escapeHtml($block->getData('message')); ?> <a href="<?php echo $block->escapeUrl($block->getData('url'))?>"> <?php echo $block->escapeHtml(__('click here')) ?> </a> |
El resultado sería algo parecido a esto:
Excepciones
La Interfaz pone también a nuestra disposición el uso de este tipo de mensajes utilizando el método addExceptionMessage()
1 2 3 4 5 6 7 |
try { // tu código } catch (LocalizedException $e) { $this->_messageManager->addErrorMessage($e->getMessage()); } catch (\Exception $e) { $this->_messageManager->addExceptionMessage($e, __('Algo fue mal')); } |