Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

05.09.2022 10:30
#1
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

В джумшоппинг не совсем корректное определение основной категории товара, на мой взгляд.
Есть метод для товара getCategory. Он отдает id категории, в которой лежит товар. категории все пишутся в одну таблицу, где нет уникальных значений. А в методе идет просто запрос в базу данных и метод loadResult, который возвращает первое значение из всех результатов. В запросе не указана сортировка (она там и не нужна, но для понимания), поэтому сортировка ответов - по умолчанию - то есть по возрастанию. Это приводит к тому, что возвращается наименьший id категории.
Пример: назначаем категории товару. У каждой - id. Допустим id - 3, 5 и 12. Запрос из базы данных вернет самый первый id при сортировке по умолчанию - 3. А если вдруг мы добавим ещё одну категорию и у неё id оказался 2, то у основная категория этого товара изменится на 2. И все урлы на сайте на этот товар изменятся.

Записал на видео https://cloud.mail.ru/public/4gwk/41JntYMYi

В качестве решения этой проблемы предлагаю ввести в товар поле для основной категории. Оно будет использоваться для построения урлов. А остальные категории в товаре будут признаком наличия товара в этих категориях: товар будет в них находиться, но его урл будет формироваться по id основной категории.


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
05.09.2022 11:19
#2
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

getCategory - не используется для создание url

category_id - приходит из запроса

запрос для категории
SELECT prod.product_id, pr_cat.category_id, prod.`name_en-GB` as name FROM `#__jshopping_products` AS prod LEFT JOIN `#__jshopping_products_to_categories` AS pr_cat USING (product_id) LEFT JOIN `#__jshopping_categories` AS cat ON pr_cat.category_id = cat.category_id WHERE prod.product_publish=1 AND cat.category_publish=1 AND prod.access IN (1,2,3,6) AND cat.category_id in (1) GROUP BY prod.product_id ORDER BY pr_cat.product_ordering ASC

запрос для списка всех продуктов

SELECT prod.product_id, pr_cat.category_id, prod.`name_en-GB` as nameFROM `#__jshopping_products` AS prod LEFT JOIN `#__jshopping_products_to_categories` AS pr_cat USING (product_id) LEFT JOIN `#__jshopping_categories` AS cat ON pr_cat.category_id = cat.category_id WHERE prod.product_publish=1 AND cat.category_publish=1 AND prod.access IN (1,2,3,6) AND cat.access IN (1,2,3,6) GROUP BY prod.product_id ORDER BY name ASC

----

В категории будет урл - где будет учытыватся Текущея category_id
(для разных категорий - разный урл)

------

В списке будет урл 1 й попавшийся


Последнее изменение: 05.09.2022 11:21
 
05.09.2022 12:03
#3
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

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


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
05.09.2022 12:07
#4
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Метод getCategory часто используется для построения URL товара в модулях и плагинах. Если при навигации по магазину ещё есть шанс получить верный category_id, то из стороннего расширения остаётся только $product->getCategory().


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
05.09.2022 12:26
#5
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

1. Логика не будет меняться (в идеале товар находится в одной категории, а остальные - как теги должны быть)
2. аддоны могут делать запрос к базе (пример выше)
3. даже если бы и было сделано изменения.
Это не решит проблему.
----
1. создаю товар задаю категории 5,15
url = "product_id=x&category_id=5"

2. изменяю товар задаю категории 15,19
url = "product_id=x&category_id=15"

Решит только часть проблемы
1. создаю товар задаю категории 15
url = "product_id=x&category_id=15"

2. изменяю товар задаю категории 5,15
url = "product_id=x&category_id=15"


Последнее изменение: 05.09.2022 12:35
 
05.09.2022 12:52
#6
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

sergeytolkachyov - 05.09.2022 12:07
Метод getCategory часто используется для построения URL товара в модулях и плагинах. Если при навигации по магазину ещё есть шанс получить верный category_id, то из стороннего расширения остаётся только $product->getCategory().


и там и там берется из базы (без сортировки ~ минимум)

могу getCategory задать сортировку.


Последнее изменение: 05.09.2022 12:52
 
05.09.2022 21:17
#7
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Повторю пример из видео. К примеру, у нас категории:
- Авто (id 1)
- - Лада (ВАЗ) (id 53)
- - Мерседес (id 3)
- Семейные автомобили (id 4)

Здесь смысл категорий не важен )) У меня товар "Лада калина", которая должна быть в основной категории "Лада (ВАЗ)" и в дополнительной категории "Семейные автомобили", потому что это универсал. И здесь же в соседней категории мы продаём Mercedes-Benz All-Terrain E-класса. У него основная категория должна быть "Мерседес" и второстепенная "Семейные автомобили", потому что кузов универсал.
Url Лады калины всегда по всему сайту должен быть: site.com/avto/lada-vaz/lada-kalina
Url Мерседеса E-класса всегда по всему сайту должен быть: site.com/avto/mercedes/mercedes-benz-all-terrain-e-class

