Еще вопрос: в магазине модификации выводятся таблицей вместе с товарами. Если в поле shop_groups_id модификации поставить 0, то при попытке перейти на страницу модификации из общего списка страница открывается нормально. Если же у модификации в поле shop_groups_id стоит id группы их родителя, то при попытке перейти на страницу модификации из общего списка выходит ошибка 404. Как это можно обойти?
HostCMS,
Вы, конечно, правы (как всегда ), и эту задачу вполне можно решить с помощью усложнения запросов к БД. На случай, если кому пригодится, приведу свой способ.
Задача: в каталоге магазина выводить и фильтровать только модификации и товары без модификаций. При этом есть система групп/подгрупп, и если пользователь по ним переходит, то выводить ему модификации и товары, которые "сидят" в своей группе.
Все изменения вносились в код тип.дин.страницы интернет-магазина перед вызовом метода ShowShop.
1. Чтобы модификации участвовали в фильтрации и попадали в xml как самостоятельные товары:
$param['sql_select_modification'] = false;
2. Чтобы отсечь отображение товаров, у которых есть модификации (взято отсюда ):
if (!array_key_exists("sql_external_select", $param))
{ $param['sql_external_select'] = ""; }
$param['sql_external_select'] .= ', COUNT(t2.shop_items_catalog_item_id) as count ';
if (!array_key_exists("sql_from", $param))
{ $param['sql_from'] = ""; }
$param['sql_from'] .= ' LEFT JOIN shop_items_catalog_table as t2 ON shop_items_catalog_table.shop_items_catalog_item_id = t2.shop_items_catalog_modification_id AND t2.shop_items_catalog_is_active = 1 ';
if (!array_key_exists("sql_group_by", $param))
{ $param['sql_group_by'] = ' GROUP BY shop_items_catalog_item_id '; }
if (!array_key_exists("sql_having", $param))
{ $param['sql_having'] = ' HAVING count = 0 '; }
else { $param['sql_having'] .= ' and count = 0 '; }
3. У модификаций группа=0, поэтому при переходе в любую группу из корневой они не выводятся (по умолчанию). Чтобы модификации выводились в той группе, к которой принадлежит их родитель:
if (!array_key_exists("sql_external_select", $param))
{ $param['sql_external_select'] = ""; }
$param['sql_external_select'] .= ', max(shop_items_catalog_table.shop_groups_id) as gr, max(t3.shop_groups_id) as gr3 ';
if (!array_key_exists("sql_from", $param))
{ $param['sql_from'] = ""; }
$param['sql_from'] .= ' LEFT JOIN shop_items_catalog_table AS t3 ON t3.shop_items_catalog_item_id = shop_items_catalog_table.shop_items_catalog_modification_id ';
if (!array_key_exists("sql_having", $param))
{ $param['sql_having'] = ' HAVING (gr IN ('.$in.') or gr3 IN ('.$in.'))'; }
else { $param['sql_having'] .= ' and (gr IN ('.$in.') or gr3 IN ('.$in.')) '; }
$in - строка, в которой через запятую перечислены id групп, например: 600,605,627
$param передается в метод ShowShop.
Тоже набросали своё решение по фильтру, охватывающему модификации товара, но в этом случае модификации - это не самостоятельный товар, а как изначально в hostcms - дочерний элемент. Таким образом, фильтр затрагивает модификации, но в результате выводится соответствующий главный товар. Если кому понадобится -