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

ISV

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
JoomShoping 4.3.3, Widgetkit 1.5.5

Создал дополнительное поле (description1) описания на странице продукта.
Элемент Widgetkit вызывается через такой код [widgetkit id=1].
При этом в обычном поле описания (description) Widgetkit вызывается и работает.
В дополнительно созданном поле - нет.

В чем может быть проблема?
(возможно где-то надо зарегистрировать это поле, так как плагин не обрабатывает его...)

Спасибо за помощь.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
\components\com_jshopping\lib\functions.php function changeDataUsePluginContent
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

ISV

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Оригинальный код:
Код: php
function changeDataUsePluginContent(&$data, $type){
    $mainframe =JFactory::getApplication();
    $dispatcher =JDispatcher::getInstance();
    JPluginHelper::importPlugin('content');
    $obj = new stdClass();
    $params = $mainframe->getParams('com_content');
   
    if ($type=="product"){
        $obj->product_id = $data->product_id;
    }
    if ($type=="category"){
        $obj->category_id = $data->category_id;
    }
    if ($type=="manufacturer"){
        $obj->manufacturer_id = $data->manufacturer_id;
    }
    if (!isset($data->name)) $data->name = '';
    $obj->text = $data->description;
    $obj->title = $data->name;
    $results = $dispatcher->trigger('onContentPrepare', array('com_content.article', &$obj, &$params, 0));
    $data->description = $obj->text;
    return 1;
}

Пытался разобраться сам - не получилось (почти не знаю PHP).
У меня имеется еще одно значение (description1), если я добавляю две строки
Код: php
	$obj->text = $data->description1;

$data->description1 = $obj->text;
Widgetkit начинает работать, но у меня description1 копируется в description...
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
в конце перед return надо добавить

Код: php
$obj->text = $data->description1;
$results = $dispatcher->trigger('onContentPrepare', array('com_content.article', &$obj, &$params, 0));
$data->description1 = $obj->text;
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

ISV

  • Осваиваюсь на форуме
  • 10
  • 0 / 0
Огромное спасибо!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отдельное поле для себя в админке к заказам

Автор Kugata

Ответов: 3
Просмотров: 1077
Последний ответ 05.02.2019, 19:09:40
от kit2m2
Поле количество товара, шаблон vina fashion ii

Автор Chypik

Ответов: 15
Просмотров: 1056
Последний ответ 30.11.2018, 15:48:06
от lexxbry
Съедает описание в карточке товара Joomshoping

Автор standerson13

Ответов: 2
Просмотров: 1135
Последний ответ 24.04.2018, 21:29:25
от standerson13
Вывод краткого описания категории в модуле категории mod_jshopping_categories

Автор tigra-uki

Ответов: 11
Просмотров: 947
Последний ответ 16.09.2017, 16:26:23
от tigra-uki
Редактирование количества товара в корзине кнопками "+", "-" (Joomshoping)

Автор eavasi

Ответов: 21
Просмотров: 6695
Последний ответ 19.02.2017, 00:12:06
от alex_nice