Новости 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 Ответов
  • 2167 Просмотров
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Очень часто пользуюсь импортом (Товар обновляется еженедельно), и периодически натыкаюсь на косяки, такие как отсутствие цены, артикула, изображения, да и много других недочетов бывает. И вот чтобы проверить результаты импорта нужно заходить в каждый товар отдельно. А при большом количестве это очень долго и нудно.
Захотел стрелки в редактировании товара, Следующий товар и Предыдущий товар.
Добавить стрелки оказалось не сложно, а вот правильно всё организовать (не показывать стрелку если нет след. или пред. товара, учитывать сортировку и т.д.) увы сложнее, да и лень тратить время  ^-^
Выкладываю тут хак ядра, но очень прошу Виктора учесть данное пожелание для следующих версий JoomShopping.
Добавляем кнопки в функцию display в файле /administrator/components/com_jshopping/views/product_edit/view.html.php
Код
        JToolBarHelper::customX("product_prev","back","back",_JSHOP_PREV, false);
        JToolBarHelper::customX("product_next","forward","forward",_JSHOP_NEXT, false);
Добавляем функции в /administrator/components/com_jshopping/controllers/products.php
Код
    function product_next(){
        $products = &$this->getModel("products");
        $rows = $products->getAllProducts(Array("publish"=>1));
        $total = Count($rows);
        $product_id = JRequest::getInt('product_id');
        $Next = $product_id;
        foreach($rows as $Key=>$row){
         If ($Key < $total){
         If ($row->product_id == $product_id){
         $Next = $rows[$Key + 1]->product_id;
         Break;
         }
         }
        }
        If (!$Next) $Next = 1;
        $this->setRedirect("index.php?option=com_jshopping&controller=products&task=edit&product_id=".$Next);
    }
    function product_prev(){
        $products = &$this->getModel("products");
        $rows = $products->getAllProducts(Array("publish"=>1));
        $total = Count($rows);
        $product_id = JRequest::getInt('product_id');
        $Prev = $product_id;
        foreach($rows as $Key=>$row){
         If ($Key < $total){
         If ($row->product_id == $product_id){
         $Prev = $rows[$Key - 1]->product_id;
         Break;
         }
         }
        }
        If (!$Prev) $Prev = 1;
        $this->setRedirect("index.php?option=com_jshopping&controller=products&task=edit&product_id=".$Prev);
    }
Добавляем ленги в /administrator/components/com_jshopping/lang/ru-RU.php
Код
define('_JSHOP_NEXT','Следующий товар');
define('_JSHOP_PREV','Предыдущий товар');
« Последнее редактирование: 22.06.2012, 16:06:40 от Linfuby »
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

skyrec

  • Захожу иногда
  • 382
  • 10 / 0
  • Люблю я детей !!!
Подскажите пожалуйста, для последней версии Jshop актуально ?
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Попробовал, не катит белый экран. Вроде всё по инструкции делал
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
очень странно. Проверил - все работает.
Дополнительно улучшил, теперь не показывается кнопка "Предыдущий товар" Если товар первый в списке (Сортировка по id). Так же не показывается "Следующий товар" если товар последний в списке.
Ниже полный код для хака:
Файл - administrator\components\com_jshopping\controllers\products.php
1. В самом начале функции edit (после кривой скобки {) прописываем след. код:
Код
		$JToolBar = JToolBar::getInstance('toolbar');
$products = JTable::getInstance("Product", "JShop");
$rows = $products->getAllProducts(array(), "product_id", "ASC");
$total = count($rows) - 1;
$product_id = JFactory::getApplication()->input->getInt('product_id', 0);
$prev = false;
$next = false;
foreach($rows as $key=>$row){
if ($row->product_id == $product_id){
if ($key < $total){
$next = true;
}
break;
}
$prev = true;
}
if ($prev) {
$JToolBar->appendButton('Standard', 'back', "Предыдущий товар", "product_prev", false);
}
if ($next){
$JToolBar->appendButton('Standard', 'forward', "Следующий товар", "product_next", false);
}
2. Перед закрывающейся скобкой (в самом конце файла }?>), после функции getvideocode(){} добавляем две функции:
Код
	function product_next(){
$products = JTable::getInstance("Product", "JShop");
$rows = $products->getAllProducts(array(), "product_id", "ASC");
$total = count($rows);
$product_id = JFactory::getApplication()->input->getInt('product_id', 0);
$next = $product_id;
foreach($rows as $key=>$row){
if ($key < $total){
if ($row->product_id == $product_id){
$next = $rows[$key + 1]->product_id;
break;
}
}
}
if (!$next) $next = 1;
$this->setRedirect("index.php?option=com_jshopping&controller=products&task=edit&product_id=".$next);
}
function product_prev(){
$products = JTable::getInstance("Product", "JShop");
$rows = $products->getAllProducts(array(), "product_id", "ASC");
$total = count($rows);
$product_id = JFactory::getApplication()->input->getInt('product_id', 0);
$prev = $product_id;
foreach($rows as $key=>$row){
if ($key < $total){
if ($row->product_id == $product_id){
$prev = $rows[$key - 1]->product_id;
break;
}
}
}
if (!$prev) $prev = 1;
$this->setRedirect("index.php?option=com_jshopping&controller=products&task=edit&product_id=".$prev);
}
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Отлично. Первый способ тоже работает скорее всего. Может я неправильно вставлял хак.
Но по второму даже лучше.
Конечно не забыть про UTF
+
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Плагин - Товар на складе или Товар под заказ для JoomShopping [Скачать]

Автор kit2m2

Ответов: 58
Просмотров: 11707
Последний ответ 18.05.2023, 12:59:00
от Akeksandr
[Решено] Товар на замену в блоке с ценой

Автор dron

Ответов: 2
Просмотров: 2676
Последний ответ 13.04.2022, 16:09:53
от dron
Товар уже в корзине

Автор denben777

Ответов: 18
Просмотров: 4663
Последний ответ 28.12.2018, 13:31:48
от dmitry_stas
Wishlist как избранное (любимый товар)

Автор virtucom

Ответов: 0
Просмотров: 783
Последний ответ 01.09.2018, 00:07:49
от virtucom
Отключить Сообщение Товар добавлен в корзину

Автор gf79

Ответов: 17
Просмотров: 1845
Последний ответ 23.03.2018, 16:17:48
от nevigen