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

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
как получить id материала
« : 27.02.2009, 00:19:47 »
как в своем скрипте получить id текущего материала joomlaвскими методами. (скрипт вставляется в тело материала).
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Re: как получить id материала
« Ответ #1 : 27.02.2009, 00:23:12 »
нашел вот какой вариант:
Код
	$uri = &JFactory::getURI();
$url = $uri->toString(array('path', 'query', 'fragment'));

таким образом в $url оказвается весь путь к материалу.

можно конечно и из $url выдрадь id.

Но что-то мне подсказывает, что должен быть более простой и элегантный метод
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: как получить id материала
« Ответ #2 : 27.02.2009, 00:27:16 »
Я так понимаю это отголосок другой темы? Для того, чтобы ответить, как получить этот идентификатор, сначала надо понять, что значит фраза "вставляется в тело материала". Если данный скрипт это плагин для компонента com_content, то идентификатор материала можно получить из плагина (там объект передается в методы плагина), подробнее посмотрите /plugins/content/example.php.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Re: как получить id материала
« Ответ #3 : 27.02.2009, 00:30:08 »
нет это не плагин, а вставляется с помощью add_php
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: как получить id материала
« Ответ #4 : 27.02.2009, 00:31:58 »
Ну тогда надо смотреть код этого add_php, и пытаться понять, что будет доступно скрипту, вставленному таким образом. Но если это отголосок указанной мной темы - мне кажется, это несколько нерациональный путь.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Re: как получить id материала
« Ответ #5 : 27.02.2009, 00:35:16 »
кстати по поводу прошлой темы, там тоже необходимо в шаблоне реализовать проверку нужного материала, где кстати опять нужен этот же id.

как в таком случае поступить?
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: как получить id материала
« Ответ #6 : 27.02.2009, 00:42:16 »
Ну по той задаче, я бы попробовал вставить проверку (ну и сам код добавления скрипта к шапке) в переопределенный вид материала (view) в шаблоне.

Т.е. для шаблона ja_purity это будет файл /templates/ja_purity/html/com_content/article/default.php. В нем нам весь объект статьи доступен в переменной $this->article, таким образом проверка может быть вот такой:

Код: php
<?php
if ($this->article->id == 911) {
  $document = & JFactory::getDocument();
  $document->addStyleSheet(JURI::root() . 'myphp/style.css');
  $document->addScript(JURI::root() . 'myphp/script.js');
}
?>

По идее должно сработать...

Что же касается других задач, я бы подумал вот над чем - если для вас не составляет труда написать некий скрипт, то почему бы тогда просто не оформить его плагином (я ниже давал ссылку на пример такого плагина) и в нем это все не реализовать. Во-первых, ваш код будет вызываться напрямую ядром Joomla, а значит быстродействие будет выше, во-вторых ваш код не будет зависеть от сторонних скриптов, в-третьих вам будет доступен объект материала со всеми полями. Подумайте, мне кажется это было бы более правильно.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Re: как получить id материала
« Ответ #7 : 27.02.2009, 00:48:59 »
спасибо smart, за помощь
+1
*

Pencil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
  • Pencil-box.ru
Re: как получить id материала
« Ответ #8 : 16.10.2010, 04:07:51 »
Господа, а может подскажете как в mod_php можно  вывести название текущего материала (страницы)?
Объясню для чего нужно: не устраивает размещение заголовков страниц в компоненте, хочу вывести их выше. Причем между заголовком и содержимым будет еще строка навигации и меню.
 !
*

Pencil

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
  • Pencil-box.ru
Re: как получить id материала
« Ответ #10 : 16.10.2010, 12:13:18 »
Спасибо, конечно же, материал примерно в том же направлении. Но тут мне показалось более узко направленная тема.
А в приведенной вами теме я так и не увидел переменной содержащей имя страницы. По упомянутым там файлам прошелся, поперебирал похожие переменные, но видимо что то делал не так. Вывести название материала в модуль мне так и не удалось.
Мои познания в PHP только базовые, собственно поэтому и обращаюсь за помощью.

Может кто написать эти 2-3 строки кода которые выведут на экран название страницы?
Я догадываюсь что там что то типа echo $article;
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Заголовок страницы вида Имя материала / имя категории / имя раздела /

Автор rubasket

Ответов: 2
Просмотров: 19359
Последний ответ 24.03.2017, 01:13:50
от mbgr
Поиск материала

Автор rjk112

Ответов: 3
Просмотров: 1541
Последний ответ 31.10.2016, 11:15:50
от rjk112
Кнопки like-dislike для материала

Автор Aiden

Ответов: 0
Просмотров: 1536
Последний ответ 14.05.2016, 13:23:55
от Aiden
Проблема при добавлении материала

Автор illia

Ответов: 4
Просмотров: 1788
Последний ответ 12.05.2016, 12:23:30
от 4erep
Как менять дату создания материала с фронтенда? Или как объединить ее с датой публикации?

Автор shturmanoid

Ответов: 3
Просмотров: 2208
Последний ответ 29.04.2016, 08:22:50
от flyingspook