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

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Очень часто структура магазина выглядит примерно так:

категория_товаров_A
--производитель_A
--производитель_B
категория_товаров_B
--производитель_A
--производитель_С

и тд.. Для создания подобной структуры приходится создавать подкатегории-производителей и аккуратно вбивать каждый товар в обе категории. Это очень неудобно, нелогично, усложняет создание магазина.

Именно для решения этих проблем мною был написан модуль, верней только layout (шаблон вывода) к уже готовому модулю. Он позволяет каждую категорию последнего уровня вложенности разбить на эти самые подкатегории-производители, на основе указанного в товаре значения Производитель (manufacturer). К примеру у нас есть категории:
Цитировать
#  Медиаплееры
# Проекторы

Все наши медиаплееры и проекторы мы желаем разбить на производителей. С помощью этого layout'а генерируется следующее меню:
Цитировать
#  Медиаплеры
    * InFocus
    * JVC

# Проекторы
    * InFocus
    * SONY

Лэйаут создает довольно большую нагрузку на сервер, так как делает в каждой категории по запросу, причем довольно тяжелому. Поэтому я использовал схему кэширования. Чтобы она работала, в общих настройках сайта нужно включить кэширование.

Теперь плохие новости... нам придется (снова?) ковырять VirtueMart, так как при запросе нужной категории да еще и производителя  у него башню сносит. Правки маленькие:
1) Помогаем построить верный запрос. Открываем administrator/components/com_virtuemart/html/shop_browse_queries.php, находим в нем код
Код: php
// Filter Products by Category
if( $category_id ) {
if( !empty( $search_this_category ) && (!empty( $keyword ) || !empty( $manufacturer_id ) )) {
$where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
} elseif( empty( $keyword ) && empty( $manufacturer_id )) {
$where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
}
}
и комментируем подстроку && empty( $manufacturer_id ):
Код: php
// Filter Products by Category
if( $category_id ) {
if( !empty( $search_this_category ) && (!empty( $keyword ) || !empty( $manufacturer_id ) )) {
$where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
} elseif( empty( $keyword ) /*&& empty( $manufacturer_id )*/) {
$where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
}
}
2) Делаем опознавательный знак что мы фильтруем по производителю. Открываем рядом файл shop.browse.php. Находим
Код: php
	if( $category_id ) {
/**
   * CATEGORY DESCRIPTION
   */
$browsepage_lbl = $category_name;
и добавляем чуть ниже это:
Код: php
		if ($manufacturer_id) {
$db->query( "SELECT manufacturer_id, mf_name, mf_desc FROM #__{vm}_manufacturer WHERE manufacturer_id='$manufacturer_id'");
$db->next_record();
$browsepage_lbl.= ' [ '.shopMakeHtmlSafe( $db->f("mf_name") ).' ] ';
}

Терь зайдя в медиаплееры и выбрав производителя InFocus в заголовке страницы увидем Медиаплееры [ InFocus ]

Сам модуль в соседней теме http://joomlaforum.ru/index.php/topic,109669.msg713262.html#msg713262
Как добавить layout там описано.

UPD: Обновил лэйаут. Добавил еще аккордион.

[вложение удалено Администратором]
« Последнее редактирование: 28.09.2010, 07:28:43 от danik.html »
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Хехе, супер, Даня! Мега произведение искусства выложено, начнёмс тестировать - см сайт http://muzalliance.ru/
Самое главное, что замысел работает - нажимаешь на подкатегорию/производитель и происходит отбор товаров! После включения кеширования запросы к базе на главной странице упали с 51 до 34.

Вот какие траблы:
1) с кешированием какието глобальные проблемы - почемуто при заходе в подкатегорию периодически полностью пропадает текущая страница :) и при возврате - главная страница тоже пропадает :)
2) после удаления базы и при повторном импорте базы через csv improved - исчезли все товары и категории :) они есть только в админке VirtueMart :) через какое-то время опять появились - глюки
3) при выводе 2х одинаковых модулей не работает почему-то по умолчанию стиль  #manufacturers, на который я поменял #accordion
4) меню не сворачивается - нужно чтото делать с таким большим объемом подкатегорий
5) чтото непонятное творится с модулем Новинки - он отсюда http://joomlaforum.ru/index.php/topic,71309.0.html
вобщем новинки исчезли :)
6) возможно ли совместить аккордеон и мануфактурерс? чтобы они открывались аккордеоном?
7) почемуто во втором модуле с отбором по белому списку отображаются подкатегории из первого модуля ))))

Короче, Дэн, см. сайт - давай разбираться с глюками :)
« Последнее редактирование: 21.09.2010, 22:22:52 от mrhuge »
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Настройки кеша стоят такие:
Включить кеширование     Да
Время кеширования    15 мин.
Обработчик кеша    файл
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
1) траблу не наблюдаю
2) если ты не знал - в этом и состоит эффект кэширования - не делать бд-запросы всякий раз, а брать из кэша. Если чтото поменялось - сбрасываем кэш модуля.
3) #manufacturers никто не обещал )
4) да, меню нельзя заставить свернуться.
5) по новинкам не скажу, не могу представить даже в чем дело. включи отображение ошибок максимальное, мож ошибки посыпятся.
6) можно все, при наличии рук и головы...
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Дак кеш модуля нуно включить? и еще см. пункт 7
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
кеш самого модуля не нужно включать если хотим скрипты и подсветку актива.
при двух копиях модуля будут глюки, я знаю. это надо решать...
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Понятно :) ну в общем за плюс отсутствия кучи категорий пока большая плата :) доработка видимо требуется серьезная.