Даже когда я перехожу в категорию "Семейные автомобили", я должен увидеть там 2 товара с url
site.com/avto/lada-vaz/lada-kalina и site.com/avto/mercedes/mercedes-benz-all-terrain-e-class соответственно. Эта категория отображает товары как сущности тегов (кстати, com_tags есть же, там всё уже сделано). А значит у меня на сайте не должно быть товара site.com/semeinye-adtomobili/lada-vaz/lada-kalina.. Иначе на сайте возникают кучи дублей товаров, так как они доступны по сути по любым url.

Как это завязано на id категорий (речь о сторонних расширениях).
Если я с помощью $product->getCategory() получаю id категории, то из-за использования $db->loadResult() для Лады Калины будет приходить category_id = 4 (так как он меньше 53), а для Мерседеса category_id = 3 (так как он меньше 4). И в итоге основной категорией для Лады Калины окажется "Семейные автомобили".
Сортировка в SQL-запросе здесь не спасёт ситуацию, так как она изменит приходящие в ответе id, но не изменит логику работы.

Находясь в пределах джумшоппинга может быть и есть шанс получить правильный url (нет, видео в конце поста показывает), но если я вставляю плагином товар(ы) в com_content? Какая-нибудь статья о том "Что подарить мужу на Новый 2023 год"? Такие разделы часто ведутся в магазинах, которые собирают органический трафик по инфо-запросам. И там будет ссылка на товар с неверным по смыслу url. Да, он будет открываться, но по логике вещей товар должен находится совершенно в другом месте. А потом я вдруг решил создать новую категорию "Универсалы", убрать из "семейных" калину. У новой категории id будет 240 и тогда все ссылки на этот товар по всему сайту изменятся на то, что нужно было в самом начале, так как 53 меньше 240.

Решением проблемы может быть (имхо) лишь добавление отдельного поля в админке в форму редактирования/создания товара для указания основной (канонической) категории товара и коррекция структуры базы данных.

Вариант 1-й - добавить столбец category_id в #__jshopping_products. Туда пишем каноническую категорию, остальные (или все, не так важно) пишем как писали в #__jshopping_products_to_categories.
Вариант 2-й - добавить столбец в #__jshopping_products_to_categories что-то вроде canon_category или main_category, куда пишется каноническая категория, остальные - как было. И соответственно в моделях и Tables проверять наличие этого признака.
1-й вариант удобнее при обновлении: можно юзеру показать кнопку в админке и описание проблемы, а в php-скрипте циклом пройтись по всем товарам, брать тот же $product->getCategory и писать в таблицу товаров. Ситуация на фронте сайта сохранится та же самая, что и до обновления. Поле в этом столбце не должно быть пустым. Если товаров несколько (десятков) тысяч, то можно разбивать их на порции и постепенно обрабатывать, делая выборку товаров, где до сих пор пустое поле нового столбца.
Со вторым вариантом хранения id основной категории мне это видится сложнее. Но это уже детали реализации.

Видео про дубли товаров https://cloud.mail.ru/public/VvHM/5mZK8LNk3


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
05.09.2022 22:03
#8
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Думаю добавим в новой версии (5.х) как опцию

Можно будет выбрать как создавать урл для категорий
1. ТекущаяКат/Product
2. ОсновнаяКат/Product


Последнее изменение: 05.09.2022 22:10
 
13.09.2022 12:00
#9
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

https://www.webdesigner-profi.de/joomla-webdesign/joomla-shop/downloads/betaversion.html
Component Joomshopping 5.1.0 A1

configuration / Other config

Use main category for product

 
13.09.2022 15:37
#10
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Протестировал на мультиязе - вроде нормально. Спасибо!


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
13.09.2022 15:42
#11
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

А есть какой-нибудь условный гитхаб джумшоппинга?


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
13.09.2022 16:00
#12
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25904
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Git есть но он Не публичный.

 
14.09.2022 08:33
#13
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: Метод getCategory - определение (и фиксация) основной категории товара и мультикатегорийность

Ок, понятно.


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 


Copyrights MAXXmarketing GmbH. Alle Rechte vorbehalten
Durch die Nutzung dieser Website stimme ich zu, dass Cookies zur optimalen Gestaltung der Website sowie zur Analyse der Nutzung der Website verwendet werden. Weiterführende Informationen finden Sie hier. OK, einverstanden.