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

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Долго думал куда отпостить... решил сюда - формально подходит.

Если мне память не изменяет, то производители раньше присутствовали в главном меню ЖШ. Потом по каким то причинам их засунули в опции и возвращать обратно не желают. Гора не идёт к магомету - выходим навстречу! Собственно добавить производителей в основное меню - не вопрос: добавляем в administrator/components/com_jshoppinf/functions.php в функцию addSubmenu($vName) строчку
Код
 $menu['manufacturers'] = array(_JSHOP_MENU_MANUFACTURERS, 'index.php?option=com_jshopping&controller=manufacturers', $vName == 'manufacturers', 1);
- появляется пункт "Производители". Но, вместе с таблицей производителей появляется и субменю "Опций". Долго рыл код, но так и не нашёл, как от него избавиться. Подскажите, как показать производителей из основного меню без субменю опцый?
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Удалить displaySubmenuOptions(); из файла /administrator/components/com_jshopping/views/manufacturer/tmpl/list.php
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Спасибо, заработало! )
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
А почему при переходе в производители по прежнему подсвечиваются "Опции"? Как сделать, чтобы новый пункт "Производители" в основном меню подсвечивался?
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
В контроллере производителя, в функции __construct есть что-то типа addSubMenu("other")
Замените other на manufacturers
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Благодарю! Теперь совсем хорошо стало. )
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Несмотря на то, что стало совсем хорошо, душа продолжает просить улучшений... ) Можно в производителях, как и в категориях вывести кол-во товаров относящихся к данному производителю?
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Конечно можно. Если не ошибаюсь надо вызвать функцию $JTableProduct->getAllProducts(array('manufacturer_id' => $id)); для каждого производителя в списке.
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
А технически возможно всё это оформить в виде аддона/плагина, чтобы не править заново после каждого обновления?
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Почти...
Вывести меню не проблема.
А вот сделать чтобы выделялся именно "Производители" и количество товаров для каждого - Нельзя.
По крайней мере не в виде плагина.
Можно создать свой дочерний контроллер и вывести в меню именно его. А в нем уже подправить всё что нужно... При этом так как он будет являться дочерним, то весь остальной функционал будет меняться, если в версии что-то изменится
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
А вот сделать чтобы выделялся именно "Производители" и количество товаров для каждого - Нельзя.
По крайней мере не в виде плагина.

Плагином группы jshoppingmenu - можно модифицировать меню и субменю.
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
« Последнее редактирование: 11.04.2013, 14:20:50 от jorevo »
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Плагином группы jshoppingmenu - можно модифицировать меню и субменю.
Ну как я и сказал

Почти...
Вывести меню не проблема.
А вот выделение этого пункта и запрос всех производителей прописаны в контроллере, и там нет ни одного триггера.
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Код
function addSubmenu($vName){
...
$dispatcher->trigger( 'onBeforeAdminMenuDisplay', array(&$menu, &$vName) );
...

Здесь можно назначить дополнительную проверку условий и модификацию как самого меню, так и активного пункта в зависимости от условий.
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
SDKiller, вижу мы друг друга не понимаем.
Я говорю - Меню вывести не проблема. Вы только что показали где и как это можно сделать. Тут мы солидарны.
Но сделать его активным - невозможно без правки контроллера производителей.
Итак допустим мы вывели меню "Производители" в плагине.
Код
function onBeforeAdminMenuDisplay(&$menu, &$vName){
    $menu['manufacturers'] = array(_JSHOP_MENU_MANUFACTURERS, 'index.php?option=com_jshopping&controller=manufacturers', $vName == 'manufacturers', 1);
}
Открываем этот пункт меню. У нас загружается контроллер JshoppingControllerManufacturers
У него в конструкторе прописано следующее:
Код
function __construct( $config = array() ){
    ...
    addSubmenu("other");
}
Это значит что выделен будет пункт меню "Опции"
И никаким плагином это не изменить...
Есть триггер конечно в display(), но если там прописать addSubmenu("manufacturers");, то просто добавится еще меню с выделенным пунктом "Производители"
Вывод: Плагином сделать выделение добавленного пункта меню - невозможно.
Можно добавить свой дочерний контроллер и добавить пункт меню именно на него и в нем переписать только конструкцию. И тогда обновления компонента не страшны.
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
SDKiller, вижу мы друг друга не понимаем.

Да уж, определённо не понимаем

Код
    public function onBeforeAdminMenuDisplay(&$menu, &$vName)
    {
        $menu['manufacturers'] = array(_JSHOP_MANUFACTURERS,
            'index.php?option=com_jshopping&controller=manufacturers', $vName == 'manufacturers', 1);

        if ($vName == 'other') {
            $controller = JFactory::getApplication()->input->get('controller');
            if ($controller == 'manufacturers') {
                $menu['other'][2] = false;
                $menu['manufacturers'][2] = true;
                $vName = 'manufacturers';
            }
        }
    }

« Последнее редактирование: 13.04.2013, 16:15:49 от SDKiller »
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Признаю́. Не сообразил. Надо организовать себе отпуск.
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

Наталья32

  • Осваиваюсь на форуме
  • 37
  • 0 / 0
А как сделать "производители" не списком, а что бы можно было выбрать нажав на стрелку
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Код
    public function onBeforeAdminMenuDisplay(&$menu, &$vName)
    {
        $menu['manufacturers'] = array(_JSHOP_MANUFACTURERS,
            'index.php?option=com_jshopping&controller=manufacturers', $vName == 'manufacturers', 1);

        if ($vName == 'other') {
            $controller = JFactory::getApplication()->input->get('controller');
            if ($controller == 'manufacturers') {
                $menu['other'][2] = false;
                $menu['manufacturers'][2] = true;
                $vName = 'manufacturers';
            }
        }
    }

Это, я так понимаю, практически готовый код для плагина? А не будет сильно большой наглостью попросить оформить его до конца, в качестве, так сказать наглядного примера? И уж совсем было бы замечательно понять, как добавить пункт "Производители" не в конец меню, а между Категориями и Товарами.

ЗЫ. А тем же плагином убрать Производителей из Опций можно?
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
А не будет сильно большой наглостью попросить оформить его до конца, в качестве, так сказать наглядного примера?

В качестве готового примера вы можете посмотреть у себя мой плагин

plugins\jshoppingmenu\xtjaddons

Цитировать
ЗЫ. А тем же плагином убрать Производителей из Опций можно?

Можно - это же массив, можно unset какого-либо элемента сделать.
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Ага, спасибо!

ЗЫ. А как Производителей воткнуть не в конец меню, а куда нужно?
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Пересортировать массив
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Меню в мобильной версии

Автор Rebarun

Ответов: 1
Просмотров: 2630
Последний ответ 07.07.2021, 07:47:08
от nevigen
Мобильное меню

Автор Rebarun

Ответов: 0
Просмотров: 1141
Последний ответ 16.08.2020, 21:25:35
от Rebarun
Открытие меню

Автор Rebarun

Ответов: 9
Просмотров: 3155
Последний ответ 02.08.2020, 21:43:44
от sivers
JS4.18.4/Joomla3.9.19 меню Список товаров не видит product.php в шаблоне

Автор tigra-uki

Ответов: 11
Просмотров: 1083
Последний ответ 13.06.2020, 19:44:10
от draff
Вертикальное меню товаров для мобильной версии сворачивающийся в трей

Автор bakyt

Ответов: 17
Просмотров: 1045
Последний ответ 20.12.2019, 15:56:31
от nevigen