Помогите написать функцию

Нужна функция, которая будет для каждой категории выводить минимальную цену товара в ней.
Желательно, чтобы это значение еще и кэшировалось.
Спасибо.

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;

}

Тут уже строчкой не обойтись. Направление задали, пробуйте :slight_smile:
Предположительно, надо найти все категории у кого стоит родительская категория $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;

}