Files
AtomicOld/view/ProductsView.php
2026-02-14 19:34:54 +03:00

470 lines
17 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?PHP
if(strpos($_SERVER['REQUEST_URI'], '?page=') !== false || isset($_GET['keyword'])){
Header( "HTTP/1.1 301 Moved Permanently" );
$url = $_GET['page'] != 1 ? 'page-' . $_GET['page'] . '/' : '';
$u = explode('?', $_SERVER['REQUEST_URI']);
Header( "Location: " . $u[0]. $url );
die;
}
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблон products.tpl
*
*/
require_once('View.php');
class ProductsView extends View
{
/**
*
* Отображение списка товаров
*
*/
public $perPageCustom = 25;
function fetch()
{
// Категории товаров
$this->design->assign('categories', $this->categories->get_categories_tree());
require_once($_SERVER['DOCUMENT_ROOT'] . '/mobiledetect/Mobile_Detect.php');
$detect = new Mobile_Detect;
$this->design->assign('detect', $detect);
// GET-Параметры
$category_url = $this->request->get('category', 'string');
$brand_url = $this->request->get('brand', 'string');
$order = $this->request->get('order', 'string');
//echo '--' . $category_url . '--';die;
$filter = array();
$filter['visible'] = 1;
$seobrand = 0;
if($brand_url && $category_url){
$this->design->assign('rel_canonical', '/catalog/' . $category_url . '/');
}
// Если задан бренд, выберем его из базы
if (!empty($brand_url))
{
$brand = $this->brands->get_brand((string)$brand_url);
if (empty($brand))
return false;
$this->design->assign('brand', $brand);
$seobrand = $brand;
$filter['brand_id'] = $brand->id;
$this->design->assign('meta_title', 'Товары для тюнинга '.$brand->name . ' в Санкт-Петербурге');
$this->design->assign('meta_description', 'В продаже товары для тюнинга автомобилей '.$brand->name . ' - тюнинг центр Atomic Garage');
$this->design->assign('meta_keywords', 'товары, '.$brand->name . ', тюнинг центр, авто, автомобиль, фары, оптика, санкт-петербург, продажа, установка, замена, ремонт');
}
// Если выбран бренд из фильтра
if($brand = $this->request->get('b'))
$filter['brand_id'] = $brand;
// Выберем текущую категорию
if (!empty($category_url))
{
$category = $this->categories->get_category((string)$category_url); //print_r($category);die;
if (empty($category) || (!$category->visible && empty($_SESSION['admin']))) return false;
//
if($category->category_h1 == '' ){
$category->category_h1 = $category->name;
}
$this->design->assign('category', $category);
$filter['category_id'] = $category->children;
/*if(isset($_GET['page']) && $_GET['page'] && $category->id == 24){
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
Header( "Location: /404/" );
die;
}*/
}
$filterForMinPrice = $filter;
if($order == 'views') $filter['sort'] = $order;
//print_r($filter);
// Цена от ... до....
$prices = array();
$priceproducts = array();
foreach($this->products->get_products($filter) as $p)
$priceproducts[$p->id] = $p;
$price_products_ids = array_keys($priceproducts);
//uuset($priceproducts);
$prices = (array)$this->variants->prices_range(array('product_id'=>$price_products_ids));
$prices['current_min_price'] = $this->request->get('min_price');
$prices['current_max_price'] = $this->request->get('max_price');
if(!isset($prices['current_min_price']) && empty($prices['current_min_price']))
$prices['current_min_price'] = $prices['min'];
if(!isset($prices['current_max_price']) && empty($prices['current_max_price']))
$prices['current_max_price'] = $prices['max'];
$this->design->assign('prices', $prices);
$filter['min_price'] = $prices['current_min_price'];
$filter['max_price'] = $prices['current_max_price'];
// Если задано ключевое слово
$keyword = $this->request->get('keyword');
if (!empty($keyword))
{
$this->design->assign('keyword', $keyword);
$filter['keyword'] = $keyword;
}
// Сортировка товаров, сохраняем в сесси, чтобы текущая сортировка оставалась для всего сайта
if($sort = $this->request->get('sort', 'string'))
$_SESSION['sort'] = $sort;
if (!empty($_SESSION['sort']))
$filter['sort'] = $_SESSION['sort'];
else
$filter['sort'] = 'position';
if($order == 'views') $filter['sort'] = $order;
$this->design->assign('sort', $filter['sort']);
if($order) $this->design->assign('sort_order', $order);
// Свойства товаров
if(!empty($category))
{
$features = array();
foreach($this->features->get_features(array('category_id'=>$category->id, 'in_filter'=>1)) as $feature)
{
$features[$feature->id] = $feature;
if(($val = strval($this->request->get($feature->id)))!='')
$filter['features'][$feature->id] = $val;
}
$options_filter['visible'] = 1;
$features_ids = array_keys($features);
if(!empty($features_ids))
$options_filter['feature_id'] = $features_ids;
$options_filter['category_id'] = $category->children;
if(isset($filter['features']))
$options_filter['features'] = $filter['features'];
if(!empty($brand))
$options_filter['brand_id'] = $brand->id;
$options = $this->features->get_options($options_filter);
foreach($options as $option)
{
if(isset($features[$option->feature_id]))
$features[$option->feature_id]->options[] = $option;
}
foreach($features as $i=>&$feature)
{
if(empty($feature->options))
unset($features[$i]);
}
$this->design->assign('features', $features);
}
// Постраничная навигация
$items_per_page = $this->settings->products_num;
// Текущая страница в постраничном выводе
$current_page = $this->request->get('page', 'int');
// Если не задана, то равна 1
$current_page = max(1, $current_page);
$this->design->assign('current_page_num', $current_page);
// Вычисляем количество страниц
$products_count = $this->products->count_products($filter);
if($category->from_subs){
$items_per_page = $this->perPageCustom;
$products_count = count( $this->getFromSubCatecories($category->id, true) );
}
// Показать все страницы сразу
if($this->request->get('page') == 'all')
$items_per_page = $products_count;
$pages_num = ceil($products_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);
//echo $pages_num;die;
if($current_page > $pages_num){
/* header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
Header( "Location: /404/" );
die;*/
if($pages_num) $this->force404();
}
$filter['page'] = $current_page;
$filter['limit'] = $items_per_page;
///////////////////////////////////////////////
// Постраничная навигация END
///////////////////////////////////////////////
$discount = 0;
if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))
$discount = $user->discount;
// Товары
$products = array();
if($order == 'min_price' || $order == 'max_price'){
$filter['nolimit'] = 1;
if($category->id == 246 || $category->id == 15) $products = $this->getFromSubCatecories($category->id);
else foreach($this->products->get_products($filter) as $p) $products[$p->id] = $p;
$products = $order == 'min_price' ? $this->sortByMinPrice($products, $filter) : $this->sortByMaxPrice($products, $filter);
}else{
foreach($this->products->get_products($filter) as $p) $products[$p->id] = $p;
//if($category->id == 246 || $category->id == 15) $products = $this->getFromSubCatecories($category->id, true);
if($category->from_subs) $products = $this->getFromSubCatecories($category->id);
}
// Если искали товар и найден ровно один - перенаправляем на него
if(!empty($keyword) && $products_count == 1)
header('Location: '.$this->config->root_url.'/products/'.$p->url);
if(!empty($products))
{
$products_ids = array_keys($products);
foreach($products as &$product)
{
$product->variants = array();
$product->images = array();
$product->properties = array();
}
//$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
$variants = $this->variants->get_variants(array('product_id'=>$products_ids));
foreach($variants as &$variant)
{
//$variant->price *= (100-$discount)/100;
$products[$variant->product_id]->variants[] = $variant;
}
$images = $this->products->get_images(array('product_id'=>$products_ids));
foreach($images as $image)
$products[$image->product_id]->images[] = $image;
foreach($products as &$product)
{
if(isset($product->variants[0]))
$product->variant = $product->variants[0];
if(isset($product->images[0]))
$product->image = $product->images[0];
}
/*
$properties = $this->features->get_options(array('product_id'=>$products_ids));
foreach($properties as $property)
$products[$property->product_id]->options[] = $property;
*/
$this->design->assign('products', $products);
}
$minPrice = $this->getMinPrice($filterForMinPrice);
// Выбираем бренды, они нужны нам в шаблоне
if(!empty($category))
{
$brands = $this->brands->get_brands(array('category_id'=>$category->children));
$category->brands = $brands;
}
// Устанавливаем мета-теги в зависимости от запроса
if($this->page && isset($this->page->meta_title))
{ //print_r($this->page); die;
$this->design->assign('meta_title', $this->page->meta_title);
$this->design->assign('meta_keywords', $this->page->meta_keywords);
$this->design->assign('meta_description', $this->page->meta_description);
}
elseif(isset($category))
{
$title = $category->meta_title;
$desc = $category->meta_description;
$keys = $category->meta_keywords;
$lowerName = htmlspecialchars(mb_strtolower($category->name, 'utf-8'));
//include $_SERVER['DOCUMENT_ROOT'].'/view/meta.php'; //// автометы для разделов
if(!$title) $title = '' . $category->name . ' в Санкт-Петербурге | Тюнинг центр Atomic Garage';
if(!$desc && $minPrice != 0) $desc = $category->name . ' - купить в Санкт-Петербурге по цене от '. number_format($minPrice, 0, '', ' ') .' руб. | Низкие цены, большой выбор, доставка по всей России - Интернет-магазин товаров для автомобиля Atomic Garage, +79219589100, +79219589200.';
if(!$desc && $minPrice == 0) $desc = $category->name . ' - купить в Санкт-Петербурге | Низкие цены, большой выбор, доставка по всей России - Интернет-магазин товаров для автомобиля Atomic Garage, +79219589100, +79219589200.';
if(!$keys) $keys = $lowerName . ', купить, для автомобиля, авто, санкт-петербург, россия, доставка, цена, установка, тюнинг центр, линзы, оптика, фары, фонари, птф';
$spage = '';
//if(isset($current_page) && $current_page > 1){
//$spage = ' страница № '.$current_page;
//}
$this->design->assign('meta_title', $title.$spage);
$this->design->assign('meta_keywords', $keys.$spage);
$this->design->assign('meta_description', $desc.$spage);
}
elseif(isset($brand))
{
$this->design->assign('meta_title', $brand->meta_title);
$this->design->assign('meta_keywords', $brand->meta_keywords);
$this->design->assign('meta_description', $brand->meta_description);
}
elseif(isset($keyword))
{
$this->design->assign('meta_title', $keyword);
}
// echo '<!--'; print_r ((int)isset($keyword)); echo '-->';
// echo '<!--'; var_dump ($seobrand); echo '-->';
if(!$this->page && !isset($category) && !isset($brand) && !isset($keyword) && !$seobrand){ //echo '<!--'; var_dump (isset($keyword)); echo '-->';
$this->design->assign('meta_title', 'Все товары для тюнинга авто');
$this->design->assign('meta_keywords', 'все товары, автомобиль, авто, тюнинг центр, atomic garage');
$this->design->assign('meta_description', 'Товары для тюнинга автомобильной оптики в тюнинг центре Atomic Garage в Санкт-Петербурге');
}
/* if($_SESSION['admin']){
var_dump($category->path[2]->id);
} */
///var_dump($products);
$this->body = $this->design->fetch('products.tpl');
return $this->body;
}
function getMinPrice($filter){
$filter['sort'] = 'price';
$filter['limit'] = 1;
$products = $this->products->get_products($filter);
if(empty($products[0])) return 0;
$minPrice = 0;
$variants = $this->variants->get_variants(array('product_id'=>$products[0]->id));
foreach($variants as $row){
if($minPrice == 0 || $minPrice > $row->price) $minPrice = $row->price;
}
return $minPrice;
}
function sortByMinPrice($products, $filter){
$products = $this->setMinMaxPrices($products);
usort($products, '_usort_ByMinPrice');
return $this->setSortPagination($products, $filter);
}
function sortByMaxPrice($products, $filter){
$products = $this->setMinMaxPrices($products);
usort($products, '_usort_ByMaxPrice');
return $this->setSortPagination($products, $filter);
}
function setSortPagination($_products, $filter = array()){
$products = array();
foreach($_products as $row) $products[$row->id] = $row;
$count = count($products);
$onPage = !empty($filter['limit']) ? $filter['limit'] : 50;
$this->design->assign('total_pages_num', ceil($count / $onPage) );
$start = isset($_GET['page']) ? ($_GET['page'] - 1) * $onPage : 0;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$this->design->assign('current_page_num', $page );
$products = array_slice($products, $start, $onPage, true);
return $products;
}
function setMinMaxPrices($products){
$products_ids = array_keys($products);
$variants = $this->variants->get_variants(array('product_id'=>$products_ids));
foreach($products as &$row){
$row->minPrice = $row->maxPrice = 0;
foreach($variants as $var){
if($var->product_id != $row->id) continue;
if($var->price != 0 && ( $var->price < $row->minPrice || $row->minPrice == 0) ) $row->minPrice = $var->price;
if($var->price != 0 && $var->price > $row->maxPrice) $row->maxPrice = $var->price;
}
}
return $products;
}
function getFromSubCatecories($cid, $returnAll = false){
$all = $this->getSubCategories($cid);
$res = mysql_query("SELECT * FROM `s_products_categories` WHERE `category_id` IN(".implode(',', $all).") ");
$ids = $products = array();
while($row = mysql_fetch_assoc($res)) $ids[] = $row['product_id'];
$res = mysql_query("SELECT * FROM `s_products` WHERE `id` IN(".implode(',', $ids).") AND `visible`=1 ORDER BY `position`");
while($row = mysql_fetch_assoc($res)) $products[$row['id']] = (object)$row;
if($returnAll) return $products;
$count = count($products);
$onPage = $this->perPageCustom;
$this->design->assign('total_pages_num', ceil($count / $onPage) );
$start = isset($_GET['page']) ? ($_GET['page'] - 1) * $onPage : 0;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$this->design->assign('current_page_num', $page );
$products = array_slice($products, $start, $onPage, true);
return $products;
}
function getSubCategories($parent_id, $all = array()){
$res = mysql_query("SELECT * FROM `s_categories` WHERE `parent_id`='$parent_id' AND `visible`=1");
if(!mysql_num_rows($res)) return $all;
while($row = mysql_fetch_assoc($res)){
$all[] = $row['id'];
$all = $this->getSubCategories($row['id'], $all);
}
return $all;
}
}
function _usort_ByMinPrice($a, $b){
if($a->minPrice == $b->minPrice)return 0;
return ($a->minPrice > $b->minPrice) ? 1 : -1;
}
function _usort_ByMaxPrice($a, $b){
if($a->minPrice == $b->minPrice)return 0;
return ($a->minPrice > $b->minPrice) ? -1 : 1;
}