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

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
При разработке нескольких компонентов для одного сайта столкнулся с тем, что приходится для каждого их них создавать по несколько практически идентичных хелперов. Подскажите как можно создать и установить библиотеку, общую для нескольких компонентов.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Добавление своей библиотеки
« Ответ #1 : 10.10.2013, 10:22:18 »
Плагины...
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Re: Добавление своей библиотеки
« Ответ #3 : 12.10.2013, 12:52:10 »
Подключаем свою библиотеку при разработке расширений
Супер. То, что надо, но не все.
Это позволяет использовать уже установленную нашу библиотеку.
А как её установить на сайт? Не ставить же её по FTP.
Можно конечно же перенести из установочного файла компонента с помощью файла script.php, но что-то мне подсказывает, что есть более правильный способ.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: Добавление своей библиотеки
« Ответ #4 : 12.10.2013, 21:05:31 »
Можно конечно же перенести из установочного файла компонента с помощью файла script.php, но что-то мне подсказывает, что есть более правильный способ.
Именно так. Другого способа я лично не знаю.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Добавление своей библиотеки
« Ответ #5 : 12.10.2013, 21:48:25 »
Именно так. Другого способа я лично не знаю.
зачем перетягивать через script?
в установочном файле кинуть <folder>my_framework</folder>
оно установится в plugins/plugin_group/my_plugin/my_framework/ оттуда и подрубать...
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Re: Добавление своей библиотеки
« Ответ #6 : 13.10.2013, 19:37:08 »
Можно конечно же перенести из установочного файла компонента с помощью файла script.php, но что-то мне подсказывает, что есть более правильный способ.

Именно так. Другого способа я лично не знаю.

Тогда может знаете как перенести файлы библиотеки прямиком из папки tmp.
Суть идеи такова. При установке расширения оно сперва распаковывается папку tmp (точнее в одну из её подпапок с уникальным именем). Так вот нужно узнать имя этой подпапки, а дальше скопировать файлы не составит труда.

И ещё. Можно ли использовать при установке модулей и плагинов файл script.php, аналогично тому как при установке компонента?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Добавление своей библиотеки
« Ответ #7 : 13.10.2013, 20:01:31 »
Тогда может знаете как перенести файлы библиотеки прямиком из папки tmp.
Зачем так извращаться? вы мой ответ выше читали?

И ещё. Можно ли использовать при установке модулей и плагинов файл script.php, аналогично тому как при установке компонента?
даже при установке шаблонов можно использовать  script.php
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Re: Добавление своей библиотеки
« Ответ #8 : 13.10.2013, 22:30:30 »
вы мой ответ выше читали?
читал. но как-то стараюсь все ставить на свои места.
Если мы говорим о библиотеке, то и стоять она должна там, где библиотеки.
а то есть любители позапихивать плагины и модули в папку компонента. вообще много ещё чего куда-то запихнуть можно  ^-^
и потом ломать голову что со всем этим делать  ;D

А вообще за совет спасибо. Порой, так может быть проще делать. Но все же хочу разобраться с тем как все поставить на нужное место.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Добавление своей библиотеки
« Ответ #9 : 13.10.2013, 23:09:16 »
читал. но как-то стараюсь все ставить на свои места.
как может все стоять на своих местах если вы уже к фреймворку пихаете ещё какой то фреймворк?

а то есть любители позапихивать плагины и модули в папку компонента. вообще много ещё чего куда-то запихнуть можно  ^-^
и потом ломать голову что со всем этим делать  ;D.
Или ломают голову что это за лишняя папочка и зачем она тут надо...
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Re: Добавление своей библиотеки
« Ответ #10 : 14.02.2014, 15:07:07 »
Время шло, а ответ покоя не давал.
Так что решил к нему вернуться.
И вот к чему пришел.
В Joomla, как обычно, всё уже есть, только нормальной инструкции нет.
на Joomla.org тоже ни чего толкового не нашел, поэтому полез читать реализацию (тобиш код).
Оказалось все очень просто. У Joomla есть специальный адаптер для установки библиотек: <site>\libraries\joomla\installer\adapters\library.php
Библиотеки можно ставить такими же установочными пакетами, как, скажем, компоненты, плагины и прочее.

И так по шагам.
1) собираете в папке вашу библиотеку (все папки/файлы)
2) делаете стандартный xml-манифест, как, например, для модуля.
Те же теги: name, version, description, creationdate и т.д. В тег files оборачиваете список файлов/папок вашей библиотеки примерно таким манером:
Код: xml
	<files>
<filename>index.html</filename>
<filename>myfile1.xml</filename>
<filename>myfile2.xml</filename>
<folder>myfolder1</folder>
<folder>myfolder1</folder>
</files>
Указанные папки будут с копированы целиком со всеми файлами и подпапками, так что описывать их содержимое нет надобности.
Подробнее по манифесту можно посмотреть здесь <site>\libraries\joomla\installer\librarymanifest.php
Важное замечание в манифесте библиотеки добавляется тег libraryname, отвечающий за имя папки, в которой будет храниться ваша библиотека. Путь указываете относительно общей папки библиотек, т.е. чтобы ваша библиотека была здесь: <site>\libraries\mylibrary - в манифесте вы пишете так: <libraryname>mylibrary</libraryname>
Ещё один важный момент. В теге extension атрибуту type нужно присвоить значение library.
3) делаете из получившегося zip-архив и ставите/удаляете, как обычное расширение.

И будет вам (и мне :) ) счастье.
Таким образом легко можно устанавливать библиотеку хоть отдельно, хоть в пакете. И не бояться, что случайно сам же снесешь вместе с каким-то расширением.

Ну, а про подключение уже все хорошо написано выше.
Впрочем, кто в ладу с английским, то может ещё здесь посмотреть: Using own library in your extensions
« Последнее редактирование: 14.02.2014, 15:11:20 от Aeliot »
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: Добавление своей библиотеки
« Ответ #11 : 14.02.2014, 15:24:43 »
Ну, а про подключение уже все хорошо написано выше.
Впрочем, кто в ладу с английским, то может ещё здесь посмотреть: Using own library in your extensions
Дык на английском тоже самое, что и на русском выше, так как автор один и тот же - я :) А вот про <libraryname> я даже и не знал. +
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Re: Добавление своей библиотеки
« Ответ #12 : 15.02.2014, 09:27:35 »
b2z, к слову сказать
если смотреть список адаптеров: <site>\libraries\joomla\installer\adapters\
то ещё есть возможность установки отдельных файлов,
но чем это отличается от библиотеки и какой в этом практический смысл пока не знаю
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Добавление сортировки по второй таблице

Автор ninth

Ответов: 6
Просмотров: 1227
Последний ответ 30.09.2014, 12:37:55
от b2z
addStyleDeclaration() - добавление стилей в цикле

Автор olf

Ответов: 5
Просмотров: 2013
Последний ответ 07.08.2014, 17:38:15
от Fedor Vlasenko
Добавление параметра в редактирование пункта меню Joomla

Автор olf

Ответов: 5
Просмотров: 1365
Последний ответ 07.07.2014, 22:23:55
от Shustry
SOS! Добавление дополнительного фильтра в модель вида блога

Автор titansword

Ответов: 2
Просмотров: 7268
Последний ответ 11.10.2011, 17:41:08
от Виталик