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

8

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.

Isidro Baquero
fonte

Respostas:

9

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/25240

Não é exatamente o que eu preciso, mas, verificando 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.

Isidro Baquero
fonte
0

Para completar esta (boa) resposta do Isidro, observe que, a partir de hoje (Joomla 3.8.12), a getMessageQueue()função pode ser chamada com "true" ( getMessageQueue(true)) como o 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ê é $listsclassificado da maneira correta.

Fred, o codificador
fonte
A apenas uma FYI, você pode agilizar o seu trecho com esses pequenos ajustes: 3v4l.org/DZGWd
mickmackusa