// Функция возвращает товары
function get_products($ids = null, $categories = null, $brand_id = null, $start_item=null, $filter=null, $hit=null)
{
if (!empty($_GET['desc'])) { $desc = $_GET['desc']; }
else {
$desc = 'ASC'; }
if (!empty($_GET['sort']) && ($_GET['sort']) == 'products.model') { $sort = $_GET['sort']; }
else {
$sort = 'products_variants.price';
}
if (!empty($_REQUEST['min_price']) && is_numeric($_REQUEST['min_price'])) { $min_price = $_REQUEST['min_price']; }
else {
$min_price = '0'; }
if (!empty($_REQUEST['max_price']) && is_numeric($_REQUEST['max_price'])) { $max_price = $_REQUEST['max_price']; }
else {
$max_price = '9999999'; }
$this->smarty->assign('sort', $sort);
$this->smarty->assign('desc', $desc);
$this->smarty->assign('min_price', $min_price);
$this->smarty->assign('max_price', $max_price);
// Если заданы id
$id_filter = '';
if (is_array($ids))
{
foreach ($ids as $k=>$id)
{
$ids[$k]=intval($id);
}
$id_filter = is_null($ids)?"":"AND (products.product_id in(".join($ids, ',')."))";
}
// Если задан бренд, добавляем фильт по бренду
$brand_filter = is_null($brand_id)?"":"AND brands.brand_id = $brand_id";
// Если задан хит, добавляем фильт по хитам
$hit_filter = is_null($hit)?"":"AND products.hit = $hit";
// Если задан бренд, добавляем фильт по бренду
$limit = is_null($start_item)?"":"LIMIT $start_item, $this->items_per_page";
// Фильтр по свойствам
$properties_filter = '';
if($filter)
{
foreach($filter as $property=>$value)
$properties_filter .= sql_placeholder(" AND products.product_id in (SELECT properties_values.product_id FROM properties_values WHERE properties_values.product_id = products.product_id AND properties_values.value=? AND properties_values.property_id=?) ", $value, $property);
}
//С дополнительными категориями
// Если задана категория, добавляем фильт по категории
$category_filter = is_null($categories)?"":"AND ( (categories.category_id in(".join($categories, ',').") ) OR (products_categories.category_id in(".join($categories, ',').") ) )";
$query = "SELECT
products.product_id, products.url, products.category_id, products.brand_id, products.model, products.description, products.body, products.hit, products.order_num, products.small_image, products.large_image, DATE_FORMAT(products.created, '%Y-%m-%d') as created, DATE_FORMAT(products.modified, '%Y-%m-%d') as modified, products.enabled,
brands.name as brand, brands.url as brand_url,
categories.single_name as category, categories.url as category_url, categories.image as category_image, products_variants.sku
FROM products LEFT JOIN categories ON categories.category_id = products.category_id
LEFT JOIN brands ON products.brand_id = brands.brand_id
LEFT JOIN products_categories ON products.product_id = products_categories.product_id
LEFT JOIN products_variants ON products.product_id = products_variants.product_id
WHERE
categories.enabled=1
and products.enabled=1
and products_variants.price>$min_price
and products_variants.price<$max_price
$id_filter $category_filter $brand_filter $properties_filter $hit_filter
GROUP BY products.product_id
ORDER BY $sort $desc
$limit";
$this->db->query($query);
$temp_products = $this->db->results();
foreach($temp_products as $product)
$products[$product->product_id] = $product;
if(is_array($products))
{
$ids = array_keys($products);
// Если пользователь залогиен, применим сразу его скидку к ценам на товар
$discount=isset($this->user->discount)?$this->user->discount:0;
$query = sql_placeholder("SELECT products_variants.*,
products_variants.price*(100-$discount)/100 as discount_price,
products_variants.stock as stock,
products_variants.name as variant_name
FROM products_variants WHERE products_variants.product_id in (?@)
AND products_variants.stock>0 AND products_variants.price>0
ORDER BY products_variants.position", $ids);
$this->db->query($query);
$variants = $this->db->results();
foreach($variants as $variant)
{
if(!empty($products[$variant->product_id]))
{
$products[$variant->product_id]->variants[]=$variant;
}
}
}
return $products;
}