Новости 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 Гость просматривают эту тему.
  • 2 Ответов
  • 1921 Просмотров
*

7Rei

  • Захожу иногда
  • 134
  • 20 / 0
Добрый день.
Требуется подсчитать сколько дней остается до события.
Сами дни посчитал, но столкнулся с проблемой их вывода.
Сначала написал так:

Код: php
if ($ostalos == 1):
echo $ostalos." день";
endif;

хотел аналогично прописать для 2,3,4 (дня) и всех других чисел >= 5 (дней).
Но, например есть числа 21 день, 71 день, 32 дня, 63 дня...
Как правильно это сделать средствамим php?


Спасибо.
« Последнее редактирование: 21.07.2009, 19:00:49 от smart »
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Для начала надо заметить, что никакого отношения к синтаксису ваш вопрос не имеет. Кроме того, к названию дней ваш вопрос также никакого отношения не имеет. И в-третьих, данный вопрос никакого отношения к Joomla 1.5 не имеет, это еще одно нарушение правил форума - публикация вопроса вне тематического раздела. Но что вы хотите, в принципе понятно... В этот раз отвечу, в следующий - уже не буду, а просто удалю.

Код: php
<?php
// число
$n = 25;
// для русского языка необходимо 3 формы
$pluralForms = array('день', 'дня', 'дней');
// вычисляем, какую именно из трех форм использовать
$idx = ($n%10==1 && $n%100!=11 ? 0 : ($n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2));
// непосредственно отображение (данный пример выведет текст: 25 дней)
echo $n . ' ' . $pluralForms[$idx];
?>

Полный список правил для различных языков можно найти тут: Plural Forms.
« Последнее редактирование: 21.07.2009, 19:09:20 от smart »
*

7Rei

  • Захожу иногда
  • 134
  • 20 / 0
это нарушение правил форума - публикация вопроса вне тематического раздела. Но что вы хотите, в принципе понятно... В этот раз отвечу, в следующий - уже не буду, а просто удалю.
Спасибо большое за понимание и помощь неведающим! Свои ошибки понял, исправлюсь :)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться