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

Shiffer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
А существует ли какое-нибудь универсальное средство что бы заставить работать Content плагины в JoomShopping?
В том числе, которые работают вставкой специального тэга в текст (например ExtraVote и Product Snapshot).
« Последнее редактирование: 08.08.2013, 22:59:01 от ELLE »
*

nevigen

  • Moderator
  • 10452
  • 863 / 25
  • http://n*****n.com
включить в настройках Использование плагинов в описании
Профессиональные / Бесплатные решения для JoomShopping
Не лечи бесплатно, ибо тот, кто лечится бесплатно, рано или поздно перестает ценить свое здоровье,
а тот, кто лечит бесплатно, рано или поздно перестает ценить результаты своего труда/ (с) Гиппократ?
Не ищите ответов, ищите решение !
*

Shiffer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
включить в настройках Использование плагинов в описании
К сожалению, это почему-то не включает контентные плагины.
Пробовал писать что-то типо
Код
JPluginHelper::importPlugin( 'content', 'имя плагина' );
но не помогает.
Судя по похожим темам, их надо отдельно инициализировать.. только как?
*

vgromov

  • Осваиваюсь на форуме
  • 15
  • 8 / 0
Увы, по-умлочанию, контентные плагины JS включить можно только в описании товара, на весь контент, генерируемый JS, это не распространяется. Мне пришлось пользоваться template override (у подавляющего большинства разработчиков JS и так используется template override, я думаю).  Выводим все в буфер, затем буфер обрабатываем плагинами, и выводим результат:
Код: php
ob_start();
// << normal template output goes here
$tmp = ob_get_clean();
// process generated content with J! plugins in the context of an article, and render it
echo JHtml::_('content.prepare', $tmp, '', 'com_content.article');
« Последнее редактирование: 13.08.2013, 12:40:17 от vgromov »
*

Shiffer

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
vgromov, а вы не могли бы подробнее объяснить что-куда писать?
Если вставить этот код например в продукс.пхп, то просто слетает шаблон, но плагины не включаются.
*

vgromov

  • Осваиваюсь на форуме
  • 15
  • 8 / 0
...а вы не могли бы подробнее объяснить что-куда писать?
Если вставить этот код например в продукс.пхп, то просто слетает шаблон, но плагины не включаются.

Объясню, как у меня сделано через template override. Можно, конечно, и оригинал шаблона JS покоцать, но с каждым обновлением есть опасность потерять изменения, я в "ядреную" функциональность лезть не люблю очень.

1) Создаем template override для компонента JS. Копируем все, что лежит в _корень вашего сайта_/components/com_jshopping/templates/default в _корень вашего сайта_/templates/_ваш темплейт_/html/com_jshopping
2) Далее издеваемся над файлами, лежащими в _корень вашего сайта_/templates/_ваш темплейт_/html/com_jshopping. Заходим в эту директорию.
3) Допустим, вам нужно, чтобы все, что выводится в вид "товар", было обработано плагинами контента. Открываем файл /product/product_default.php - это "корень" вида "товар" - остальные файлы там - подключаемые куски отображения. В файле видим:

В начале:
Код: php
<?php 
defined( '_JEXEC' ) or die();
$product = $this->product;
?>
<?php include(dirname(__FILE__)."/load.js.php");?>
<div class="jshop productfull">
// ........ the rest of the body .....

В конце:
Код: php
echo $this->_tmp_product_html_before_review;
include(dirname(__FILE__)."/review.php");
echo $this->_tmp_product_html_end;?>
</div>

Нам нужно вывод перенаправить не в страницу, а в буфер:
В начале:
Код: php
<?php 
defined( '_JEXEC' ) or die();
$product = $this->product;
/// start buffered output
ob_start();
?>
<?php include(dirname(__FILE__)."/load.js.php");?>
<div class="jshop productfull">
// ........ the rest of the body .....

В конце:
Код: php
echo $this->_tmp_product_html_before_review;
include(dirname(__FILE__)."/review.php");
echo $this->_tmp_product_html_end;?>
</div>
<?php
// end buffered output, get buffer contents, clean buffer
$tmp = ob_get_clean();
// process generated content with J! plugins in the context of an article, and render it
echo JHtml::_('content.prepare', $tmp, '', 'com_content.article');
?>

Должно заработать.
Параллельно - пока писал - заметил у себя ошибку в предыдущем примере - не ob_get_start(), конечно, а ob_start();
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Мы починили поиск для JoomShopping

Автор Dimidrol-Pruper

Ответов: 101
Просмотров: 34590
Последний ответ 24.06.2024, 14:20:58
от kit2m2
Плагин - Вывод значения поля из таблицы продуктов в корзине JoomShopping

Автор draff

Ответов: 3
Просмотров: 2192
Последний ответ 26.02.2024, 07:00:01
от kit2m2
Плагин - Товар на складе или Товар под заказ для JoomShopping [Скачать]

Автор kit2m2

Ответов: 58
Просмотров: 11702
Последний ответ 18.05.2023, 12:59:00
от Akeksandr
[Решено] Комплект товаров JoomShopping - конструктор

Автор vgromov

Ответов: 96
Просмотров: 31435
Последний ответ 14.12.2022, 15:21:24
от kit2m2
Функционал сравнение товаров в JoomShopping

Автор falur

Ответов: 53
Просмотров: 15613
Последний ответ 22.08.2022, 09:54:16
от kit2m2