Отображать системные сообщения внутри компонента, а не в шаблоне

8

По умолчанию системные сообщения Joomla 3 (сообщения, уведомления, предупреждения) отображаются в определенной позиции шаблона с помощью

<jdoc:include type="message" />

Возможно ли получить больший контроль над этими сообщениями и отображать их в разных позициях внутри контейнера моего собственного компонента?

Я попытался использовать jdoc выше в представлениях моего компонента (дешевый выстрел), но не повезло. Можно ли каким-то образом «захватывать» сообщения, сгенерированные моим компонентом, используя стандартную систему обмена сообщениями Joomla, и отображать их там, где я хочу?

Заранее спасибо.

Исидро Бакеро
источник

Ответы:

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

Чтобы завершить этот (хороший) ответ Исидро, обратите внимание, что на сегодняшний день (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