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

Doctor Death

  • Захожу иногда
  • 144
  • 1 / 12
Надоело заполнять от руки коробки и пакеты, потратил пару дней и наваял маленький "хак" (просьба сильно ногами не пинать) для автоматической генерации наклеек для "Почты России"

в архиве три файла
pr.png - класть в /images (логотип почты росcии)
zipcode.TTF - класть в /images (шрифт для генерации индекса)
postlabel.php - класть в /administrator/components/com_jshopping/views/orders/tmpl/ (собственно сам ***код)
далее прописываем в саму систему
1. Для того чтобы получить ещё одну иконку с печатью в списке заказов идем в фаил /administrator/components/com_jshopping/views/orders/tmpl/list.php, в нем находим блок
Код
            <a href = "javascript:void window.open('index.php?option=com_jshopping&controller=orders&task=printOrder&order_id=<?php echo $row->order_id?>&tmpl=component', 'win2', 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=yes,resizable=yes,width=800,height=600,directories=no,location=no');">
                <img border="0" src="components/com_jshopping/images/jshop_print.png" alt="printhtml" />
            </a>
после него добавляем его же, с немногими изменениями.
Код
            <a href = "javascript:void window.open('index.php?option=com_jshopping&controller=orders&task=printPostlabel&order_id=<?php echo $row->order_id?>&tmpl=component', 'win2', 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=yes,resizable=yes,width=600,height=440,directories=no,location=no');">
                <img border="0" src="/components/com_jshopping/images/print.png" alt="printhtml" />
            </a>
2. Теперь правим /administrator/components/com_jshopping/controllers/orders.php найдем функцию  function show() (у меня это строка 150) и скопируем её целиком в конец файла
в скопированном блоке поправим имя самой функции на function postlabel() и $view->setLayout("show"); на $view->setLayout("postlabel");
Вот что должно получиться:
Код
    function postlabel(){
        $order_id = JRequest::getInt("order_id");
        $jshopConfig = JSFactory::getConfig();

        $orders = JSFactory::getModel("orders");
        $order = JSFactory::getTable('order', 'jshop');
        $order->load($order_id);

$order->prepareOrderPrint('order_show');

        $id_vendor_cuser = getIdVendorForCUser();

$order->loadItemsNewDigitalProducts();
        $order_items = $order->getAllItems();

        if ($jshopConfig->admin_show_vendors){
            $tmp_order_vendors = $order->getVendors();
            $order_vendors = array();
            foreach($tmp_order_vendors as $v){
                $order_vendors[$v->id] = $v;
            }
        }

        $lists['status'] = JHTML::_('select.genericlist', $orders->getAllOrderStatus(),'order_status','class = "inputbox" size = "1" id = "order_status"','status_id','name', $order->order_status);

        $tmp_fields = $jshopConfig->getListFieldsRegister();
        $config_fields = $tmp_fields["address"];
        $count_filed_delivery = $jshopConfig->getEnableDeliveryFiledRegistration('address');

        $display_info_only_product = 0;
        if ($jshopConfig->admin_show_vendors && $id_vendor_cuser){
            if ($order->vendor_id!=$id_vendor_cuser) $display_info_only_product = 1;
        }

        $display_block_change_order_status = $order->order_created;
        if ($jshopConfig->admin_show_vendors && $id_vendor_cuser){
            if ($order->vendor_id!=$id_vendor_cuser) $display_block_change_order_status = 0;
            foreach($order_items as $k=>$v){
                if ($v->vendor_id!=$id_vendor_cuser){
                    unset($order_items[$k]);
                }
            }
        }

$stat_download = $order->getFilesStatDownloads(1);

        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeDisplayOrderAdmin', array(&$order, &$order_items, &$order_history));

        $print = JRequest::getInt("print");
        $order->prepareOrderPrint('order_show');
        $view = $this->getView("orders", 'html');
        $view->setLayout("postlabel");
        $view->assign('config', $jshopConfig);
        $view->assign('order', $order);
        $view->assign('order_history', $order->history);
        $view->assign('order_items', $order_items);
        $view->assign('lists', $lists);
        $view->assign('print', $print);
        $view->assign('config_fields', $config_fields);
        $view->assign('count_filed_delivery', $count_filed_delivery);
        $view->assign('display_info_only_product', $display_info_only_product);
        $view->assign('current_vendor_id', $id_vendor_cuser);
        $view->assign('display_block_change_order_status', $display_block_change_order_status);
        $view->_tmp_ext_discount = '';
        $view->_tmp_ext_shipping_package = '';
$view->assign('stat_download', $stat_download);
        if ($jshopConfig->admin_show_vendors){
            $view->assign('order_vendors', $order_vendors);
        }
        $dispatcher->trigger('onBeforeShowOrder', array(&$view));
        $view->displayShow();
    }
3. В том же файле /administrator/components/com_jshopping/controllers/orders.php в конец файла добавим функцию
Код
    function printPostlabel(){
        JRequest::setVar("print", 1);
        $this->postlabel();
    }

Пару слов о параметрах
$name_f1 - первая строка "от кого"
$name_f2 - вторая строка "от кого"
$addres_f1 - первая строка "от куда"
$addres_f2 - вторая строка "от куда"
$addres_f3 - третья строка "от куда"
$index_f - индекс отправителя
$np1 - параметр на который ставиться чкбокс "наложенный платеж" и заполняется соответствующие поле прописной суммой, сравнивается с названием метода отправки
заголовок бланка берется из метода отправки
чекбоксы можно ставить перед печатью

p.s. если кто нибудь поможет оформить это в качестве плагина, буду благодарен
« Последнее редактирование: 15.04.2016, 14:39:50 от Doctor Death »
*

Doctor Death

  • Захожу иногда
  • 144
  • 1 / 12
внес некоторые исправления в код
*

ArtFrank

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Все сделал как описано выше, но ничего не изменилось? Где должен появиться бланк (кнопка его печати)?
*

Doctor Death

  • Захожу иногда
  • 144
  • 1 / 12
в списке заказов должна появиться вторая кнопка печати
*

ArtFrank

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
А если заказ был сделан без регистрации, кнопка тоже появится?
*

Doctor Death

  • Захожу иногда
  • 144
  • 1 / 12
это неважно
главное чтобы был заказ
*

dizain-master

  • Осваиваюсь на форуме
  • 12
  • 1 / 0
Добрый день, получилось доделать проект?
Нужно что то похожее но в моем бланке - может дадите пару советов. Скайп, аська. Буду благодарен
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

выставление PDF счета (печать счета)

Автор kugaenkoinna

Ответов: 4
Просмотров: 936
Последний ответ 28.11.2017, 18:06:30
от kugaenkoinna
Как добавить в тело письма (orderemail.php) зависимые переменные?

Автор Simple-t

Ответов: 9
Просмотров: 1309
Последний ответ 23.03.2017, 01:18:02
от Simple-t
Сумма заказа в теме письма

Автор timson

Ответов: 7
Просмотров: 1377
Последний ответ 30.05.2016, 10:22:46
от dmitry_stas
Отслеживание почтовых отправление! - Реально ли внедрить в JS если есть скрипт?

Автор aLLex177

Ответов: 35
Просмотров: 9249
Последний ответ 13.06.2015, 20:24:23
от vurazov
Генерация письма с заказом

Автор vaganov

Ответов: 1
Просмотров: 1410
Последний ответ 30.04.2013, 10:13:27
от nevigen