Короче завтра буду более детально тестировать - надо еще понять что там со ссылками с производителями без ЧПУ, какие сейчас дубли, и какие ссылы вообще будут индексироваться поисковиками. Возможно какие-то ссылы прийдется вручную вырезать. И хотелось бы понять что будет с загрузкой через CSV, в каком порядке будут добавляться новые категории и новые производители.

Такто, Дэниел, ты огромную работу провёл. Сама идея реализована - это мега плюс. Теперь надо вылизывать.

Ну и выглядит этот длиннющий список ссылок конечно страшно, надо чтото с ним делать.
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Ну и кстати можешь подробнее расписать в шапке плюсы какие получаем от юзания модуля? Может там ускорение есть какое-то или оптимизация
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
я так думаю нужно закрывать от индексации ссылки вида */manufacturer/*, так как эти ссылки нужны только юзеру для удобства навигации, а для пс они лишние.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Аха, теперь только понять какой код надо указывать в robots.txt.

Disallow: /*/manufacturer/*/

Так что ли?

P.S. С добрым утром ;D
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
В общем надо решить срочно этот вопрос:

свернуть каким-то образом большое количество производителей в категориях и желательно, чтобы сворачивалось и разворачивалось, не переходя на другую страницу

Если это сделать, можно будет хотя бы начать пользоваться лэйаутом. А потом уже дорабатывать возможности вывода двух модулей и тп

Может можно хотя бы просто класс сделать в CSS такой - который показывается свёрнутым?
« Последнее редактирование: 22.09.2010, 07:49:21 от mrhuge »
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
переделал. ща запрашивает сразу всех производителей двумя запросами. да к тому же еще и кэширует результаты этих запросов. так что теперь с копиями модулей проблем нет. и с большой нагрузкой тоже.

[вложение удалено Администратором]
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
О май гад :) уже :)

Слушай ты там на ядерном топливе функционируешь походу  ;D
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Даник отлично! Только слушай что это за глюк - откуда взялась куча одинаковых производителей в одной и той же категории? http://muzalliance.ru/

Похоже что он из каждого товара подхватил производителя и посчитал это отдельным производителем.
« Последнее редактирование: 22.09.2010, 09:02:34 от mrhuge »
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
И еще можно какнить хакнуть VirtueMart, чтобы при показе категории отфильтрованной по производителю, название производителя было не в [] квадратных скобках а просто?
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
я так думаю нужно закрывать от индексации ссылки вида */manufacturer/*, так как эти ссылки нужны только юзеру для удобства навигации, а для пс они лишние.

если закрыть такие ссылки, тогда не будут индексироваться подкатегории/производители с показом товаров им принадлежащих? если да, то это плохо
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
mrhuge, квадратные скобки можешь заменить на что угодно. Про корень ошибки ты прав, позже исправлю. Про индексацию не понял немного... Фактически подпункты-производители это всеголишь фильтрация товаров, не более. для поисковика думаю это не нужно, он увидит все товары по ссылке категории.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
mrhugeФактически подпункты-производители это всеголишь фильтрация товаров, не более. для поисковика думаю это не нужно, он увидит все товары по ссылке категории.

Да, но есть еще один глюк, если я просто нажимаю на категорию, то все товары не помещаются на одну страницу а при нажатии на ссылку "следующая" или показать #50 вылетает такая ошибка:

Not Found
The requested URL /shop/category/2-sintezatori.html&limitstart=0&limit=50 was not found on this server.

Not Found
The requested URL /shop/category/2-sintezatori.html&limit=20&limitstart=20 was not found on this server.
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
под идее ссылка должна быть /shop/category/2-sintezatori.html?limit=20&limitstart=20
Полагаю глюк VirtueMart. а с роутером from beagler так же было?
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
У меня на другом сайте работает старый роутер - там всё норамльно:

http://mrhuge.webtm.ru/magazin/category/?limit=20&start=20

теперь поставил старый роутер на сайт - и теже глюки
« Последнее редактирование: 22.09.2010, 10:03:48 от mrhuge »
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Слушай, Дэн, еще один маленький глючок: роутер подхватывает производителей в последовательном порядке и, если в следующей категории те же производители, он их сортирует не в алфавитном порядке, а сначала выводит те, которые подхватил в прошлой категории. В итог получается такой алфавитный хаос:
    *   Alesis
    * Korg
    * Roland
    * Roland
    * Roland
    * Roland
    * Roland
    * Roland
    * Roland
    * Roland
    * Sequential Circuits
    * Waldorf
    * Akai
    * ARP
    * ARP
    * Dave Smith Instruments
    * Dave Smith Instruments
    * Dave Smith Instruments
    * Moog Music
    * Moog Music
    * Moog Music
    * Moog Music
    * Moog Music
    * Oberheim
    * Oberheim
    * Oberheim
    * Oberheim
    * Oberheim
    * Studio Electronics
    * Studio Electronics

Сможешь сделать, чтобы выводилось в алфавитном порядке?


Итого пока 3 непоправленные ошибочки:

1) дубли производителей от каждого товара
2) не переключение страниц вывода товаров
3) алфавитный разнобой

Остальное пока работает хорошо:

1) с кешем проблем вроде нет - просто иногда, чтобы сбросить в общих настройках отключаешь его, потом снова включаешь
2) id производителя сбрасывать научились
3) аккордеон в меню работает
4) несколько модулей работает


Кстати я тут сделал небольшой хак - теперь категория вместе с производителем выводится в title и в заголовке h1: http://muzalliance.ru/shop/category/manufacturer/2-sintezatori/9-roland.html
*

skyscraper

  • Захожу иногда
  • 252
  • 47 / 2
у меня с кешированием неправильно прыгает по товарам, тк некоторые товары относятся к нескольким категориям, человек переключаясь в flypage вправо-влево, постоянно попадает на кешированные страницы в другие категории и начинается путаница... =)
*

root-master

  • Осваиваюсь на форуме
  • 48
  • 0 / 0
Молодец, Данил!

При первой возможности отблагодарю за хорошую работу!
В текущей версии ты забыл (скорее по невнимательности) группировать по производителям в запросе, от этого возникают дубли, а так, в целом все нормально работает.
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Дань, слушай, а можно ли как-нибудь сделать такую фишку, что при фильтрации категории по производителю - сверху перед списком товаров выводился логотип и краткое описание производителя. Типа как здесь? http://8not.ru/catalog/keyboard/index.php?cat=1&section=54

Есть мысли как это реализовать возможно? Понятно, что нужно куда-то заносить описание и логотип производителя. Сильно космическое желание?
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Могу подсказать. В админке есть поле описания производителя. остается его только вывести. В том месте где мы в хаке делаем запрос имени производителя (чтобы добавить к заголовку) надо еще добавить в запрос поле mf_desc и отправить в шаблон вирта на вывод. в шабе принять эту переменную и вывести. логотип производителя также засунуть  в его описалово
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

jeka444

  • Захожу иногда
  • 53
  • 1 / 0
а как сделать три столбик как тут на скрине показана а то у меня все вдлину и в один столбик
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
смотря что конкретно нужно. Если нужно просто разбросать все пункты на три колонки то можно и на CSS. Но получится так:
а б в
г д е
ж з и
А если надо так:
a г ж
б д з
в е и
То это сложно, но возможно
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

jeka444

  • Захожу иногда
  • 53
  • 1 / 0
а б в
г д е
ж з и
как сделать
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
а б в
г д е
ж з и
как сделать
Описывалось в теме по самому модулю.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mrhuge

  • Захожу иногда
  • 222
  • 7 / 0
  • http://muzalliance.ru/
Ох, Даня, слушай дал бы мне пару уроков уже по программированию. С чего начать хоть ;D а то вот вроде всё понимаю что сделать и даже куда вставлять - а тыкаюсь как слепой котенок с этими функциями и переменными.

Короче я понял, что в shop_browse_queries.php в твоём хаке надо:
после
Цитировать
$where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
добавить что-то типа
Цитировать
$where_clause[] = "`#__{vm}_product_category_xref`.`mf_desc`=".$manufacturer_desc;

в shop.browse.php надо после
Цитировать
$browsepage_lbl.= ' [ '.shopMakeHtmlSafe( $db->f("mf_name") ).' ] ';
добавить что-то типа
Цитировать
такая-то функция = ' [ '.shopMakeHtmlSafe( $db->f("mf_desc") ).' ] ';
так?

Короче поправь меня пожалуйста децл :)

А подскажешь как описание категории тем же макаром присобачить сверху например до описания производителя? Тогда вообще шик будет!
« Последнее редактирование: 27.09.2010, 18:39:03 от mrhuge »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

IceVmCart - новый бесплатный модуль корзины для VirtueMart

Автор Grig2009

Ответов: 105
Просмотров: 53925
Последний ответ 05.02.2017, 11:44:02
от Super_Panda
Модуль недавно просмотренные товары для VirtueMart 1.1.X

Автор aleks_yug

Ответов: 97
Просмотров: 28031
Последний ответ 25.10.2016, 15:03:07
от Igoritaly
Модуль Cherry Picker for VirtueMart

Автор flintstone

Ответов: 42
Просмотров: 26624
Последний ответ 04.01.2016, 21:25:50
от gleb22
Добавить модуль в товар

Автор Tokyo

Ответов: 2
Просмотров: 2886
Последний ответ 11.05.2015, 20:43:32
от tierex
Усовершенствованный модуль категорий [Аккордион и прочее - the best ;) ]

Автор danik.html

Ответов: 749
Просмотров: 194742
Последний ответ 24.11.2014, 18:37:11
от slavakh