Показ товаров в категории 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. Не успел достаточно это протестировать, возможно эта функция вызывается еще откуда-нибудь. Перед внесением изменений сделайте себе про запас копию оригинальных файлов, которые собираетесь изменить. ;-)

Related Posts with Thumbnails
13.12.2008 • Метки: , • Рубрики: Shop-Script
  • Den
    У себя внес эти изменения все работает.
    Автору большое спасибо!!!!!!
    скрипт самый последней версии, что смог протестил вроже все окей.
    Создателям шоп скрипта стоит этот блок читать до "дыр"
  • Сергей
    Ага. Сортировка в админке тоже, похоже, работает от этой функции -- сначала все с ценой (или с наличием на складе) показываются.
  • Rol
    Срезал ;)

    core_functions\product_functions.php
    ищем строку

    $order_by_clause = "order by sort_order, name";

    меняем на (1065 строка примерно)

    $order_by_clause = "order by in_stock DESC";

    работает ) (правда теперь сортировка в админке до ...)
blog comments powered by Disqus