Новости Joomla

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

0 Пользователей и 1 Гость просматривают эту тему.
  • 217 Ответов
  • 10168 Просмотров
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Кешировать.
Спасибо. Для этой задачи лучше использовать raw-кэш?
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Реально, тяжело понимать, что вы имеете ввиду и читать кучу постов. Может разместите в репозитарии свой код? Чтобы можно было скачать и проверить.

Цитировать
Возник вопрос: если scandir() будет запускаться на юниксах и в папке окажутся файлы с русскими символами в названии, то scandir() не будет возвращать не UTF-8 символы и json_encode() будет работать даже при наличии файлов с русскими буквами в директории?

Будет конечно все работать даже на локальной машине с Windows, если она правильно настроена. Удивляет при этом, что вам мешает проверить на "юниксах" кириллицу.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
capricorn, спасибо за предложение, как разберусь с репозиториями, возможно так и сделаю. Проверил на юниксах проблему с русскими именами - там json_encode работает нормально
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!

Возникла задача выводить языковые константы через код в js. Для этого вы обычно пишите свой AJAX запрос и ответчик на него в своем компоненте или, может, в Joomla это уже все это стандартизировано(как спрашивать и у кого)?
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
@borro, ну вы же вроде уже не первый день тут, и наверняка же не раз видели правило форума "Один вопрос - одна тема". я понимаю, что тема и так уже свалка, но зачем и дальше продолжать это делать?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте, Дмитрий. Конечно, я так когда-то и начал делать, задавая вопросы относительно разных сторон этого компонента. Потом получил сообщение от старожила, по-моему модератора,  что не надо плодить темы вокруг да около :)
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
ну я не знаю конечно, не буду комментировать это, просто потому что не понятно, о каких именно "вокруг да около" шла речь :) но как по мне все просто. собственно, всего 2 условия/вопроса

1. кто-то ищет "Разбить работу сервера на куски", попадает в эту тему - что он тут видит? ну тут еще ладно, хотя бы в начале темы обсуждения плюс минус соответствуют теме.
2. кто-то ищет "выводить языковые константы через код в js", опять попадает в эту тему - что он тут видит? и тут конечно наступает мрак :) 8 страниц перечитать, чтобы потом может быть найти ответ - этого ж никто не будет просто делать...

проблема в том, что теряется структура, найти что то на форуме становится очень проблематично. итого тема на 8 страниц, и вроде бы и польза от нее должна быть, и решение, но бардак в ней такой, что кто то прочтет 2, и закроет. а решение может и было на 3-й, но из-за мешанины тем уже не будет желания туда дочитать, потому что похоже что там уже вместо предмета обсуждения отпуск начнут обсуждать :)
« Последнее редактирование: 04.10.2017, 12:55:13 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться