在组件内部而不是模板中显示系统消息


8

默认情况下,使用以下命令在模板的某个位置显示Joomla 3系统消息(消息,通知,警告)

<jdoc:include type="message" />

是否有可能获得对这些消息的更多控制并将它们显示在我自己组件的容器内的不同位置?

我尝试在组件的视图内使用上面的jdoc(便宜的镜头),但是没有运气。有什么方法可以使用Joomla的标准系统消息传递系统“捕获”由组件生成的消息,并在需要的任何地方显示它们?

提前致谢。

Answers:


9

好吧,似乎我要多挖一点才能找到我自己问题的答案。基本上我发现了这个插件:

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

这并不是我真正需要的,但是检查它的代码后,我找出了解决的方法,可以将其总结如下(以防万一有人来这里寻找相同的问题):

  1. 如果您想以正确的方式进行操作,则需要注意通过模板显示的默认Joomla消息<jdoc:include type="message" />,以使消息不会显示两次
  2. 处理该问题的唯一方法是使用将在onBeforeRender事件上触发的插件
  3. 在这种情况下,您需要:
    • 使用以下方式检索消息 $app = JFactory::getApplication(); $messageQueue = $app->getMessageQueue();
    • 根据需要处理消息以将其输出到组件中
    • 清除消息队列,以使消息不会显示两次。在以前的Joomla版本中,可以用一种方法直接清除队列,但是在Joomla 3中,您需要用一个空队列替换现有队列。
  4. 就是这样,您的组件中已将消息放入默认的Joomla消息传递系统中。

这需要一些工作,但是我认为要遵循的总体路径是明确的。希望它对类似情况的其他人有用。


0

要完成Isidro的这个(好)答案,请注意,从今天开始(Joomla 3.8.12),getMessageQueue()可以使用“ true”(getMessageQueue(true))作为参数来清除/清除消息队列的函数。

最后,要获得按预期方式存储的消息以供布局显示它们,请调用以下代码(从中提取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'];
        }
    }
}

然后,您$lists将以正确的方式进行排序。


只是为了方便,您可以通过以下一些细微调整来简化代码段:3v4l.org/DZGWd
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.