it-swarm-es.com

Mostrar mensajes del sistema dentro del componente en lugar de en la plantilla

Por defecto, los mensajes del sistema Joomla 3 (mensajes, avisos, advertencias) se muestran en una determinada posición de la plantilla utilizando

<jdoc:include type="message" />

¿Sería posible tener más control sobre esos mensajes y mostrarlos en diferentes posiciones dentro del contenedor de mi propio componente?

Intenté usar el jdoc anterior dentro de las vistas de mi componente (toma barata) pero no tuve suerte. ¿Hay alguna forma de "capturar" mensajes generados por mi componente utilizando el sistema de mensajería del sistema estándar de Joomla y mostrarlos donde quiera?

Gracias por adelantado.

8
Isidro Baquero

Ok, parece que cavar un poco más. Encontré una respuesta a mi propia pregunta. Básicamente encontré este complemento:

http://extensions.joomla.org/extensions/style-a-design/popups-a-iframes/2524

No es exactamente lo que necesito, pero revisando su código descubrí el camino a seguir, que podría resumirse de la siguiente manera (en caso de que alguien llegue aquí buscando la misma pregunta):

  1. Si desea hacerlo de la manera correcta, debe ocuparse de los mensajes predeterminados de Joomla que se muestran en la plantilla a través de <jdoc:include type="message" />, Para que los mensajes no se muestren dos veces
  2. La única forma de manejar eso es usando un complemento que se activará en el evento onBeforeRender
  3. En ese caso, debe:
    • Recupere los mensajes usando $app = JFactory::getApplication(); $messageQueue = $app->getMessageQueue();
    • Procese los mensajes según sea necesario para enviarlos a su componente
    • Borre la cola de mensajes para que los mensajes no se muestren dos veces. En versiones anteriores de Joomla, era posible borrar directamente la cola con un método, pero en Joomla 3 debe reemplazar la cola existente por una vacía.
  4. Eso es todo, tiene mensajes en cola en el sistema de mensajería Joomla predeterminado disponible en su componente.

Esto necesita algo de trabajo, pero creo que el camino general a seguir es claro. Espero que sea útil para alguien más en una situación similar.

9
Isidro Baquero

Para completar esta (buena) respuesta de Isidro, observe que a partir de hoy (Joomla 3.8.12), la función getMessageQueue() se puede llamar con "verdadero" (getMessageQueue(true)) como parámetro para purgar/borrar la cola de mensajes.

Finalmente, para obtener los mensajes almacenados de la manera esperada para que el diseño los muestre, llame a este fragmento de código (extraído de MessageRenderer::getData()):

// Initialise variables.
$lists = array();
// Get the message queue
$messages = \JFactory::getApplication()->getMessageQueue();
// Build the sorted message list
if (is_array($messages) && !empty($messages))
{
    foreach ($messages as $msg)
    {
        if (isset($msg['type']) && isset($msg['message']))
        {
            $lists[$msg['type']][] = $msg['message'];
        }
    }
}

Entonces obtienes $lists ordenado de la manera correcta.

0
Fred the coder