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

TenderWinner

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Такая проблема, хочется чтобы не надо было вводить артикул а он скажем брал максимум от всех артикулов в базе и ставил новому продукту максимум+1, есть может у кого хак или другое предложение толковое?
*

warlocksp

  • Завсегдатай
  • 1198
  • 17 / 4
Такая проблема, хочется чтобы не надо было вводить артикул а он скажем брал максимум от всех артикулов в базе и ставил новому продукту максимум+1, есть может у кого хак или другое предложение толковое?

Адрес форума: http://joomlaforum.ru/index.php?topic=20865.0

Нужно сделать следующие:

В файле: administrator\components\com_virtuemart\classes\ps_product.php

Нужно заменить:

if (empty( $d["product_sku"])) {
   $vmLogger->err( $VM_LANG->_('VM_PRODUCT_MISSING_SKU',false) );
   $valid = false;
}

Заменить на:

if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

Проблема решина...
Мудр не тот, кто знает много, а тот, чьи знания полезны. Эсхил
*

TenderWinner

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Спасибо, попробую, ато приходилось блин самому из базы максимальное значение доставать и 1 прибавлять :)
*

TenderWinner

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Немного изменил решение, чтобы артикулы шли по порядку, сделал так:

if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

У себя сделал константно jos_vm_product.
*

bato

  • Осваиваюсь на форуме
  • 49
  • 2 / 0
  • Пашу как папа Карло

У себя сделал константно jos_vm_product.

не совсем понятно что означает
*

Timer

  • Захожу иногда
  • 109
  • 1 / 1
Немного изменил решение, чтобы артикулы шли по порядку, сделал так:

if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}


при таком раскладе у меня больше 10 артикул не добавляется.. все последующие ставятся 10 и само собой товар с одним артикулом не добавляется
*

xTMx

  • Захожу иногда
  • 145
  • 4 / 0
+1 актуально. вшие 10ти артикул не идет. сам не допер чото  где ошибка. вроде логично всё
*

antfrolov

  • Захожу иногда
  • 83
  • 2 / 2
РЕШЕНИЕ НЕ РАБОТАЕТ! VM 1.1.X Joomla 1.5.18
У меня везде пишет артикул 1. Таким образом набирается несколько товаров с артикулом 1. При редактировании информации о товаре пишет что товар с таким артикулом существует. (их уже 4 существовало на тот момент :))
*

antfrolov

  • Захожу иногда
  • 83
  • 2 / 2
РАБОЧЕЕ РЕШЕНИЕ:
В файле: administrator\components\com_virtuemart\classes\ps_product.php

Нужно заменить:

if (empty( $d["product_sku"])) {
   $vmLogger->err( $VM_LANG->_('VM_PRODUCT_MISSING_SKU',false) );
   $valid = false;
}

Заменить на:
 if (empty( $d["product_sku"])) {
      $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
           $db->query( $q );
           $db->next_record();
         $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
         $d['product_sku'] =  $list_sku;
         $valid = true;
    }

Взято отсюда http://joomlaforum.ru/index.php/topic,20865.0.html
*

GrayHunter

  • Захожу иногда
  • 64
  • 1 / 0
Попробовал последний вариант - вроде работает. Спасибо, а то замучился бы с этим артиклем )
*

IND

  • Новичок
  • 8
  • 0 / 0
привет всем.
а как бы сделать так чтоб ещё имя производителя перед артикулом добавлялось ? и выглядело бы это потом например так
Производитель-14897298341
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
по идее
Код
if (empty( $d["product_sku"])) {
      $q = "SELECT mf_name FROM #__{vm}_manufacturer WHERE manufacturer_id=".$manufacturer_id;
           $db->query( $q );
           $db->next_record();
$mf_name=$db->mf_name;
      $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
           $db->query( $q );
           $db->next_record();
         $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
         $d['product_sku'] =  $mf_name.'-'.$list_sku;
         $valid = true;
    }

как-то так...
*

GrayHunter

  • Захожу иногда
  • 64
  • 1 / 0
не работает так. Пишет просто "-583290588".

Вообще, мне бы в артике хотелось бы так: "id_производителя - артикул"

Помогите пожалуйста.
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
тогда должно быть проще:
Код
if (empty( $d["product_sku"])) {
      $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
           $db->query( $q );
           $db->next_record();
         $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
         $d['product_sku'] =  $d['manufacturer_id'].'-'.$list_sku;
         $valid = true;
    }

в предыдущем коде была ошибка - во второй стороке вместо $manufacturer_id нужно $d['manufacturer_id'], писал по памяти - ошибся.
*

GrayHunter

  • Захожу иногда
  • 64
  • 1 / 0
Работает. Спасибо.

