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

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Рассмотрим для определенности компонент-магазин. В нем есть категории и товары. Товар может одновременно принадлежать двум и более категориям. И тут возникает такая вот дилемма:

Какая должна быть ссылка на этот товар?

Ведь товар A в категории X и товар A в категории Y это две разные страницы, на них будут разные навигационные крошки, разная подсветка активных пунктов меню, ведь так? Следовательно, раз это две разные страницы, то как они могут иметь одну ссылку? Это противоречит здравому смыслу.

Сдругой стороны это противоречит взглядам сеошников. По их мнению пс расценивают эти страницы как дубли.

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

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
Ссылка на товар должна быть только одна (и вообще любой документ должен быть только по одной ссылке)
По сути даже не важно какая -
site.ru/shop/product  или
site.ru/product

Но ни как не такие -
site.ru/category_X/product  ## Здесь, что по первой, что по второй
site.ru/categoty_Y/product   ## ссылке будет один и тот же товар, а это 100% дубль документа

Вот тут например доходчиво можно прочитать о дублях, и еще процитирую
Цитировать
Доступность страницы по разным адресам снижает эффективность взаимодействия поискового робота с сайтом, а также является причиной неверного определения релевантной страницы по её ключевым словам. Избавляйтесь от копий, а если это невозможно, добавляйте канонический тег rel=canonical для потенциальных дублей страниц сайта.

*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
ELLE, как ты предложишь решить проблему?
Можно ли ее решить через canonical ?

И если товар должен иметь один урл, то как передать информацию о категории ?
« Последнее редактирование: 19.03.2012, 21:52:36 от danik.html »
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
я бы не стала ее решать через canonical
допустим имеем страницу с категорией X - site.ru/category_X на ней представлен список товаров с ссылками на карточку товара.
Соответственно страница site.ru/category_X будет ссылаться на site.ru/category_X/product
А страница с категорией Y - site.ru/category_Y на site.ru/category_Y/product
Если мы будем выбирать между этими двумя ссылками на один и тот же товар и укажем на какой-то странице canonical, то толку от второй категории нет.
Или лучше по-другому попробую...если две страницы /category_X и /category_Y будут ссылаться на один и тот же адрес - site.ru/product
то наша карточка товара получит больший вес, нежели если будем использовать каноникал..потому что та вторая страница из выбранных - она нам все равно не нужна, в поиск не попадет, а вот вес забирает.. (и это я в пример взяла только страницу категории, а есть ведь еще модули, типа похожие товары, сопутствующие - тут вообще может получиться что наша продвигаемая карточка никакого веса не получает)

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

Если говорить о хлебных крошках и вообще о том как привязать товар к одной категории, но чтобы при этом товар отображался в двух. Вот допустим если взять связку VM+sh404, то там у меня выходит так - есть список категорий, они идут по очередности, допустим товар находится в категории №3, №18 и в категории №49 - в крошках отображается категория №3, т.е. первая из списка - меня это устраивает, при этом ссылка на товар - site.ru/product.
Еще пример под спойлером, правда сайт на битрикс, но смысл думаю понятен
Спойлер
[свернуть]
« Последнее редактирование: 19.03.2012, 22:57:26 от ELLE »
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Я думаю выводы можно сделать такие:
1) В компоненте должны быть возможность указать "основную" категорию, а так же, при необходимости - дополнительные. Зачем это нужно:
- Для построения ссылки, независимой от "текущей" категории. Тоесть если основная категория X, а Y - дополнительная, то ссылка на товар будет всегда category_X/product_A.html
- Для указания в крошках и подсетки как активной главной категории.
2) Параметр category_id не нужен. При построении ссылки роутер сам выяснит его для товара и построит ссылку. При разборе ссылки этот параметр вообще не нужно восстанавливать, достаточно проконтролировать что восстановленный category_id из алиаса действительно принадлежит товару, иначе выдать 404.
3) В роутере должна быть возможность отключения "вложенного" урла.
4) Желательно в компоненте хранить "текущую" категорию в сессии. Благодаря этому втечение сессии можно добиться правильной подсветки именно текущей категории, а не основной для товара, и соответственно правильных хлебных крошек.

Кто что по этому вопросу думает? Какие моменты могут препятствовать такой схеме работы компонента?
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Мультикатегорийность

Автор NeedHelp

Ответов: 3
Просмотров: 1769
Последний ответ 05.07.2014, 19:35:34
от voland
Google и Yandex выдают странные вещи

Автор StyleRocket

Ответов: 3
Просмотров: 3794
Последний ответ 13.12.2012, 19:17:01
от Maxum