Files
AtomicOld/view/View.php

458 lines
17 KiB
PHP
Raw Normal View History

2026-02-14 19:34:54 +03:00
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Базовый класс для всех View
*
*/
require_once('api/Simpla.php');
class View extends Simpla
{
/* Смысл класса в доступности следующих переменных в любом View */
public $currency;
public $currencies;
public $user;
public $group;
public $page;
/* Класс View похож на синглтон, храним статически его инстанс */
private static $view_instance;
public function __construct()
{
parent::__construct();
// Если инстанс класса уже существует - просто используем уже существующие переменные
if(self::$view_instance)
{
$this->currency = &self::$view_instance->currency;
$this->currencies = &self::$view_instance->currencies;
$this->user = &self::$view_instance->user;
$this->group = &self::$view_instance->group;
$this->page = &self::$view_instance->page;
}
else
{
// Сохраняем свой инстанс в статической переменной,
// чтобы в следующий раз использовать его
self::$view_instance = $this;
// Все валюты
$this->currencies = $this->money->get_currencies(array('enabled'=>1));
// Выбор текущей валюты
if($currency_id = $this->request->get('currency_id', 'integer'))
$_SESSION['currency_id'] = $currency_id;
if($currency_id = $this->request->post('currency_id', 'integer'))
$_SESSION['currency_id'] = $currency_id;
// Берем валюту из сессии
if(isset($_SESSION['currency_id']))
$this->currency = $this->money->get_currency($_SESSION['currency_id']);
// Или первую из списка
else
$this->currency = reset($this->currencies);
// Пользователь, если залогинен
if(isset($_SESSION['user_id']))
{
$u = $this->users->get_user(intval($_SESSION['user_id']));
if($u && $u->enabled)
{
$this->user = $u;
$this->group = $this->users->get_group($this->user->group_id);
}
}
// Текущая страница (если есть)
$subdir = substr(dirname(dirname(__FILE__)), strlen($_SERVER['DOCUMENT_ROOT']));
$page_url = trim(substr($_SERVER['REQUEST_URI'], strlen($subdir)),"/");
if(strpos($page_url, '?') > 0)
$page_url = substr($page_url, 0, strpos($page_url, '?'));
$this->page = $this->pages->get_page((string)$page_url);
$this->design->assign('page', $this->page);
//echo $this->page; print_r($_GET); die;
// Передаем в дизайн то, что может понадобиться в нем
$this->design->assign('currencies', $this->currencies);
$this->design->assign('currency', $this->currency);
$this->design->assign('user', $this->user);
$this->design->assign('group', $this->group);
$this->design->assign('config', $this->config);
$this->design->assign('settings', $this->settings);
// Настраиваем плагины для смарти
$this->design->smarty->registerPlugin("function", "get_posts", array($this, 'get_posts_plugin'));
$this->design->smarty->registerPlugin("function", "get_brands", array($this, 'get_brands_plugin'));
$this->design->smarty->registerPlugin("function", "get_browsed_products", array($this, 'get_browsed_products'));
$this->design->smarty->registerPlugin("function", "get_featured_products", array($this, 'get_featured_products_plugin'));
$this->design->smarty->registerPlugin("function", "get_new_products", array($this, 'get_new_products_plugin'));
$this->design->smarty->registerPlugin("function", "get_discounted_products", array($this, 'get_discounted_products_plugin'));
$this->design->smarty->registerPlugin("function", "get_banners", array($this, 'get_banners_plugin'));
$this->design->smarty->registerPlugin("function", "get_article_categories", array($this, 'get_article_categories_plugin'));
$this->design->smarty->registerPlugin("function", "get_last_articles", array($this, 'get_last_articles_plugin'));
$this->design->smarty->registerPlugin("function", "get_object_articles", array($this, 'get_object_articles_plugin'));
$this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_plugin'));
}
}
/**
*
* Отображение
*
*/
function fetch()
{
return false;
}
/**
*
* Плагины для смарти
*
*/
public function get_banners_plugin($params, &$smarty)
{
if($params['group'])
{
$filter['show_all_pages'] = true;//Обязательный параметр
$filter['group'] = (int)$params['group'];
@$category = $smarty->get_template_vars('category');
@$brand = $smarty->get_template_vars('brand');
@$page = $smarty->get_template_vars('page');
$filter['category'] = !empty($category)?$category->id:'';
$filter['brand'] = !empty($brand) ?$brand->id:'';
$filter['page'] = !empty($page) ?$page->id:'';
list($banners,$count) = $this->banners->get_banners($filter);
foreach($banners as $key=>$value)
$banners[$key]->image = "/".$this->config->banners_images_dir.$banners[$key]->image;
$smarty->assign('banners', $banners);
}
}
public function get_posts_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var']))
$smarty->assign($params['var'], $this->blog->get_posts($params));
}
/**
*
* Плагины для смарти
*
*/
public function get_brands_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var']))
$smarty->assign($params['var'], $this->brands->get_brands($params));
}
public function get_browsed_products($params, &$smarty)
{
if(!empty($_COOKIE['browsed_products']))
{
$browsed_products_ids = explode(',', $_COOKIE['browsed_products']);
$browsed_products_ids = array_reverse($browsed_products_ids);
if(isset($params['limit']))
$browsed_products_ids = array_slice($browsed_products_ids, 0, $params['limit']);
$products = array();
foreach($this->products->get_products(array('id'=>$browsed_products_ids)) as $p)
$products[$p->id] = $p;
$browsed_products_images = $this->products->get_images(array('product_id'=>$browsed_products_ids));
foreach($browsed_products_images as $browsed_product_image)
if(isset($products[$browsed_product_image->product_id]))
$products[$browsed_product_image->product_id]->images[] = $browsed_product_image;
foreach($browsed_products_ids as $id)
{
if(isset($products[$id]))
{
if(isset($products[$id]->images[0]))
$products[$id]->image = $products[$id]->images[0];
$result[] = $products[$id];
}
}
$smarty->assign($params['var'], $result);
}
}
public function get_featured_products_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
$params['featured'] = 1;
if(!empty($params['var']))
{
foreach($this->products->get_products($params) as $p)
$products[$p->id] = $p;
if(!empty($products))
{
// id выбраных товаров
$products_ids = array_keys($products);
// Выбираем варианты товаров
$variants = $this->variants->get_variants(array('product_id'=>$products_ids));
//$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
// Для каждого варианта
foreach($variants as &$variant)
{
// добавляем вариант в соответствующий товар
$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];
}
}
$smarty->assign($params['var'], $products);
}
}
public function get_new_products_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!isset($params['sort']))
$params['sort'] = 'created';
if(!empty($params['var']))
{
foreach($this->products->get_products($params) as $p)
$products[$p->id] = $p;
if(!empty($products))
{
// id выбраных товаров
$products_ids = array_keys($products);
// Выбираем варианты товаров
$variants = $this->variants->get_variants(array('product_id'=>$products_ids));
//$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
// Для каждого варианта
foreach($variants as &$variant)
{
// добавляем вариант в соответствующий товар
$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];
}
}
$smarty->assign($params['var'], $products);
}
}
public function get_discounted_products_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
$params['discounted'] = 1;
if(!empty($params['var']))
{
foreach($this->products->get_products($params) as $p)
$products[$p->id] = $p;
if(!empty($products))
{
// id выбраных товаров
$products_ids = array_keys($products);
// Выбираем варианты товаров
$variants = $this->variants->get_variants(array('product_id'=>$products_ids));
// $variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
// Для каждого варианта
foreach($variants as &$variant)
{
// добавляем вариант в соответствующий товар
$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];
}
}
$smarty->assign($params['var'], $products);
}
}
public function get_products_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var']))
{
foreach($this->products->get_products($params) as $p)
$products[$p->id] = $p;
if(!empty($products))
{
// id выбраных товаров
$products_ids = array_keys($products);
// Выбираем варианты товаров
$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
// Для каждого варианта
foreach($variants as &$variant)
{
// добавляем вариант в соответствующий товар
$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];
}
}
$smarty->assign($params['var'], $products);
}
}
/**
*
* Плагины для смарти
*
*/
public function get_article_categories_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var']))
$smarty->assign($params['var'], $this->articles->get_categories_tree($params));
}
/**
*
* Плагины для смарти
*
*/
public function get_last_articles_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var']))
$smarty->assign($params['var'], $this->articles->get_articles($params));
}
/**
*
* Плагины для смарти
*
*/
public function get_object_articles_plugin($params, &$smarty)
{
$r_articles = array();
if(!isset($params['type']))
$params['type'] = 'product';
if(!empty($params['var']) && !empty($params['id'])){
// Связанные объекты
$related_articles = $this->articles->get_related_articles($params);
if(!empty($related_articles))
{
$r_articles = array();
foreach($related_articles as &$r_p)
$r_articles[$r_p->article_id] = &$r_p;
$temp_articles = $this->articles->get_articles(array('id'=>array_keys($r_articles)));
foreach($temp_articles as $temp_article)
$r_articles[$temp_article->id] = $temp_article;
}
}
$smarty->assign($params['var'], $r_articles);
}
// eto-fix костыль чтоб генерить 404 без редиректа на 404
function force404(){
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REQUEST_URI'] = '/404/';
//session_start();
require_once('view/IndexView.php');
$view = new IndexView();
$_GET['page_url'] = '404';
$_GET['module'] = 'PageView';
print $view->fetch();
}
}