Показ товаров в категории Shop-Script
Во всех магазинах товар имеет свойство заканчиваться. Однако мы все надеемся на лучшее и временно отсутствующий товар с сайта не убираем.
В ShopScript есть 2 пути не дать заказать пользователю отсутствующий товар — включить в разделе «Настройки ->Корзина и оформление заказов» опцию «Вести учет товаров на складе» и тогда в свойствах товара надо будет вести количество по каждой позиции. Второй путь проще: установить товару нулевую цену, тогда ShopScript не будет показывать для этого товара ссылку на добавление в корзину.
Лично я предпочитаю второй путь, он для меня немного проще.
Однако, при показе товаров в категории ShopScript сортирует их по полям sort_order (порядок сортировки) и name (название). Из-за этого отсутствующие товары идут вперемешку с наличиствующими. Хотелось бы наоборот, чтобы те товары, которых в данный момент нет в наличии отображались бы в конце списка и на это не влиял выбор порядка сортировки (по имени, по цене и т.п.). То есть, чтобы все типы сортировок, которые науказывал посетитель применялись к тем товарам, которые можно заказать, а отсутствующие были все равно в конце списка.
Соседи вчера попросили сделать для них такой тип отображения. Чтобы не мучиться, я решил его сделать неотключаемым, просто добавить в запрос к базе данных на выборку товаров из категории еще одно правило. Оно должно быть первым, чтоб было самым главным :-) Вероятно я мог что-то упустить, но, с виду все работает как ожидается. Для сортировки по условию «поле Price равно нулю или нет» я использовал функцию MySQL IF(). Должен получаться вот такой запрос:
SELECT categoryID, name, brief_description, customers_rating, Price, in_stock, customer_votes, list_price, productID, default_picture, sort_order, items_sold, enabled, product_code, description, shipping_freight FROM SS_products WHERE enabled=1 AND categoryID=3 /* Здесь может быть много категорий */ ORDER BY IF(`Price`,1,0) ASC, sort_order, name;
Если используется учет количества товаров, то вместо поля `Price` надо использовать поле `in_stock`, как я понимаю.
За получение списка товаров для показа отвечает функция prdSearchProductByTemplate в файле core_functions/product_functions.php. Функция здоровая, из нее нам нужен кусок, который начинается с:
$order_by_clause = "order by sort_order, name";
Вот эту строчку и всю ересь далее удаляем, вплоть до строчки
$sqlQueryCount = "select count(*) from ".PRODUCTS_TABLE.
Строка выше должна остаться. ;-) Перед ней вставляем вот такой код:
$order_by_clause = "order by IF(`Price`,1,0) DESC, "; if ( isset($callBackParam["sort"]) && in_array($callBackParam["sort"], array( "categoryID", "name", "brief_description", "in_stock", "Price", "customer_votes", "customers_rating", "list_price", "sort_order", "items_sold", "product_code", "shipping_freight") ) ) { $order_by_clause .= $callBackParam["sort"]; if ( isset($callBackParam["direction"]) && $callBackParam["direction"] == "DESC") { $order_by_clause .= " DESC"; } } else { $order_by_clause .= "sort_order, name"; }
Не идеально, но на скорую руку сойдет. Вот и все, собственно. Теперь все товары с нулевой ценой будут в конце списка. Как сделать различие по другоу полю я уже написал.
Attention please. Не успел достаточно это протестировать, возможно эта функция вызывается еще откуда-нибудь. Перед внесением изменений сделайте себе про запас копию оригинальных файлов, которые собираетесь изменить. ;-)
-
Den
-
Сергей
-
Rol



