web-dev-qa-db-pt.com

Exibir mensagens do sistema dentro do componente em vez de no modelo

Por padrão, as mensagens do sistema Joomla 3 (mensagens, avisos, avisos) são exibidas em uma determinada posição do modelo usando

<jdoc:include type="message" />

Seria possível obter mais controle sobre essas mensagens e exibi-las em diferentes posições dentro do contêiner do meu próprio componente?

Eu tentei usar o jdoc acima nas visualizações do meu componente (foto barata), mas sem sorte. Existe alguma maneira de "capturar" as mensagens geradas pelo meu componente usando o sistema de mensagens padrão do Joomla e exibi-las onde eu quiser?

Desde já, obrigado.

8
Isidro Baquero

Ok, parece que cavando um pouco mais, encontrei uma resposta para minha própria pergunta. Basicamente, encontrei este plugin:

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

Não é exatamente o que eu preciso, mas, ao verificar seu código, descobri o caminho a seguir, que pode ser resumido da seguinte forma (caso alguém chegue aqui procurando a mesma pergunta):

  1. Se você quiser fazer isso da maneira certa, precisará cuidar das mensagens padrão do Joomla exibidas no modelo via <jdoc:include type="message" />, Para que as mensagens não sejam exibidas duas vezes
  2. A única maneira de lidar com isso é usar um plug-in que será acionado no evento onBeforeRender
  3. Nesse caso, você precisa:
    • Recupere as mensagens usando $app = JFactory::getApplication(); $messageQueue = $app->getMessageQueue();
    • Processe as mensagens conforme necessário para produzi-las em seu componente
    • Limpe a fila de mensagens, para que as mensagens não sejam exibidas duas vezes. Nas versões anteriores do Joomla, era possível limpar diretamente a fila com um método, mas no Joomla 3 você precisa substituir a fila existente por uma vazia.
  4. É isso, você tem mensagens enfileiradas no sistema de mensagens Joomla padrão disponível em seu componente.

Isso precisa de algum trabalho, mas acho que o caminho geral a seguir é claro. Espero que seja útil para outra pessoa em uma situação semelhante.

9
Isidro Baquero

Para completar esta (boa) resposta de Isidro, observe que, a partir de hoje (Joomla 3.8.12), a função getMessageQueue() pode ser chamada com "true" (getMessageQueue(true)) como parâmetro para limpar/limpar a fila de mensagens.

Por fim, para obter as mensagens armazenadas da maneira esperada para o layout exibi-las, chame esse trecho 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'];
        }
    }
}

Então você recebe $lists classificados da maneira correta.

0
Fred the coder