А может Вы подскажете как вывести название производителя в confirmation_email.tpl.php ? Моих знаний не хватает. :(
*

IND

  • Новичок
  • 8
  • 0 / 0
тогда должно быть проще:
Код
if (empty( $d["product_sku"])) {
      $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
           $db->query( $q );
           $db->next_record();
         $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
         $d['product_sku'] =  $d['manufacturer_id'].'-'.$list_sku;
         $valid = true;
    }

в предыдущем коде была ошибка - во второй стороке вместо $manufacturer_id нужно $d['manufacturer_id'], писал по памяти - ошибся.
спасибо большое !!
*

Biomech

  • Осваиваюсь на форуме
  • 19
  • 0 / 0
Хм, странно, а у меня почему то выводит артикулы случайным образом. А как сделать, чтобы они допустим начинались с 100000.
Количество знаков уменьшил, но каждый раз при создании, почему то идут не подряд.
*

aslanamirov

  • Захожу иногда
  • 87
  • 4 / 0
  • Ййехаа!
Немного изменил решение, чтобы артикулы шли по порядку, сделал так:

if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

У себя сделал константно jos_vm_product.

Спасибо. Как и хотел чтоб по порядку и не задумываться о его вводе. Спасибо! VirtueMart у меня 1.1.4
*

stepcool

  • Новичок
  • 7
  • 1 / 0
тогда должно быть проще:
Код
if (empty( $d["product_sku"])) {
      $q = "SELECT MAX(product_id) AS product_id FROM #__{vm}_product";
           $db->query( $q );
           $db->next_record();
         $list_sku = intval($db->f("product_id"))+rand(intval($db->f("product_id")), 999999999);
         $d['product_sku'] =  $d['manufacturer_id'].'-'.$list_sku;
         $valid = true;
    }

в предыдущем коде была ошибка - во второй стороке вместо $manufacturer_id нужно $d['manufacturer_id'], писал по памяти - ошибся.

У меня заработало это решение. VirtueMart 1.1.8. В поле артикул добавилось 5-766021748. 5 это id производителя, а 766021748 - простой набор цифр.  ^-^
*

lottis

  • Захожу иногда
  • 181
  • 11 / 0
спасибо код работает прекрасно!
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Немного изменил решение, чтобы артикулы шли по порядку, сделал так:

if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

У себя сделал константно jos_vm_product.

Подскажите как сделать чтобы следующее значение артикула ставилось по шаблону, например 0000083, 0000084 и т.д.
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Помогите пожалуйста решить проблему, автоматически артикул присваивается только до 100 включительно, 101, 102 и т.д. не ставится. Может где-то ошибка в коде? В итоге у меня создается несколько товаров с артикулом 100, соответственно из них на сайте отображается только один  :(
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Прошу повторно, поиск не дал результатов, а проблема имеет место быть.
*

tagilnext

  • Захожу иногда
  • 71
  • 2 / 0
У кого не работает этот код:

Код
if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

или артикул идет только до 10, нужно изменить тип поля product_sku с VARCHAR на int установить длину поля с 64 на вашу и по умолчанию сделать - нет.
После этого все работает.
*

TULLIVER

  • Осваиваюсь на форуме
  • 26
  • 6 / 0
А по подробнее можно, а то не совсем понятно где менять тип поля и длину!
*

TULLIVER

  • Осваиваюсь на форуме
  • 26
  • 6 / 0
Цитировать
tagilnext

Спасибо огромно, низкий поклон тебе друг, реально помогло!
не могу понять где тут плюсик ставить!
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
У кого не работает этот код:

Код
if (empty( $d["product_sku"])) {
        $q = "SELECT MAX(product_sku) AS product_sku FROM #__{vm}_product";
        $db->query( $q );
        $db->next_record();
        $list_sku = intval($db->f("product_sku"))+1;
        $d['product_sku'] =  $list_sku;
        $valid = true;
}

или артикул идет только до 10, нужно изменить тип поля product_sku с VARCHAR на int установить длину поля с 64 на вашу и по умолчанию сделать - нет.
После этого все работает.

Не понял где это все менять, расскажите пожалуйста подробнее.
*

TULLIVER

  • Осваиваюсь на форуме
  • 26
  • 6 / 0
Цитировать
product_sku с VARCHAR на int установить длину поля с 64 на вашу и по умолчанию сделать - нет.

phpmyadmin -> выбераете базу -> выбераете таблицу -> сверху выбераете структура -> напротив нужного поля изменить - > в типе ставите int, значение длина 11( это говорит что максимальное число будет состоять из 11 символов например 99999999999, я думаю этого хватит с запасом ) по умолчанию ставите нет.

готово
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
phpmyadmin -> выбераете базу -> выбераете таблицу -> сверху выбераете структура -> напротив нужного поля изменить - > в типе ставите int, значение длина 11( это говорит что максимальное число будет состоять из 11 символов например 99999999999, я думаю этого хватит с запасом ) по умолчанию ставите нет.
готово

Спасибо за ответ, все работает! +1
*

andalit

  • Новичок
  • 4
  • 0 / 0
а нельзя в базе просто сделать Auto incr ?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как вывести в корзине заказа VirtueMart вес заказанного товара в кг?

Автор pavel55

Ответов: 1
Просмотров: 3000
Последний ответ 27.07.2015, 17:46:17
от BHy4eK
VirtuemartCare. Сервисный компонент для VirtueMart.

Автор beagler

Ответов: 73
Просмотров: 17275
Последний ответ 08.05.2015, 20:56:47
от beagler
Модуль "VirtueMart Currency Selector". Как устанавливать курс.

Автор MOHCTPUK

Ответов: 58
Просмотров: 42745
Последний ответ 06.05.2015, 11:07:45
от One
Массовое изменение цен в VirtueMart. Что я делаю не так?

Автор Naima

Ответов: 15
Просмотров: 9913
Последний ответ 12.03.2015, 17:41:10
от mrspm
Добавление параметров атрибута

Автор Afelua

Ответов: 1
Просмотров: 1408
Последний ответ 28.11.2013, 16:30:10
от fsv