Как создать пользовательские системные сообщения sticky admin?
-
29-09-2020 - |
Вопрос
В моем модуле Magento2 я хочу создать системные сообщения администратора, которые являются липкими и отображаются на каждой странице в adminhtml, пока проблема не будет решена.Это что-то важное, на что должен обратить внимание администратор, в противном случае это серьезно повлияет на работу магазина.Но как только обнаруженная проблема была решена, сообщение должно исчезнуть.
В качестве примера я рассматриваю сообщения, которые сообщают мне, когда необходимо обновить индексаторы или кэши.Как я могу создавать подобные сообщения?
Я смотрел на основной модуль AdminNotification
который, по-видимому, однозначно ответственен за это.Он рассмотрел задействованные шаблоны и блоки для отображения этих сообщений, и все это имеет смысл, но где они созданы?Кажется, я не могу понять, как создать эти уведомления.
Существует таблица базы данных, которая называется admin_system_messages
в котором хранится что-то связанное с этим, но я не понимаю содержания.Поле identity
просто содержит длинное шестнадцатеричное число.Я взял такой номер и поискал его по всему коду и по всей базе данных, чтобы найти ссылки, но ничего не нашел.Как модуль извлекает из этого "Один или несколько типов кэша признаны недействительными [...]"?
Чтобы было понятно, я видел механизм добавления временных сообщений, которые будут показаны пользователю ОДИН раз, например, подтверждения при удалении или сохранении чего-либо, и он сообщает вам, что это было успешно.Это НЕ то, что я ищу, я хочу, чтобы постоянные сообщения были на каждой странице.Я знаю, это навязчиво, но я убежден, что в моем случае это необходимо.
Решение
Я сам решил эту проблему.
Вашему модулю нужна зависимость от Magento_AdminNotification.
Затем вы создаете модель, которая реализует MessageInterface, например, так:
class YourMessage implements \Magento\Framework\Notification\MessageInterface
{
public function getIdentity() {
...
}
public function isDisplayed() {
// write code to decide if this message should be shown or not
// return true to show it, false otherwise
}
public function getText() {
// output a static text or dynamically generate one
}
public function getSeverity() {
// if you return self::SEVERITY_MAJOR the sticky box on top will be empty
// if you return self::SEVERITY_CRITICAL the sticky box will always show your text
}
}
Вот, собственно, и все, что от него требуется.Я потратил так много времени на поиски места в коде, где запускаются эти сообщения, потому что я не заметил, что они запускаются сами по себе с помощью isDisplayed()
способ.
Вы можете черпать вдохновение из других подобных сообщений, используемых в core:
\Magento\AdminNotification\Model\System\Message\Baseurl
\Magento\AdminNotification\Model\System\Message\CacheOutdated
\Magento\AdminNotification\Model\System\Message\Security