Нужна функция, которая будет для каждой категории выводить минимальную цену товара в ней.
Желательно, чтобы это значение еще и кэшировалось.
Спасибо.
function fn_get_min_price_in_category($category_id)
{
$min_price = array();
$join = $condition = '';
if (!empty($category_id)) {
$fields = array (
'?:products_categories.category_id',
'?:products_categories.product_id',
'?:product_prices.price', );
$join .= db_quote(
' LEFT JOIN ?:product_prices ON ?:product_prices.product_id = ?:products_categories.product_id');
$join .= db_quote(' LEFT JOIN ?:products ON ?:products.product_id = ?:products_categories.product_id');
$condition .= db_quote(' ?:products_categories.category_id = ?i', $category_id);
$condition .= db_quote(' AND ?:products.status = ?s', "A");
$min_price = db_get_array("
SELECT ?p
FROM ?:products_categories ?p
WHERE ?p",
implode(', ', $fields),
$join,
$condition);
}
$min_price_val_array = array();
if(!empty($min_price)){
foreach($min_price as $data_category){
$min_price_val_array[] = $data_category['price'];
}
}
if(!empty($min_price_val_array)){
$min_price_val = min($min_price_val_array);
}
return $min_price_val;
}
А в шаблоне получить так:
{assign var="min_price" value=$category.category_id|fn_get_min_price_in_category}
Огромное спасибо. Все работает!
Заметил ошибку. Если категория конечная, то минимальная цена расчитывается, если же у категории есть подкатегории, то цена выводит 0. Как исправить?
Еще нужно учесть минимальную цену только тех товаров в категории, у которых кол-во больше 0. Сможете помочь написать правильно функцию?
Попробуйте добавить
$condition .= db_quote(' AND ?:products.amount > 0');
Спасибо!
А как учесть товары в подкатегориях?
Разобрался.
Вот доработанный код, может кому понадобится.
use Tygh\Registry;
function fn_get_min_price_in_category($category_id){
$min_price = array();
$join = $condition = '';
if (!empty($category_id)) {
$fields = array (
'?:products_categories.category_id',
'?:products_categories.product_id',
'?:product_prices.price');
$child_ids = db_get_fields("SELECT a.category_id FROM ?:categories as a LEFT JOIN ?:categories as b ON b.category_id IN (?n) WHERE a.id_path LIKE CONCAT(b.id_path, '/%')", $category_id);
$c_ids = fn_array_merge($category_id, $child_ids, false);
$join .= db_quote(
' LEFT JOIN ?:product_prices ON ?:product_prices.product_id = ?:products_categories.product_id');
$join .= db_quote(' LEFT JOIN ?:products ON ?:products.product_id = ?:products_categories.product_id');
$condition .= db_quote(' ?:products_categories.category_id IN (?n)', $c_ids);
$condition .= db_quote(' AND ?:products.status = ?s', "A");
$condition .= db_quote(' AND ?:products.amount > 0');
$min_price = db_get_array("
SELECT ?p
FROM ?:products_categories ?p
WHERE ?p",
implode(', ', $fields),
$join,
$condition);
}
$min_price_val_array = array();
if(!empty($min_price)){
foreach($min_price as $data_category){
$min_price_val_array[] = $data_category['price'];
}
}
if(!empty($min_price_val_array)){
$min_price_val = min($min_price_val_array);
}
$currency_settings = Registry::get('currencies.' . CART_PRIMARY_CURRENCY);
$min_price_val = sprintf("%.".$currency_settings['decimals']."f", $min_price_val);
return $min_price_val;
}
Тут уже строчкой не обойтись. Направление задали, пробуйте
Предположительно, надо найти все категории у кого стоит родительская категория $category_id которая приходит в функцию.
$cats_array = db_get_fields(“SELECT category_id FROM ?:categories WHERE status = ?s AND parent_id = i?”, ‘A’, $category_id);
Далее вот эту строку
$condition .= db_quote(’ ?:products_categories.category_id = ?i’, $category_id);
Заменить на
$condition .= db_quote(’ ?:products_categories.category_id IN (?n)’, $cats_array);
Где $cats_array - массив категорий
Если требуется еще ниже на уровень, экспериментируйте с id_path
Как не обойтись одной строчкой?
Вот функция меняя параметры можно найти искомую мин. цену, в том числе в категории с учетом примененных фильтров.
function fn_get_min_price_in_category(){
$params = $_REQUEST;
$params['use_caching'] = true;
$params['amount_from'] = 1;
$params['status'] = 'A';
$params['cid'] = $_REQUEST['category_id'];
$params['subcats'] = 'Y';
list($products, $search) = fn_get_products($params, 0 , CART_LANGUAGE);
$min_price_val_array = array();
if(!empty($products)){
foreach($products as $data_category){
$min_price_val_array[] = $data_category['price'];
}
}
if(!empty($min_price_val_array)){
$min_price_val = min($min_price_val_array);
}
$currency_settings = Registry::get('currencies.' . CART_PRIMARY_CURRENCY);
$min_price_val = sprintf("%.".$currency_settings['decimals']."f", $min_price_val);
return $min_price_val;
}