This commit is contained in:
Alan
2026-02-14 19:34:54 +03:00
commit 5c3329238b
867 changed files with 214778 additions and 0 deletions

243
view/.htaccess Normal file
View File

@@ -0,0 +1,243 @@
AddDefaultCharset UTF-8
ErrorDocument 404 /404
ErrorDocument 401 /password.php
RewriteEngine on
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value memory_limit 128M
RewriteCond %{THE_REQUEST} //
# Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
# Убедимся что это не урл в GET
RewriteRule .* /$0 [R=301,L]
# Исключаем все лишние слеши.
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_URI} !(.*)/$
#RewriteRule ^(.*[^/])$ $1/ [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !atomicgarage\.ru [NC]
RewriteRule ^(.*)$ https://atomicgarage.ru/$1 [L,R=301]
RewriteRule ^index.html$ / [L,R=301]
RewriteRule ^aktsii/(.*)$ /actions/$1 [L,R=301]
#RewriteRule ^sitemap/?$ site_map.php [L,QSA]
# RewriteRule ^/nashi-raboty/mercedes-benz/cls%d0%ba%d0%bb%d0%b0%d1%81%d1%81/$ /nashi-raboty/mercedes-benz/clsclass/ [L,R=301]
RewriteRule ^nashi-raboty/mercedes-benz/clsкласс/$ /nashi-raboty/mercedes-benz/clsclass/ [L,R=301]
RewriteRule ^nashi-raboty/mercedes-benz/claкласс/$ /nashi-raboty/mercedes-benz/claclass/ [L,R=301]
RewriteRule ^catalog/angelskie-glazki-na-mazda/mazda/$ /catalog/angelskie-glazki-na-mazda/ [L,R=301]
RewriteRule ^catalog/angelskie-glazki-na-renault/renault/$ /catalog/angelskie-glazki-na-renault/ [L,R=301]
RewriteRule ^catalog/angelskie-glazki-na-volkswagen/volkswagen/$ /catalog/angelskie-glazki-na-volkswagen/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-volkswagen/volkswagen/$ /catalog/shtatnye-hodovye-ogni-volkswagen/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-renault/renault/$ /catalog/shtatnye-hodovye-ogni-renault/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-hyundai/hyundai/$ /catalog/shtatnye-hodovye-ogni-hyundai/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-audi/AUDI/$ /catalog/shtatnye-hodovye-ogni-audi/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-mazda/mazda/$ /catalog/shtatnye-hodovye-ogni-mazda/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-mercedes-benz/mercedes-benz/$ /catalog/shtatnye-hodovye-ogni-mercedes-benz/ [L,R=301]
RewriteRule ^catalog/shtatnye-hodovye-ogni-toyota/toyota/$ /catalog/shtatnye-hodovye-ogni-toyota/ [L,R=301]
RewriteRule ^catalog/biksenonovye-linzy/AUDI/$ /catalog/biksenonovye-linzy/ [L,R=301]
RewriteRule ^catalog/nakladki-na-porogi-metallicheskie-kia/kia/$ /catalog/nakladki-na-porogi-metallicheskie-kia/ [L,R=301]
RewriteRule ^catalog/nakladki-na-porogi-s-podsvetkoj-citroen/citroen/$ /catalog/nakladki-na-porogi-s-podsvetkoj-citroen/ [L,R=301]
RewriteRule ^catalog/angelskie-glazki-na-subaru/subaru/$ /catalog/angelskie-glazki-na-subaru/ [L,R=301]
RewriteRule ^catalog/nakladki-na-porogi-s-podsvetkoj-opel/opel/$ /catalog/nakladki-na-porogi-s-podsvetkoj-opel/ [L,R=301]
RewriteRule ^articles/tehinfo/shtatnye-dnevnye-hodovye-ogni/$ /tehinfo/shtatnye-dnevnye-hodovye-ogni/ [L,R=301]
RewriteRule ^tehinfo/ustranenie-zapotevaniya-far/$ /tehinfo/poteet-fara/ [L,R=301]
RewriteRule ^article/catalog/dopolnitelnoe-oborudovanie/$ /catalog/dopolnitelnoe-oborudovanie/ [L,R=301]
RewriteRule ^brendy/$ /brands/ [L,R=301]
RewriteRule ^products/page-([0-9]+)/$ /products/?page=$1 [L,QSA]
RewriteRule ^brands/(.*)/page-(.*)/$ /brands/$1/?page=$2 [L,QSA]
RewriteRule ^catalog/(.*)/page-(.*)/$ /catalog/$1/?page=$2 [L,QSA]
RewriteRule ^otzyvy/page-(.*)/$ /otzyvy/?page=$1 [L,QSA]
RewriteRule ^articles/(.*)/page-(.*)/$ /articles/$1/?page=$2 [L,QSA]
# Каталог товаров
RewriteRule ^catalog/([^/]+)/?$ index.php?module=ProductsView&category=$1 [L,QSA]
RewriteRule ^catalog/([^/]+)/([^/]+)/?$ index.php?module=ProductsView&category=$1&brand=$2 [L,QSA]
RewriteRule ^products/([^/]+)/?$ index.php?module=ProductView&product_url=$1 [L,QSA]
RewriteRule ^products/?$ index.php?module=ProductsView [L,QSA]
RewriteRule ^brands/([^/]+)/?$ index.php?module=ProductsView&brand=$1 [L,QSA]
RewriteRule ^brands/([^/]+)/page_([^/]+)/?$ index.php?module=ProductsView&brand=$1&page=$2 [L,QSA]
# Поиск товаров
#RewriteRule ^search/([^/]+)/?$ index.php?module=ProductsView&keyword=$1 [L,QSA]
#RewriteRule ^search/?$ index.php?module=ProductsView [L,QSA]
RewriteRule ^search/([^/]+)/?$ index.php?module=SearchView&keyword=$1 [L,QSA]
RewriteRule ^search/?$ index.php?module=SearchView [L,QSA]
# Блог
RewriteRule ^actions/([^/]+)/?$ index.php?module=ActionsView&url=$1 [L,QSA]
RewriteRule ^actions/?$ index.php?module=ActionsView [L,QSA]
RewriteRule blog/([^/]+)/?$ /tehinfo/$1 [L,R=301]
RewriteRule ^tehinfo/([^/]+)/?$ index.php?module=BlogView&url=$1 [L,QSA]
RewriteRule ^tehinfo/?$ index.php?module=BlogView [L,QSA]
# Статьи
#RewriteRule ^articles/([^/]+)/?$ index.php?module=ArticlesView&category=$1 [L,QSA]
#RewriteRule ^articles/?$ index.php?module=ArticlesView [L,QSA]
#RewriteRule ^article/([^/]+)/?$ index.php?module=ArticlesView&article_url=$1 [L,QSA]
RewriteRule ^nashi-raboty/nashi-raboty/?$ /nashi-raboty/ [L,R=301]
RewriteRule ^articles/nashi-raboty/?$ /nashi-raboty/ [L,R=301]
RewriteRule ^article/([^/]+)/?$ /nashi-raboty/$1/ [L,R=301]
RewriteRule ^articles/([^/]+)/?$ /nashi-raboty/$1/ [L,R=301]
RewriteRule ^nashi-raboty/?$ index.php?module=ArticlesView&url=nashi-raboty [L,QSA]
RewriteRule ^nashi-raboty/page-([0-9]+)/?$ index.php?module=ArticlesView&url=nashi-raboty&page=$1 [L,QSA]
RewriteRule ^nashi-raboty/filter-([^/]+)/page-([0-9]+)/?$ index.php?module=ArticlesView&url=nashi-raboty&filter=$1&page=$2 [L,QSA]
RewriteRule ^nashi-raboty/filter-([^/]+)/?$ index.php?module=ArticlesView&url=nashi-raboty&filter=$1 [L,QSA]
RewriteRule ^nashi-raboty/([^/]+)/?$ index.php?module=ArticlesView&url=$1 [L,QSA]
RewriteRule ^nashi-raboty/([^/]+)/filter-([^/]+)/?$ index.php?module=ArticlesView&url=$1&filter=$2 [L,QSA]
RewriteRule ^nashi-raboty/([^/]+)/([^/]+)/?$ index.php?module=ArticlesView&url=$1&model=$2 [L,QSA]
RewriteRule ^nashi-raboty/([^/]+)/([^/]+)/filter-([^/]+)/?$ index.php?module=ArticlesView&url=$1&model=$2&filter=$3 [L,QSA]
# Услуги
RewriteRule ^tuning-centr/tuning-centr/?$ /tuning-centr/ [L,R=301]
RewriteRule ^tuning-centr/.+/([^/]+)/?$ index.php?module=PageView&page_url=$1 [L,QSA]
RewriteRule ^tuning-centr/([^/]+)/?$ index.php?module=PageView&page_url=$1 [L,QSA]
RewriteRule ^tuning-centr/?$ index.php?module=PageView&page_url=tuning-centr [L,QSA]
# Страницы
RewriteRule ^pages/.+/([^/]+)/?$ index.php?module=PageView&page_url=$1 [L,QSA]
RewriteRule ^pages/([^/]+)/?$ index.php?module=PageView&page_url=$1 [L,QSA]
RewriteRule ^pages/?$ index.php?module=PageView&page_url=$1 [L,QSA]
# Корзина и заказы
RewriteRule ^cart/?$ index.php?module=CartView [L,QSA]
RewriteRule ^cart/([^/]+)/?$ index.php?module=CartView&add_variant=$1 [L,QSA]
RewriteRule ^cart/remove/([^/]+)/?$ index.php?module=CartView&delete_variant=$1 [L,QSA]
RewriteRule ^order/([^/]+)/?$ index.php?module=OrderView&url=$1 [L,QSA]
RewriteRule ^order/?$ index.php?module=OrderView [L,QSA]
# Для пользователей
RewriteRule ^user/login/?$ index.php?module=LoginView [L,QSA]
RewriteRule ^user/register/?$ index.php?module=RegisterView [L,QSA]
RewriteRule ^user/logout/?$ index.php?module=LoginView&action=logout [L,QSA]
RewriteRule ^user/password_remind/?$ index.php?module=LoginView&action=password_remind [L,QSA]
RewriteRule ^user/password_remind/([0-9a-z]+)/?$ index.php?module=LoginView&action=password_remind&code=$1 [L,QSA]
RewriteRule ^user/?$ index.php?module=UserView [L,QSA]
# Google sitemap
RewriteRule ^sitemap.xml?$ sitemap.php [L,QSA]
# XML
RewriteRule ^yandex.yml?$ yandex.php [L,QSA]
# feedback
# RewriteRule ^contact/?$ index.php?module=FeedbackView [L,QSA]
# rss
RewriteRule ^rss/?$ index.php?module=RssView [L,QSA]
#downloads
RewriteRule ^order/([^/]+)/([^/]+)/?$ index.php?module=OrderView&url=$1&file=$2 [L,QSA]
# Статические страницы
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/?$ index.php?module=PageView&page_url=$1 [L,QSA]
RewriteRule ^/?$ index.php?module=MainView&page_url= [L,QSA]
# Ресайз картинок на лету
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{THE_REQUEST} ^GET\ (.*)files/products/(.*)\?([A-z0-9]*)
#RewriteRule ^files/products/(.+) resize/resize.php?file=%2&token=%3 [L,NE]
RewriteRule ^files/products/(.+) resize/resize.php?file=$1&token=%{QUERY_STRING}
RewriteRule ^files/post/(.+) resize/resizepost.php?file=$1&token=%{QUERY_STRING}
#RewriteRule ^files/page/(.+) resize/resizepage.php?file=$1&token=%{QUERY_STRING}
RewriteRule ^files/page/(.+) resize/resizepage.php?file=$1&%{QUERY_STRING}
#RewriteRule ^files/categories/([0-9]+)x([0-9]+)/(.+) resize/resizecat.php?w=$1&h=$2&file=$3
#RewriteRule ^files/categories/(.+) resize/resizecat.php?file=$1&%{QUERY_STRING}
RewriteRule ^files/brands/(.+) resize/resize_brands.php?file=$1&token=%{QUERY_STRING}
# Включаем кэш в браузерах посетителей
<ifModule mod_headers.c>
# Все html и htm файлы будут храниться в кэше браузера один день
<FilesMatch "\.(html|htm)$">
# Header set Cache-Control "max-age=60"
</FilesMatch>
# Все css, javascript и текстовые файлы будут храниться в кэше браузера одну неделю one year
<FilesMatch "\.(js|css|txt)$">
#Header set Cache-Control "max-age=604800"
Header set Cache-Control "max-age=31536000"
</FilesMatch>
# Все флэш файлы и изображения будут храниться в кэше браузера один year
<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png|otf|woff2)$">
Header set Cache-Control "max-age=31536000"
</FilesMatch>
# Отключаем кеширование php и других служебных файлов
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
<ifModule mod_expires.c>
ExpiresActive On
#по умолчанию кеш в 5 секунд
ExpiresDefault "access plus 5 seconds"
# Включаем кэширование изображений и флэш на месяц
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/x-font-opentype "access plus 1 year"
ExpiresByType application/x-font-woff "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/jpeg "access plus 4 weeks"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/gif "access plus 43829 minutes"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
# Включаем кэширование css, javascript и текстовых файлоф на одну неделю
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
# Включаем кэширование html и htm файлов на один день
#ExpiresByType text/html "access plus 60 seconds"
# Включаем кэширование xml файлов на десять минут
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>

218
view/ActionsView.php Normal file
View File

@@ -0,0 +1,218 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблоны blog.tpl и post.tpl
*
*/
require_once('View.php');
class ActionsView extends View
{
public function fetch()
{
$url = $this->request->get('url', 'string');
// Если указан адрес поста,
if(!empty($url))
{
// Выводим пост
return $this->fetch_post($url);
}
else
{
// if($url)
return $this->fetch_blog($url);
//else
//return $this->fetchPage($url);
}
}
function fetchPage($url)
{
if(!$url) $url = 'actions';
$page = $this->pages->get_page($url);
// Отображать скрытые страницы только админу
if(empty($page) || (!$page->visible && empty($_SESSION['admin'])))
return false;
$this->design->assign('page', $page);
$this->design->assign('meta_title', $page->meta_title);
$this->design->assign('meta_keywords', $page->meta_keywords);
$this->design->assign('meta_description', $page->meta_description);
//return
//return $this->design->fetch('page.tpl');
return $this->fetch_blog($url);
}
private function fetch_post($url)
{
// Выбираем пост из базы
$post = $this->actions->get_post($url);
// Если не найден - ошибка
if(!$post || (!$post->visible && empty($_SESSION['admin'])))
return false;
// Автозаполнение имени для формы комментария
if(!empty($this->user))
$this->design->assign('comment_name', $this->user->name);
// Принимаем комментарий
if ($this->request->method('post') && $this->request->post('comment'))
{
$comment->name = $this->request->post('name');
$comment->text = $this->request->post('text');
$captcha_code = $this->request->post('captcha_code', 'string');
// Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму
$this->design->assign('comment_text', $comment->text);
$this->design->assign('comment_name', $comment->name);
// Проверяем капчу и заполнение формы
if ($_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
{
$this->design->assign('error', 'captcha');
}
elseif (empty($comment->name))
{
$this->design->assign('error', 'empty_name');
}
elseif (empty($comment->text))
{
$this->design->assign('error', 'empty_comment');
}
else
{
// Создаем комментарий
$comment->object_id = $post->id;
$comment->type = 'actions';
$comment->ip = $_SERVER['REMOTE_ADDR'];
// Если были одобренные комментарии от текущего ip, одобряем сразу
$this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip);
if($this->db->num_rows()>0)
$comment->approved = 1;
// Добавляем комментарий в базу
$comment_id = $this->comments->add_comment($comment);
// Отправляем email
$this->notify->email_comment_admin($comment_id);
// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
unset($_SESSION['captcha_code']);
header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id);
}
}
// Комментарии к посту
$comments = $this->comments->get_comments(array('type'=>'actions', 'object_id'=>$post->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
$this->design->assign('comments', $comments);
$this->design->assign('post', $post);
//Страница родительского раздела
$page_url = trim($_SERVER['REQUEST_URI']);
$arr_page_url = explode('/', $page_url);
$parent_url = $arr_page_url[1];
$this->page = $this->pages->get_page($parent_url);
$this->design->assign('page', $this->page);
// Соседние записи
$this->design->assign('next_post', $this->actions->get_next_post($post->id));
$this->design->assign('prev_post', $this->actions->get_prev_post($post->id));
$escapedName = htmlspecialchars($post->name);
// Мета-теги
if(!$post->meta_title) $post->meta_title = $escapedName . ' - Акции в тюнинг центре Atomic Garage';
if(!$post->meta_description) $post->meta_description = $escapedName . ' в тюнинг центре Atomic Garage - Акции и скидки на товары и услуги тюнинга авто, ремонта оптики, установке линз, ПТФ, ДХО и дополнительного оборудования в Санкт-Петербурге.';
if(!$post->meta_keywords) $post->meta_keywords = mb_strtolower($escapedName, 'utf-8') . ', акции, скидки, товары, услуги, для автомобиля, авто, санкт-петербург, установка, ремонт, тюнинг центр, линзы, оптика, фары, фонари, птф, дхо';
$this->design->assign('meta_title', $post->meta_title);
$this->design->assign('meta_keywords', $post->meta_keywords);
$this->design->assign('meta_description', $post->meta_description);
$this->db->query("SELECT * FROM __action_photo WHERE action_id='" . $post->id . "' ORDER BY position, id DESC");
$photos = $this->db->results();
foreach($photos as $ph){
$ph->image = Img::get('/files/post/' . $ph->img, array('width'=>400));
$ph->bigImage = Img::get('/files/post/' . $ph->img, array('width'=>1200));
}
$this->design->assign('action_photos', $photos);
return $this->design->fetch('actions_post.tpl');
}
// Отображение списка постов
private function fetch_blog()
{
// Количество постов на 1 странице
$items_per_page = 20;
$filter = array();
// Выбираем только видимые посты
$filter['visible'] = 1;
// Текущая страница в постраничном выводе
$current_page = $this->request->get('page', 'integer');
// Если не задана, то равна 1
$current_page = max(1, $current_page);
$this->design->assign('current_page_num', $current_page);
// Вычисляем количество страниц
$posts_count = $this->actions->count_posts($filter);
// Показать все страницы сразу
if($this->request->get('page') == 'all')
$items_per_page = $posts_count;
$pages_num = ceil($posts_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);
$filter['page'] = $current_page;
$filter['limit'] = $items_per_page;
// Выбираем статьи из базы
$posts = $this->actions->get_posts($filter);
if(empty($posts))
return false;
// Передаем в шаблон
$this->design->assign('posts', $posts);
$this->page = $this->pages->get_page(31);
// $page = $this->pages->get_page('actions');
$this->design->assign('page', $this->page);
// Метатеги
if($this->page)
{
$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);
}
$body = $this->design->fetch('actions.tpl');
return $body;
}
}

657
view/ArticlesView.php Normal file
View File

@@ -0,0 +1,657 @@
<?PHP
include $_SERVER['DOCUMENT_ROOT'] . '/modal-form/cp.php';
function changeIframe($m){
$x = '<iframe width="100%" style="border:0;margin-bottom:15px;" ' . $m[2] . '</iframe>';
return str_replace('frameborder="0"', '', $x);
}
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблон products.tpl
*
*/
require_once('View.php');
class ArticlesView extends View
{
/**
*
* Отображение списка товаров
*
*/
public $servicesTree = array();
function fetch()
{
$url = $this->request->get('url', 'string');
if($this->request->get('filter')) $this->design->assign('service_filter', $this->request->get('filter'));
if(empty($url)) return $this->fetch_articles();
$res = $this->checkMarkaModel();
if($res) return $res;
$article = $this->articles->get_article($url);
if(!$article) return $this->fetch_articles();
if($article && (!$article->visible && empty($_SESSION['admin']))) return false;
return $this->fetch_article($url);
}
function checkMarkaModel(){
$url = $this->request->get('url', 'string');
$model = $this->request->get('model', 'string');
if(!$url && !$model) return;
if(!$marka = $this->marka->get_brand($url)) return;
if(!$model) return $this->fetch_marka($marka);
$model = $this->model->get_model($model);
if($model) return $this->fetch_model($model);
}
function fetch_model($model){ //print_r($model);die;
$res = $this->db->query("SELECT * FROM __article_models WHERE model_id=" . $model->id);
$rows = $this->db->results();
if(!$rows) return;
$articleIds = array();
foreach($rows as $row) $articleIds[$row->article_id] = $row->article_id;
$filter = array('id' => $articleIds);
$this->design->assign('services', $this->getServices($filter));
$filter = $this->sortByService($filter);
$articles = $this->articles->get_articles($filter);
$this->design->assign('articles', $articles);
$filterService = $this->getFilterService();
$h1 = 'Наши проекты с ' . $model->marka->name .' '.$model->name;
if(!$filterService){
if(!$model->meta_title) $model->meta_title = 'Тюнинг ' . $model->marka->name . ' ' . $model->name . ' в Санкт-Петербурге - Atomic Garage';
if(!$model->meta_description) $model->meta_description = 'Тюнинг ' . $model->marka->name . ' ' . $model->name . ' в Санкт-Петербурге - примеры работ центра Atomic Garage: тюнинг, ремонт, установка автомобильной оптики, восстановление и улучшение качества света, комплексное обслуживание автомобиля.';
if(!$model->meta_keywords) $model->meta_keywords = $model->marka->name . ', ' . $model->name . ', тюнинг, центр, санкт-петербург, авто, автомобиль, фары, оптика, линзы, примеры работ, проекты, установка, замена, ремонт';
}else{
$model->meta_title = $filterService->name .' ' . $model->marka->name . ' ' . $model->name . ' в Санкт-Петербурге';
$model->meta_description = $filterService->name . ' ' . $model->marka->name . ' ' . $model->name . ' в Санкт-Петербурге - примеры работ центра Atomic Garage: тюнинг и ремонт фар любой сложности, восстановление и улучшение качества света, комплексное обслуживание автомобиля.';
$model->meta_keywords = 'наши работы, проекты, ' . $filterService->name .', ' . $model->marka->name . ', ' . $model->name . ', тюнинг центр, авто, автомобиль, санкт-петербург, установка, замена, ремонт';
$h1 = 'Наши проекты с ' . $model->marka->name . ' ' .$model->name . ' - ' . $filterService->name;
}
$this->design->assign('meta_title', $model->meta_title);
$this->design->assign('meta_keywords', $model->meta_keywords);
$this->design->assign('meta_description', $model->meta_description);
$this->design->assign('model', $model);
$this->design->assign('h1', $h1);
return $this->design->fetch('model.tpl');
}
function fetch_marka($marka){
$res = $this->db->query("SELECT * FROM __article_models WHERE marka_id=" . $marka->id);
$rows = $this->db->results();
if(!$rows) return;
$modelIds = $articleIds = array();
foreach($rows as $row){
if($row->model_id) $modelIds[$row->model_id] = $row->model_id;
$articleIds[$row->article_id] = $row->article_id;
}
if($modelIds){
$this->db->query("SELECT * FROM __model WHERE visible=1 AND id IN(".implode(',', $modelIds).")");
$models = $this->db->results();
$this->design->assign('models', $models);
}
$filter = array('id' => $articleIds);
$this->design->assign('services', $this->getServices($filter));
$filter = $this->sortByService($filter);
$articles = $this->articles->get_articles($filter);
$this->design->assign('articles', $articles);
$filterService = $this->getFilterService();
$h1 = 'Наши проекты с ' . $marka->name;
if(!$filterService){
if(!$marka->meta_title) $marka->meta_title = 'Тюнинг ' . $marka->name . ' в Санкт-Петербурге - Atomic Garage';
if(!$marka->meta_description) $marka->meta_description = 'Тюнинг ' . $marka->name . ' в Санкт-Петербурге - примеры работ центра Atomic Garage: тюнинг, ремонт, установка автомобильной оптики, восстановление и улучшение качества света, комплексное обслуживание автомобиля.';
if(!$marka->meta_keywords) $marka->meta_keywords = $marka->name . ', тюнинг, центр, санкт-петербург, авто, автомобиль, фары, оптика, линзы, примеры работ, проекты, установка, замена, ремонт';
}else{
$marka->meta_title = 'Примеры работ: ' .$filterService->name .' ' . $marka->name . ' в Санкт-Петербурге';
$marka->meta_description = $filterService->name . ' ' . $marka->name . ' в Санкт-Петербурге - примеры работ центра Atomic Garage: тюнинг и ремонт фар любой сложности, восстановление и улучшение качества света, комплексное обслуживание автомобиля.';
$marka->meta_keywords = 'наши работы, проекты, ' . $filterService->name .', ' . $marka->name . ', тюнинг центр, авто, автомобиль, санкт-петербург, установка, замена, ремонт';
$h1 = 'Наши проекты с ' . $marka->name . ' - ' . $filterService->name;
}
$this->design->assign('meta_title', $marka->meta_title);
$this->design->assign('meta_keywords', $marka->meta_keywords);
$this->design->assign('meta_description', $marka->meta_description);
$this->design->assign('marka', $marka);
$this->design->assign('h1', $h1);
return $this->design->fetch('marka.tpl');
}
function fetch_article($url)
{
// Выбираем пост из базы
$article = $this->articles->get_article($url);
$article->visited++;
$update_visited->visited = $article->visited;
$this->articles->update_article($article->id, $update_visited);
// Если не найден - ошибка
if(!$article || (!$article->visible && empty($_SESSION['admin']))) return false;
// Автозаполнение имени для формы комментария
if(!empty($this->user))
$this->design->assign('comment_name', $this->user->name);
// Принимаем комментарий
if ($this->request->method('post') && $this->request->post('comment'))
{
$comment->name = $this->request->post('name');
$comment->text = $this->request->post('text');
// Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму
$this->design->assign('comment_text', $comment->text);
$this->design->assign('comment_name', $comment->name);
$cp = new ReCaptcha('6LegdywdAAAAAJaQLxIlHnITncRtuHQu-HHxeAYG');
$cpResult = $cp->verifyResponse($_SERVER['REMOTE_ADDR'], $this->request->post('recaptcha_response'));
if (!$cpResult->success) {
$this->design->assign('error', 'captcha');
}
elseif (empty($comment->name))
{
$this->design->assign('error', 'empty_name');
}
elseif (empty($comment->text))
{
$this->design->assign('error', 'empty_comment');
}
else
{
// Создаем комментарий
$comment->object_id = $article->id;
$comment->type = 'article';
$comment->ip = $_SERVER['REMOTE_ADDR'];
// Если были одобренные комментарии от текущего ip, одобряем сразу
$this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip);
if($this->db->num_rows()>0)
$comment->approved = 1;
// Добавляем комментарий в базу
if($this->request->post('email') == '')
$comment_id = $this->comments->add_comment($comment);
// Отправляем email
$this->notify->email_comment_admin($comment_id);
header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id);
}
}
// Комментарии к посту
$comments = $this->comments->get_comments(array('type'=>'article', 'object_id'=>$article->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
$this->design->assign('comments', $comments);
$article->text = preg_replace_callback('~<iframe width="(.*)"([^<]+)<\/iframe>~Uis', 'changeIframe', $article->text);
$this->design->assign('article', $article);
// Соседние записи
$this->design->assign('next_article', $this->articles->get_next_article($article->id));
$this->design->assign('prev_article', $this->articles->get_prev_article($article->id));
// Связанные объекты
$related_objects = $this->articles->get_related_objects(array('id'=>$article->id));
if(!empty($related_objects))
{
$r_products = array();
$r_articles = array();
foreach($related_objects as &$r_p)
if($r_p->type == 'product') $r_products[$r_p->object_id] = &$r_p;
elseif($r_p->type == 'article') $r_articles[$r_p->object_id] = &$r_p;
if(!empty($r_products)) {
//echo '<!-- @@@1'; print_r($r_products); echo '-->';
// foreach($this->products->get_products(array('id'=>array_keys($r_products), 'in_stock'=>1, 'visible'=>1)) as $p)
foreach($this->products->get_products(array('id'=>array_keys($r_products), 'visible'=>1)) as $p)
$r_products[$p->id] = $p;
//echo '<!-- @@@2'; print_r($r_products); echo '-->';
$r_products_images = $this->products->get_images(array('product_id'=>array_keys($r_products)));
foreach($r_products_images as $related_product_image)
if(isset($r_products[$related_product_image->product_id]))
$r_products[$related_product_image->product_id]->images[] = $related_product_image;
$r_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($r_products), 'instock'=>true));
foreach($r_products_variants as $related_product_variant)
{
if(isset($r_products[$related_product_variant->product_id]))
{
$r_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach($r_products as $id=>$r)
{
if(is_object($r))
{
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
}
else
{
unset($r_products[$id]);
}
}
}
if(!empty($r_articles)) {
$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;
}
//echo '<!-- @@@3'; print_r($r_products); echo '-->';
$this->design->assign('related_products', $r_products);
$this->design->assign('related_articles', $r_articles);
}
// Отзывы о товаре
$comments = $this->comments->get_comments(array('type'=>'articles', 'object_id'=>$article->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
// Мета-теги
$page = $this->request->get('page', 'int');
$p = ($page > 1) ? ' страница №'.$page : '';
$p2 = ($page > 1) ? ', страница №'.$page : '';
// echo '<!--'; var_dump($article); echo '-->';
if(!$article->meta_title) $article->meta_title = $article->name . ' в Санкт-Петербурге';
if(!$article->meta_description) $article->meta_description = 'Наши работы: ' . $article->name . ' в Санкт-Петербурге - центр Atomic Garage: тюнинг и ремонт фар любой сложности, восстановление и улучшение качества света, комплексное обслуживание автомобиля.';
if(!$article->meta_keywords) $article->meta_keywords = 'наши, работы, проекты, примеры, ' . $article->name . ', тюнинг центр, авто, автомобиль, санкт-петербург, установка, замена, ремонт';
$this->design->assign('meta_title', ($article->meta_title).$p);
$this->design->assign('meta_keywords', ($article->meta_keywords).$p2);
$this->design->assign('meta_description', ($article->meta_description).$p);
//require_once $_SERVER['DOCUMENT_ROOT'] . '/lib/Img.php';
$this->db->query("SELECT * FROM __article_photo WHERE article_id='" . $article->id . "' ORDER BY position, id DESC");
$photos = $this->db->results();
foreach($photos as $ph){
$ph->image = Img::get('/files/article_photo/' . $ph->img, array('width'=>400));
$ph->bigImage = Img::get('/files/article_photo/' . $ph->img, array('width'=>1200));
}
$this->design->assign('article_photos', $photos);
return $this->design->fetch('article.tpl');
}
function fetch_articles()
{
$name_style = $img_style= '';
// GET-Параметры
//$category_url = $this->request->get('category', 'string');
$category_url = $this->request->get('url', 'string');
if(isset($_GET['page']) && $_GET['page'] == 1){
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: /articles/" . $category_url . '/' );
exit;
}
$filter = array();
$filter['visible'] = 1;
// Выберем текущую категорию
if (!empty($category_url))
{
$category = $this->articles->get_category((string)$category_url);
if (empty($category) || (!$category->visible && empty($_SESSION['admin']))) return false;
$this->design->assign('article_category', $category); //echo '<!--';var_dump($category->subcategories); echo '-->';
// $a = array();
// foreach($category->subcategories as $k=>$v){
// if($v->visible == 0) unset($category->subcategories[$k]);
// }
//echo '<!--';print_r($_SESSION); echo '-->';
$filter['category_id'] = $category->children;
}else{
}
// Если задано ключевое слово
$keyword = $this->request->get('keyword', 'string');
if (!empty($keyword))
{
$this->design->assign('keyword', $keyword);
$filter['keyword'] = $keyword;
}
//print_r($_SERVER);
// Постраничная навигация
$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);
// Вычисляем количество страниц
$filter['page'] = $current_page;
$filter['limit'] = $items_per_page;
$filter = $this->sortByService($filter);
$articles_count = $this->articles->count_articles($filter);
$pages_num = ceil($articles_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);
if($pages_num && $current_page > $pages_num){
return $this->force404();
/*header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
Header( "Location: /404/" );
die;*/
}
if(strpos($_SERVER['REQUEST_URI'], '?page=') !== false){
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;
}
//$filter['page'] = $current_page;
//$filter['limit'] = $items_per_page;
///////////////////////////////////////////////
// Постраничная навигация END
///////////////////////////////////////////////
$this->design->assign('services', $this->getServices($filter, 0));
//$filter = $this->sortByService($filter);
// Статьи
$articles = array();
foreach($this->articles->get_articles($filter) as $a)
$articles[$a->id] = $a;
//echo '<!--';var_dump($articles); echo '-->';
// Если искали товар и найден ровно один - перенаправляем на него
if(!empty($keyword) && $products_count == 1)
header('Location: '.$this->config->root_url.'/article/'.$a->url);
// Устанавливаем мета-теги в зависимости от запроса
$page = $this->request->get('page', 'int');
//echo '<pre>'; print_r($this->page); die;
$filterService = $this->getFilterService();
if($filterService){
$this->design->assign('meta_title', 'Наши работы - ' . $filterService->name .' в тюнинг центре Atomic Garage');
$this->design->assign('meta_keywords', 'наши работы, проекты, ' . $filterService->name .', тюнинг центр, авто, автомобиль, санкт-петербург, установка, замена, ремонт');
$this->design->assign('meta_description', 'Примеры работ в тюнинг центре Atomic Garage: ' . $filterService->name . ' в Санкт-Петербурге.');
if($category) $category->name .= ' - ' . $filterService->name;
}else{
if($this->page && !isset($category))
{
$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))
{ //echo '<pre>'; print_r($category); die;
if($category->id == 40){
$name_style = 'height:46px;';
}
$sx = explode(' ', $category->name);
$this->design->assign('maybeBrand', array_pop($sx));
if(isset($_GET['page'])) $category->name .= ' - страница '.$_GET['page'];
$title = $category->meta_title;
$desc = $category->meta_description;
$keys = $category->meta_keywords;
/*
if($category->id == 5 && isset($_GET['page'])) $title .= ' в';
if(isset($category->path[0]) && $category->path[1]->id && $category->path[0]->id == 5){
$title = $category->name.' - тюнинг в';
$desc = $category->name.' - визуальный тюнинг автомобильной оптики по выгодным ценам в Санкт-Петербурге от установочного центра CarHeart.';
$keys = 'примеры работ, '.$category->name.', тюнинг, установка, автомобиль, цена, спб, визуальный, стайлинг, световая оптика, фары, линзы';
}
if(isset($category->parent_id) && $category->parent_id == 3){
$title = 'Установочный центр '.$category->name.' в';
$desc = 'Фотографии и примеры работ, выполненных в нашем установочном центре '.$category->name;
$keys = $category->name.', установочный центр, примеры работ, фотографии';
}
*/
//$title = $category->name;
//$desc = $category->name;
// $keys = $category->name;
//echo $category->path[0]->id; echo '.'.$category->path[1]->id; echo '.'.$category->path[2]->id; echo $category->name;
$this->design->assign('meta_title', $title);
$this->design->assign('meta_keywords', $keys);
$this->design->assign('meta_description', $desc);
}
elseif(!empty($keyword))
{
$this->design->assign('meta_title', $keyword);
}
else
$this->design->assign('meta_title', 'Полезные статьи');
}
if($this->request->get('filter', 'int')){
$serviceId = $this->request->get('filter', 'int');
}
$this->design->assign('articles', $articles);
$categories = $this->articles->get_categories_tree();
$this->design->assign('article_categories', $categories);
$this->design->assign('name_style', $name_style);
$res = $this->db->query("SELECT * FROM __article_models GROUP BY marka_id");
$rows = $this->db->results();
if($rows){
$ids = array();
foreach($rows as $row) $ids[] = $row->marka_id;
$this->db->query("SELECT * FROM __marka WHERE visible=1 AND id IN(".implode(',', $ids).") ORDER BY name");
$markas = $this->db->results();
$this->design->assign('markas', $markas);
}
$this->body = $this->design->fetch('articles.tpl');
return $this->body;
}
function sortByService($filter){
$serviceUrl = $this->request->get('filter', 'string');
if(!$serviceUrl) return $filter;
$this->db->query("SELECT id FROM __pages WHERE url = '".$serviceUrl."' LIMIT 1 ");
$item = $this->db->result();
if(!$item) return $filter;
$ids = array($item->id);
$origFilter = $filter;
$filter['id'] = array();
$services = $this->getChildServices($item->id);
foreach($services as $id => $name) $ids[] = $id;
$this->db->query("SELECT * FROM __article_pages WHERE page_id IN(".implode(',', $ids).")");
foreach($this->db->results() as $row){
if(!empty($origFilter['id']) && in_array($row->article_id, $origFilter['id'])) $filter['id'][] = $row->article_id;
if( empty($origFilter['id']) ) $filter['id'][] = $row->article_id;
}
return $filter;
}
function getFilterService(){
$serviceUrl = $this->request->get('filter', 'string');
if(!$serviceUrl) return;
$this->db->query("SELECT * FROM __pages WHERE url = '".$serviceUrl."' LIMIT 1 ");
return $this->db->result();
}
function getServices($filter = array(), $skipArticles = true){ ///return $this->getChildServices(28);
unset($filter['page']);
unset($filter['limit']);
if(!$skipArticles && isset($filter['id'])) unset($filter['id']);
$articles = $this->articles->get_articles($filter);
$ids = array();
foreach($articles as $row) $ids[] = $row->id;
$this->db->query("SELECT * FROM __article_pages WHERE article_id IN(".implode(',', $ids).") GROUP BY page_id");
if(!$articlePages = $this->db->results()) return array();
$_pageIds = $pageIds = $_services = array();
$services = $this->getChildServices(28);
foreach($articlePages as $row){
$_pageIds = array_merge($this->getAllParents($row->page_id, $services), $_pageIds);
}
foreach($_pageIds as $id) $pageIds[$id] = $id;
foreach($services as $id=>$row){
if(isset($pageIds[$id])) $_services[$id] = $row;
}
return $_services;
}
function getAllParents($id, $services, $items = array()){
foreach($services as $row){
if($row->id == $id){
$items[$row->id] = $row->id;
$items = $this->getAllParents($row->parent, $services, $items);
}
}
return $items;
}
function getChildServices($parentId, $services = array(), $prefix = ''){
$this->db->query("SELECT id,name,url,parent FROM __pages WHERE parent=" . $parentId);
$rows = $this->db->results();
if(!$rows) return $services;
foreach($rows as $row){
$row->name = $prefix . $row->name;
$services[$row->id] = $row;
if(!isset($this->servicesTree[$row->parent])) $this->servicesTree[$row->parent] = array();
$this->servicesTree[$row->parent][$row->id] = $row;
$services = $this->getChildServices($row->id, $services, $prefix . '&nbsp;&nbsp;');
}
return $services;
}
}

176
view/BlogView.php Normal file
View File

@@ -0,0 +1,176 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблоны blog.tpl и post.tpl
*
*/
require_once('View.php');
class BlogView extends View
{
public function fetch()
{
$url = $this->request->get('url', 'string');
// Если указан адрес поста,
if(!empty($url))
{
// Выводим пост
return $this->fetch_post($url);
}
else
{
// Иначе выводим ленту блога
return $this->fetch_blog($url);
}
}
private function fetch_post($url)
{
// Выбираем пост из базы
$post = $this->blog->get_post($url);
// Если не найден - ошибка
if(!$post || (!$post->visible && empty($_SESSION['admin'])))
return false;
// Автозаполнение имени для формы комментария
if(!empty($this->user))
$this->design->assign('comment_name', $this->user->name);
// Принимаем комментарий
if ($this->request->method('post') && $this->request->post('comment'))
{
$comment->name = $this->request->post('name');
$comment->text = $this->request->post('text');
$captcha_code = $this->request->post('captcha_code', 'string');
// Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму
$this->design->assign('comment_text', $comment->text);
$this->design->assign('comment_name', $comment->name);
// Проверяем капчу и заполнение формы
if ($_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
{
$this->design->assign('error', 'captcha');
}
elseif (empty($comment->name))
{
$this->design->assign('error', 'empty_name');
}
elseif (empty($comment->text))
{
$this->design->assign('error', 'empty_comment');
}
else
{
// Создаем комментарий
$comment->object_id = $post->id;
$comment->type = 'blog';
$comment->ip = $_SERVER['REMOTE_ADDR'];
// Если были одобренные комментарии от текущего ip, одобряем сразу
$this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip);
if($this->db->num_rows()>0)
$comment->approved = 1;
// Добавляем комментарий в базу
$comment_id = $this->comments->add_comment($comment);
// Отправляем email
$this->notify->email_comment_admin($comment_id);
// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
unset($_SESSION['captcha_code']);
header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id);
}
}
// Комментарии к посту
$comments = $this->comments->get_comments(array('type'=>'blog', 'object_id'=>$post->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
$this->design->assign('comments', $comments);
$this->design->assign('post', $post);
//Страница родительского раздела
$page_url = trim($_SERVER['REQUEST_URI']);
$arr_page_url = explode('/', $page_url);
$parent_url = $arr_page_url[1];
$this->page = $this->pages->get_page($parent_url);
$this->design->assign('page', $this->page);
// Соседние записи Тюнинг Kia Rio
$this->design->assign('next_post', $this->blog->get_next_post($post->id));
$this->design->assign('prev_post', $this->blog->get_prev_post($post->id));
if(!$post->meta_title) $post->meta_title = $post->name.' - Статьи в ';
if(!$post->meta_description) $post->meta_description = $post->name.' - Техническая, полезная информация в CarHeart - визуальный тюнинг автомобильной оптики в Санкт-Петербурге.';
if(!$post->meta_keywords) $post->meta_keywords = 'статьи, техническая, полезная, информация, '.$post->name.', установка на автомобиль, услуги, спб, визуальный тюнинг, стайлинг, световая оптика';
// Мета-теги
$this->design->assign('meta_title', $post->meta_title);
$this->design->assign('meta_keywords', $post->meta_keywords);
$this->design->assign('meta_description', $post->meta_description);
return $this->design->fetch('post.tpl');
}
// Отображение списка постов
private function fetch_blog()
{
// Количество постов на 1 странице
$items_per_page = 20;
$filter = array();
// Выбираем только видимые посты
$filter['visible'] = 1;
// Текущая страница в постраничном выводе
$current_page = $this->request->get('page', 'integer');
// Если не задана, то равна 1
$current_page = max(1, $current_page);
$this->design->assign('current_page_num', $current_page);
// Вычисляем количество страниц
$posts_count = $this->blog->count_posts($filter);
// Показать все страницы сразу
if($this->request->get('page') == 'all')
$items_per_page = $posts_count;
$pages_num = ceil($posts_count/$items_per_page);
$this->design->assign('total_pages_num', $pages_num);
$filter['page'] = $current_page;
$filter['limit'] = $items_per_page;
// Выбираем статьи из базы
$posts = $this->blog->get_posts($filter);
if(empty($posts))
return false;
// Передаем в шаблон
$this->design->assign('posts', $posts);
// Метатеги
if($this->page)
{
$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);
}
$body = $this->design->fetch('blog.tpl');
return $body;
}
}

311
view/CartView.php Normal file
View File

@@ -0,0 +1,311 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2009 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Корзина покупок
* Этот класс использует шаблон cart.tpl
*
*/
require_once('View.php');
include $_SERVER['DOCUMENT_ROOT'] . '/modal-form/cp.php';
class CartView extends View
{
//////////////////////////////////////////
// Изменения товаров в корзине
//////////////////////////////////////////
public function __construct()
{
parent::__construct();
if($this->request->get('clear')=='true')
{
$this->cart->empty_cart();
header('location: '.$this->config->root_url.'/cart/');
}
// Если передан id варианта, добавим его в корзину
if($variant_id = $this->request->get('variant', 'integer'))
{
$this->cart->add_item($variant_id, $this->request->get('amount', 'integer'),$this->request->post('feature'));
header('location: '.$this->config->root_url.'/cart/');
}
// Удаление товара из корзины
if($delete_variant_id = intval($this->request->get('delete_variant')))
{
$this->cart->delete_item($delete_variant_id);
if(!isset($_POST['submit_order']) || $_POST['submit_order']!=1)
header('location: '.$this->config->root_url.'/cart/');
}
//print_r($_POST);die;
// Если нажали оформить заказ
if(isset($_POST['checkout']) || isset($_POST['cart-form']))
{
if(strpos($this->request->post('name'), '<?') !== false || strpos($this->request->post('name2'), '<?') !== false
|| strpos($this->request->post('email'), '<?') !== false || strpos($this->request->post('comment'), '<?') !== false) die('503');
$order->delivery_id = $this->request->post('delivery_id', 'integer');
$order->payment_method_id = $this->request->post('payment_method_id', 'integer');
$order->name = $this->request->post('name');
$order->name2 = $this->request->post('name2');
$order->email = $this->request->post('email');
$order->address = $this->request->post('address');
$order->phone = $this->request->post('phone');
$order->country = $this->request->post('country');
$order->region = $this->request->post('region');
$order->city = $this->request->post('city');
$order->indx = $this->request->post('indx');
$order->comment = $this->request->post('comment');
$order->ip = $_SERVER['REMOTE_ADDR'];
$this->design->assign('delivery_id', $order->delivery_id);
$this->design->assign('name', $order->name);
$this->design->assign('name2', $order->name2);
$this->design->assign('email', $order->email);
$this->design->assign('phone', $order->phone);
$this->design->assign('country', $order->country);
$this->design->assign('region', $order->region);
$this->design->assign('city', $order->city);
$this->design->assign('indx', $order->indx);
$this->design->assign('address', $order->address);
$delivery = $this->delivery->get_delivery($order->delivery_id);
// Скидка
$cart = $this->cart->get_cart();
$order->discount = $cart->discount;
if($cart->coupon)
{
$order->coupon_discount = $cart->coupon_discount;
$order->coupon_code = $cart->coupon->code;
}
//
if(!empty($this->user->id))
$order->user_id = $this->user->id;
if(empty($order->name))
{
$this->design->assign('error', 'empty_name');
}
// elseif(empty($order->email) && $order->delivery_id != 2)
// {
//$this->design->assign('error', 'empty_email');
// }
elseif($delivery->ems == 1 && !$this->request->post('city2') && $order->delivery_id != 2)
{
$this->design->assign('error', 'empty_city2');
}
$cp = new ReCaptcha('6LegdywdAAAAAJaQLxIlHnITncRtuHQu-HHxeAYG');
$cpResult = $cp->verifyResponse($_SERVER['REMOTE_ADDR'], $this->request->post('recaptcha_response'));
if (!$cpResult->success) {
$this->design->assign('error', 'captcha');
}
else
{
if($delivery->ems==1 )
if($this->request->post('delivery_price'))
$order->delivery_price = $this->request->post('delivery_price');
// Добавляем заказ в базу
$order_id = $this->orders->add_order($order);
$_SESSION['order_id'] = $order_id;
// Если использовали купон, увеличим количество его использований
if($cart->coupon)
$this->coupons->update_coupon($cart->coupon->id, array('usages'=>$cart->coupon->usages+1));
$session_items = $_SESSION['shopping_cart'];
// Добавляем товары к заказу
foreach($this->request->post('amounts') as $variant_id=>$amount)
{
$options = $session_items[$variant_id]['options'];
$this->orders->add_purchase(array('order_id'=>$order_id, 'variant_id'=>intval($variant_id), 'amount'=>intval($amount), 'options'=>$options));
}
$order = $this->orders->get_order($order_id);
// Стоимость доставки
if(!empty($delivery) && $delivery->free_from > $order->total_price)
{
if($delivery->ems == 1 && $this->request->post('city2')){
$data = file_get_contents('http://emspost.ru/api/rest?method=ems.calculate&from='.$this->settings->emsfrom.'&to='.$this->request->post('city2').'&weight='.max(1,$cart->total_weight));
$data = json_decode($data);
if(@$data->rsp->price)
$delivery->price = $data->rsp->price;
}
$this->orders->update_order($order->id, array('delivery_price'=>$delivery->price, 'separate_delivery'=>$delivery->separate_payment));
}
// Отправляем письмо пользователю
if($order->email) $this->notify->email_order_user($order->id);
// Отправляем письмо администратору
$this->notify->email_order_admin($order->id);
// Очищаем корзину (сессию)
$this->cart->empty_cart();
// Перенаправляем на страницу заказа
header('Location: '.$this->config->root_url.'/order/' . $order->url . '/?done=1');
}
}
else
{
// Если нам запостили amounts, обновляем их
if($amounts = $this->request->post('amounts'))
{
foreach($amounts as $variant_id=>$amount)
{
$this->cart->update_item($variant_id, $amount);
}
$coupon_code = trim($this->request->post('coupon_code', 'string'));
if(empty($coupon_code))
{
$this->cart->apply_coupon('');
header('location: '.$this->config->root_url.'/cart/');
}
else
{
$coupon = $this->coupons->get_coupon((string)$coupon_code);
if(empty($coupon) || !$coupon->valid)
{
$this->cart->apply_coupon($coupon_code);
$this->design->assign('coupon_error', 'invalid');
}
else
{
$this->cart->apply_coupon($coupon_code);
header('location: '.$this->config->root_url.'/cart/');
}
}
}
}
}
//////////////////////////////////////////
// Основная функция
//////////////////////////////////////////
function fetch()
{
$this->design->assign('acity', $this->cart->getCity2());
// Способы доставки
$deliveries = $this->delivery->get_deliveries(array('enabled'=>1));
/*order-on-one-page*/
foreach($deliveries as $delivery)
$delivery->payment_methods = $this->payment->get_payment_methods(array('delivery_id'=>$delivery->id, 'enabled'=>1));
$this->design->assign('all_currencies', $this->money->get_currencies());
/*/order-on-one-page*/
$this->design->assign('deliveries', $deliveries);
// Варианты оплаты
$payment_methods = $this->payment->get_payment_methods(array('enabled'=>1));
$this->design->assign('payment_methods', $payment_methods);
$features = $this->features->get_features(array('in_variant'=>1));
foreach($features AS $f){
$feat[$f->id] = $f;
}
$this->design->assign('features', $feat);
// Данные пользователя
if($this->user)
{
$last_order = reset($this->orders->get_orders(array('user_id'=>$this->user->id, 'limit'=>1)));
if($last_order)
{
$this->design->assign('name', $last_order->name);
$this->design->assign('name2', $last_order->name2);
$this->design->assign('email', $last_order->email);
$this->design->assign('phone', $last_order->phone);
$this->design->assign('country', $order->country);
$this->design->assign('region', $order->region);
$this->design->assign('city', $order->city);
$this->design->assign('indx', $order->indx);
$this->design->assign('address', $last_order->address);
}
else
{
$this->design->assign('name', $this->user->name);
$this->design->assign('email', $this->user->email);
}
}
// Если существуют валидные купоны, нужно вывести инпут для купона
if($this->coupons->count_coupons(array('valid'=>1))>0)
$this->design->assign('coupon_request', true);
/*
// Связанные товары
$related_ids = array();
$cart = $this->cart->get_cart();
$purchases_ids = array();
foreach($cart->purchases as $purchase)
{
$purchases_ids[] = $purchase->product->id;
}
foreach($cart->purchases as $purchase)
{
$related = $this->products->get_related_products($purchase->product->id);
foreach($related as $r)
if(!in_array($r->related_id, $related_ids) && !in_array($r->related_id, $purchases_ids))
$related_ids[] = $r->related_id;
}
if(!empty($related_ids))
{
foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
$related_products[$p->id] = $p;
$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
foreach($related_products_images as $related_product_image)
if(isset($related_products[$related_product_image->product_id]))
$related_products[$related_product_image->product_id]->images[] = $related_product_image;
$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
foreach($related_products_variants as $related_product_variant)
{
if(isset($related_products[$related_product_variant->product_id]))
{
$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach($related_products as $id=>$r)
{
if(is_object($r))
{
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
}
else
{
unset($related_products[$id]);
}
}
$this->design->assign('related_products', $related_products);
}
*/
$this->design->assign('meta_title', 'Корзина товаров в');
$this->design->assign('meta_description', 'Корзина покупок, способы доставки и оплаты на сайте atomicgarage.1gb.ru - продажа и установка товаров для тюнинга автомобилей в Санкт-Петербурге.');
$this->design->assign('meta_keywords', 'корзина, заказ, товары, тюнинг, автомобиль, магазин, carheart, установочный центр, санкт-петербург, доставка по россии');
// Выводим корзину
return $this->design->fetch('cart.tpl');
}
}

69
view/FeedbackView.php Normal file
View File

@@ -0,0 +1,69 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Отображение статей на сайте
* Этот класс использует шаблоны articles.tpl и article.tpl
*
*/
require_once('View.php');
class FeedbackView extends View
{
function fetch()
{
if($this->request->method('post') && $this->request->post('feedback'))
{
$feedback->name = $this->request->post('name');
$feedback->email = $this->request->post('email');
$feedback->message = $this->request->post('message');
$captcha_code = $this->request->post('captcha_code');
$this->design->assign('name', $feedback->name);
$this->design->assign('email', $feedback->email);
$this->design->assign('message', $feedback->message);
if(empty($feedback->name))
$this->design->assign('error', 'empty_name');
elseif(empty($feedback->email))
$this->design->assign('error', 'empty_email');
elseif(empty($feedback->message))
$this->design->assign('error', 'empty_text');
elseif(empty($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
{
$this->design->assign('error', 'captcha');
}
else
{
$this->design->assign('message_sent', true);
$feedback->ip = $_SERVER['REMOTE_ADDR'];
$feedback_id = $this->feedbacks->add_feedback($feedback);
// Отправляем email
$this->notify->email_feedback_admin($feedback_id);
// Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую
unset($_SESSION['captcha_code']);
}
}
if($this->page)
{
$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);
}
$body = $this->design->fetch('feedback.tpl');
return $body;
}
}

104
view/IndexView.php Normal file
View File

@@ -0,0 +1,104 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Этот класс использует шаблон index.tpl,
* который содержит всю страницу кроме центрального блока
* По get-параметру module мы определяем что сожержится в центральном блоке
*
*/
require_once('View.php');
class IndexView extends View
{
public $modules_dir = 'view/';
public function __construct()
{
parent::__construct();
}
/**
*
* Отображение
*
*/
function fetch()
{
//callback
if ($this->request->method('post') && $this->request->post('callback')) {
$callback->phone = $this->request->post('phone');
$callback->name = $this->request->post('name');
//$callback->message = $this->request->post('message');
$callback->message = "___";
//$callback->name = "no_name";
$this->design->assign('callname', $callback->name);
$this->design->assign('callemail', $callback->phone);
$this->design->assign('callmessage', $callback->message);
$this->design->assign('call_sent', true);
$callback_id = $this->callbacks->add_callback($callback);
// Отправляем email
$this->callbacks->email_callback_admin($callback_id);
}
// Содержимое корзины
$this->design->assign('cart', $this->cart->get_cart());
//print_r($this->categories->get_categories_tree()); die;
// Категории товаров
$this->design->assign('categories', $this->categories->get_categories_tree());
// Категории статей
$this->design->assign('articles_categories', $this->articles->get_categories_tree());
// Страницы
$this->design->assign('pages', $this->pages->get_pages(array('visible' => 1, 'parent' => 0)));
// Услуги
$this->design->assign('services_tree', $this->services->get_tree());
$this->design->assign('services_root', $this->services->get_root_url());
// Текущий модуль (для отображения центрального блока)
$module = $this->request->get('module', 'string');
$module = preg_replace("/[^A-Za-z0-9]+/", "", $module);
// Если не задан - берем из настроек
if (empty($module))
return false;
//$module = $this->settings->main_module;
// Создаем соответствующий класс
if (is_file($this->modules_dir . "$module.php")) {
include_once($this->modules_dir . "$module.php");
if (class_exists($module)) {
$this->main = new $module($this);
} else return false;
} else return false;
// Создаем основной блок страницы
if (!$content = $this->main->fetch()) {
return false;
}
// Передаем основной блок в шаблон
$this->design->assign('content', $content);
// Передаем название модуля в шаблон, это может пригодиться
$this->design->assign('module', $module);
// Создаем текущую обертку сайта (обычно index.tpl)
$wrapper = $this->design->smarty->getTemplateVars('wrapper');
if (is_null($wrapper))
$wrapper = 'index.tpl';
if (!empty($wrapper)) //{$this->body = $this->design->fetch($wrapper); var_dump($this->body); return $this->body;}
return $this->body = $this->design->fetch($wrapper);
else
return $this->body = $content;
}
}

106
view/LoginView.php Normal file
View File

@@ -0,0 +1,106 @@
<?PHP
require_once('View.php');
include $_SERVER['DOCUMENT_ROOT'] . '/modal-form/cp.php';
class LoginView extends View
{
function fetch()
{
// Выход
if($this->request->get('action') == 'logout')
{
unset($_SESSION['user_id']);
header('Location: '.$this->config->root_url);
exit();
}
// Вспомнить пароль
elseif($this->request->get('action') == 'password_remind')
{
// Если запостили email
if($this->request->method('post') && $this->request->post('email'))
{
$email = $this->request->post('email');
$this->design->assign('email', $email);
// Выбираем пользователя из базы
$user = $this->users->get_user($email);
if(!empty($user))
{
// Генерируем секретный код и сохраняем в сессии
$code = md5(uniqid($this->config->salt, true));
$_SESSION['password_remind_code'] = $code;
$_SESSION['password_remind_user_id'] = $user->id;
// Отправляем письмо пользователю для восстановления пароля
$this->notify->email_password_remind($user->id, $code);
$this->design->assign('email_sent', true);
}
else
{
$this->design->assign('error', 'user_not_found');
}
}
// Если к нам перешли по ссылке для восстановления пароля
elseif($this->request->get('code'))
{
// Проверяем существование сессии
if(!isset($_SESSION['password_remind_code']) || !isset($_SESSION['password_remind_user_id']))
return false;
// Проверяем совпадение кода в сессии и в ссылке
if($this->request->get('code') != $_SESSION['password_remind_code'])
return false;
// Выбераем пользователя из базы
$user = $this->users->get_user(intval($_SESSION['password_remind_user_id']));
if(empty($user))
return false;
// Залогиниваемся под пользователем и переходим в кабинет для изменения пароля
$_SESSION['user_id'] = $user->id;
header('Location: '.$this->config->root_url.'/user');
}
return $this->design->fetch('password_remind.tpl');
}
// Вход
elseif($this->request->method('post') && $this->request->post('login'))
{
$cp = new ReCaptcha('6LegdywdAAAAAJaQLxIlHnITncRtuHQu-HHxeAYG');
$cpResult = $cp->verifyResponse($_SERVER['REMOTE_ADDR'], $this->request->post('recaptcha_response'));
if (!$cpResult->success) {
$this->design->assign('error', 'recaptcha');
} else {
$email = $this->request->post('email');
$password = $this->request->post('password');
$this->design->assign('email', $email);
if($user_id = $this->users->check_password($email, $password))
{
$user = $this->users->get_user($email);
if($user->enabled)
{
$_SESSION['user_id'] = $user_id;
$this->users->update_user($user_id, array('last_ip'=>$_SERVER['REMOTE_ADDR']));
// Перенаправляем пользователя на прошлую страницу, если она известна
if(!empty($_SESSION['last_visited_page']))
header('Location: '.$_SESSION['last_visited_page']);
else
header('Location: '.$this->config->root_url);
}
else
{
$this->design->assign('error', 'user_disabled');
}
}
else
{
$this->design->assign('error', 'login_incorrect');
}
}
}
return $this->design->fetch('login.tpl');
}
}

43
view/MainView.php Normal file
View File

@@ -0,0 +1,43 @@
<?PHP
/**
* Simpla CMS
* Storefront class: Каталог товаров
*
* Этот класс использует шаблоны hits.tpl
*
* @copyright 2010 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
*
*
*/
require_once('View.php');
class MainView extends View
{
function fetch()
{
if ($this->page) {
$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);
$this->design->assign('page', $this->page);
}
// Страницы (услуги) на главной
$home_services = $this->services->get_home_services(true, true);
$this->design->assign('home_services', $home_services);
//mobile detect class
require_once($_SERVER['DOCUMENT_ROOT'] . '/mobiledetect/Mobile_Detect.php');
$detect = new Mobile_Detect;
$this->design->assign('detect', $detect);
return $this->design->fetch('main.tpl');
}
}

182
view/OrderView.php Normal file
View File

@@ -0,0 +1,182 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2009 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Корзина покупок
* Этот класс использует шаблон cart.tpl
*
*/
require_once('View.php');
class OrderView extends View
{
public function __construct()
{
parent::__construct();
$this->design->smarty->registerPlugin("function", "checkout_form", array($this, 'checkout_form'));
}
//////////////////////////////////////////
// Основная функция
//////////////////////////////////////////
function fetch()
{
// Скачивание файла
if($this->request->get('file'))
{
return $this->download();
}
else
{
return $this->fetch_order();
}
}
function fetch_order()
{
if($url = $this->request->get('url', 'string'))
$order = $this->orders->get_order((string)$url);
elseif(!empty($_SESSION['order_id']))
$order = $this->orders->get_order(intval($_SESSION['order_id']));
else
return false;
if(!$order)
return false;
$purchases = $this->orders->get_purchases(array('order_id'=>intval($order->id)));
if(!$purchases)
return false;
if($this->request->method('post'))
{
if($payment_method_id = $this->request->post('payment_method_id', 'integer'))
{
$this->orders->update_order($order->id, array('payment_method_id'=>$payment_method_id));
$order = $this->orders->get_order((integer)$order->id);
}
elseif($this->request->post('reset_payment_method'))
{
$this->orders->update_order($order->id, array('payment_method_id'=>null));
$order = $this->orders->get_order((integer)$order->id);
}
}
$products_ids = array();
$variants_ids = array();
foreach($purchases as $purchase)
{
$products_ids[] = $purchase->product_id;
$variants_ids[] = $purchase->variant_id;
}
$products = array();
foreach($this->products->get_products(array('id'=>$products_ids)) as $p)
$products[$p->id] = $p;
$images = $this->products->get_images(array('product_id'=>$products_ids));
foreach($images as $image)
$products[$image->product_id]->images[] = $image;
$variants = array();
foreach($this->variants->get_variants(array('id'=>$variants_ids)) as $v)
$variants[$v->id] = $v;
foreach($variants as $variant)
$products[$variant->product_id]->variants[] = $variant;
foreach($purchases as &$purchase)
{
$purchase->options = unserialize($purchase->options);
if(!empty($products[$purchase->product_id]))
$purchase->product = $products[$purchase->product_id];
if(!empty($variants[$purchase->variant_id]))
{
$purchase->variant = $variants[$purchase->variant_id];
}
}
$feat = $this->features->get_features(array('in_variant'=>1));
foreach($feat AS $fe){
$feat[$fe->id] = $fe;
}
$this->design->assign('features', $feat);
// Способ доставки
$delivery = $this->delivery->get_delivery($order->delivery_id);
$this->design->assign('delivery', $delivery);
$this->design->assign('order', $order);
$this->design->assign('purchases', $purchases);
// Способ оплаты
if($order->payment_method_id)
{
$payment_method = $this->payment->get_payment_method($order->payment_method_id);
$this->design->assign('payment_method', $payment_method);
}
// Варианты оплаты
$payment_methods = $this->payment->get_payment_methods(array('delivery_id'=>$order->delivery_id, 'enabled'=>1));
$this->design->assign('payment_methods', $payment_methods);
// Все валюты
$this->design->assign('all_currencies', $this->money->get_currencies());
// Выводим заказ
return $this->body = $this->design->fetch('order.tpl');
}
private function download()
{
$file = $this->request->get('file');
if(!$url = $this->request->get('url', 'string'))
return false;
$order = $this->orders->get_order((string)$url);
if(!$order)
return false;
if(!$order->paid)
return false;
// Проверяем, есть ли такой файл в покупках
$query = $this->db->placehold("SELECT p.id FROM __purchases p, __variants v WHERE p.variant_id=v.id AND p.order_id=?", $order->id);
$this->db->query($query);
if($this->db->num_rows()==0)
return false;
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Content-Length: ".filesize($this->config->root_dir.$this->config->downloads_dir.$file));
print file_get_contents($this->config->root_dir.$this->config->downloads_dir.$file);
exit();
}
public function checkout_form($params, &$smarty)
{
$module_name = preg_replace("/[^A-Za-z0-9]+/", "", $params['module']);
$form = '';
if(!empty($module_name) && is_file("payment/$module_name/$module_name.php"))
{
include_once("payment/$module_name/$module_name.php");
$module = new $module_name();
$form = $module->checkout_form($params['order_id'], $params['button_text']);
}
return $form;
}
}

403
view/PageView.php Normal file
View File

@@ -0,0 +1,403 @@
<?PHP
//die;
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблон page.tpl
* header("HTTP/1.0 404 Not Found");
* header("Status: 404 Not Found");
* Header( "Location: /404.php" );
* exit;
*/
require_once('View.php');
class PageView extends View
{
function fetch()
{
$url = $this->request->get('page_url', 'string');
$page = $this->pages->get_page($url);
// Отображать скрытые страницы только админу
if (empty($page) || (!$page->visible && empty($_SESSION['admin'])))
return false;
$urlNow = $page->parentUrl . $url . '/';
if (isset($_GET['page']) && $_GET['page']) $urlNow .= 'page-' . $_GET['page'] . '/';
$requestUri = explode('?', $_SERVER['REQUEST_URI']);
if ($urlNow != $requestUri[0] && $urlNow != '/tuning-centr/tuning-centr/') {
if ($urlNow != '/404/')
header('HTTP/1.1 301 Moved Permanently');
else {
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
}
header('Location: ' . $urlNow);
}
if (!empty($_COOKIE['stat_hash'])) {
$u = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$this->pages->db->query("SELECT * FROM __visited WHERE stat_hash = '" . $_COOKIE['stat_hash'] . "' AND url_hash = '" . md5($u) . "' LIMIT 1");
if (!$this->pages->db->num_rows()) {
$this->pages->db->query("INSERT INTO __visited SET
url = '$u',
url_hash = '" . md5($u) . "',
stat_hash = '" . $_COOKIE['stat_hash'] . "',
date = NOW()
");
$page->visited++;
$update_visited->visited = $page->visited;
$this->pages->update_page($page->id, $update_visited);
}
}
$filter['show_home'] = 1;
$items = $this->pages->get_pages($filter);
foreach ($items as $item) {
$startPage = $this->pages->getStartPage($item->parent, 28);
$item->startId = $startPage->id;
}
$this->design->assign('service_items_start', (object)$service_items_start);
$this->design->assign('service_items', $items);
$sfilter['show_service'] = 1;
$services = $this->pages->get_pages($sfilter);
foreach ($services as $item) {
$startPage = $this->pages->getStartPage($item->parent, 28);
$item->startId = $startPage->id;
}
$this->design->assign('just_service_items', $services);
ob_start();
$this->getSubServices(28, $page->id);
$service_menu = ob_get_clean();
$this->design->assign('service_menu', $service_menu); //echo $service_menu;die;
// Отображать скрытые страницы только админу
if (empty($page) || (!$page->visible && empty($_SESSION['admin'])))
return false;
// Вложеные страницы
$sub_pages = $this->pages->get_pages(array('parent' => $page->id));
$this->design->assign('sub_pages', $sub_pages);
// хлебные крошки
$breadcrumb = $this->pages->get_breadcrumb($page->id);
$this->design->assign('breadcrumb', $breadcrumb);
$page->body = preg_replace_callback('~<img.*class=.*zooming2[^>]*>~Uis', array($this, 'resizeBodyImages'), $page->body);
$page->body = $this->setPageGalleries($page->body);
$this->design->assign('page', $page);
$this->design->assign('meta_title', $page->meta_title ?: $page->name);
$this->design->assign('meta_keywords', $page->meta_keywords);
$this->design->assign('meta_description', $page->meta_description);
/////////////////////////////////// sitemap //
if ($url == 'sitemap') {
ob_start();
//$this->pages->db->query("SELECT url,name FROM __pages WHERE menu_id=1 AND visible=1 ORDER BY position");
$this->pages->db->query("SELECT id,url,name FROM __pages WHERE parent=0 AND visible=1 ORDER BY name");
echo '<ul>';
foreach ($this->pages->db->results() as $row) {
if ($row->id == 5 || $row->id == 182) continue;
if ($row->url == 'aktsii') $row->url = 'actions';
$url = $row->url ? '/' . $row->url . '/' : '/';
echo '<li><a href="' . $url . '">' . $row->name . '</a>';
echo '</li>';
}
echo '</ul>';
echo '<div class="row"><div class="col-md-6">';
echo '<div class="title" data-page="5">Каталог продукции</div>';
$this->getCats();
echo '</div>';
echo '<div class="col-md-6"><div class="title">Услуги тюнинг центра</div>';
$this->getServices();
echo '</div></div>';
$page->body .= ob_get_clean();
}
/////////////////////////////////// end sitemap //
/////////////////////////////////// otzyvy //
if ($url == 'otzyvy') {
if (strpos($_SERVER['REQUEST_URI'], '?page=') !== false) {
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;
}
//require_once ($_SERVER['DOCUMENT_ROOT'] . '/feedback/Img.php');
$limit = 0;
if (isset($_GET['page'])) $limit = ($_GET['page'] - 1) * 10;
$sql = (!empty($_SESSION['admin'])) ? "SELECT * FROM `__feedback` WHERE `parent_id`=0 ORDER BY `id` DESC LIMIT " . $limit . ',10' : "SELECT * FROM `__feedback` WHERE `active`=1 AND `parent_id`=0 ORDER BY `id` DESC LIMIT " . $limit . ',10';
$this->pages->db->query($sql);
$feedback = $ids = array();
foreach ($this->pages->db->results() as $row) {
$row->style = (!empty($_SESSION['admin']) && !$row->active) ? 'feedback_not' : '';
$feedback[] = $row;
$ids[] = $row->id;
}
$this->pages->db->query("SELECT * FROM `__feedback` WHERE `parent_id` IN(" . implode(',', $ids) . ") ORDER BY `id` ");
$feedback_replies = array();
foreach ($this->pages->db->results() as $row) {
$ids[] = $row->id;
$feedback_replies[$row->parent_id] = $row;
}
$this->pages->db->query("SELECT * FROM `__feedback_images` WHERE `feedback_id` IN(" . implode(',', $ids) . ") ORDER BY `id` ");
$feedback_imgs = array();
foreach ($this->pages->db->results() as $row) {
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . '/feedback/images/' . $row->name))
continue;
$row->img = Img::get('/feedback/images/' . $row->name, array('width' => 112, 'height' => 112));
if (!isset($feedback_imgs[$row->feedback_id]))
$feedback_imgs[$row->feedback_id] = array();
$feedback_imgs[$row->feedback_id][] = $row;
}
$this->design->assign('feedback', $feedback);
$this->design->assign('feedback_replies', $feedback_replies);
$this->design->assign('feedback_imgs', $feedback_imgs);
if (isset($_GET['edit']) || isset($_GET['reply'])) {
$fid = isset($_GET['edit']) ? $_GET['edit'] : $_GET['reply'];
$this->pages->db->query("SELECT * FROM `__feedback` WHERE `id` = '" . (int)$fid . "' ");
$this->design->assign('feed_row', $this->pages->db->result());
}
/// paginator
$sql = (!empty($_SESSION['admin'])) ? "SELECT * FROM `__feedback` WHERE `parent_id`=0" : "SELECT * FROM `__feedback` WHERE `active`=1 AND `parent_id`=0";
$this->pages->db->query($sql);
$tpn = ceil($this->pages->db->num_rows() / 10);
$this->design->assign('total_pages_num', $tpn);
$p = isset($_GET['page']) ? $_GET['page'] : 1;
$this->design->assign('current_page_num', $p);
if (isset($_GET['page'])) {
$page->header .= ' - страница ' . $p;
$page->body = '';
$this->design->assign('page', $page);
}
}
/////////////////////////////////// end otzyvy //
// Связанные объекты
$related_objects = $this->pages->get_related_objects(array('id' => $page->id));
if (!empty($related_objects)) {
$r_products = array();
$r_pages = array();
$r_articles = array();
foreach ($related_objects as &$r_p)
if ($r_p->type == 'product')
$r_products[$r_p->object_id] = &$r_p;
elseif ($r_p->type == 'page')
$r_pages[$r_p->object_id] = &$r_p;
elseif ($r_p->type == 'article')
$r_articles[$r_p->object_id] = &$r_p;
if (!empty($r_products)) {
//echo '<!-- @@@1'; print_r($r_products); echo '-->';
// foreach($this->products->get_products(array('id'=>array_keys($r_products), 'in_stock'=>1, 'visible'=>1)) as $p)
foreach ($this->products->get_products(array('id' => array_keys($r_products), 'visible' => 1)) as $p)
$r_products[$p->id] = $p;
//echo '<!-- @@@2'; print_r($r_products); echo '-->';
$r_products_images = $this->products->get_images(array('product_id' => array_keys($r_products)));
foreach ($r_products_images as $related_product_image)
if (isset($r_products[$related_product_image->product_id]))
$r_products[$related_product_image->product_id]->images[] = $related_product_image;
$r_products_variants = $this->variants->get_variants(array('product_id' => array_keys($r_products), 'instock' => true));
foreach ($r_products_variants as $related_product_variant) {
if (isset($r_products[$related_product_variant->product_id])) {
$r_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach ($r_products as $id => $r) {
if (is_object($r)) {
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
} else {
unset($r_products[$id]);
}
}
}
if (!empty($r_pages)) {
$temp_pages = $this->pages->get_pages(array('id' => array_keys($r_pages)));
foreach ($temp_pages as $temp_page)
$r_pages[$temp_page->id] = $temp_page;
}
if (!empty($r_articles)) {
$temp_pages = $this->articles->get_articles(array('id' => array_keys($r_articles)));
foreach ($temp_pages as $temp_page)
$r_articles[$temp_page->id] = $temp_page;
}
$this->design->assign('related_products', $r_products);
$this->design->assign('related_pages', $r_pages);
$this->design->assign('related_articles', $r_articles);
}
if ($url == 'catalog') {
$catalog_categories = array();
$this->pages->db->query("SELECT * FROM __categories WHERE visible=1 AND parent_id=0 ORDER BY position,name");
foreach ($this->pages->db->results() as $row) {
if (!$row->image) $row->image = 'empty2.jpg';
$catalog_categories[] = $row;
}
$this->design->assign('catalog_categories', $catalog_categories);
}
$show_catalog_link = 0;
if (strpos($_SERVER['REQUEST_URI'], '/uslugi/') === 0) $show_catalog_link = 1;
$this->design->assign('show_catalog_link', $show_catalog_link);
return $this->design->fetch('page.tpl');
}
function getServices($parent_id = 28)
{
$this->pages->db->query("SELECT url,name,id FROM __pages WHERE visible=1 AND parent=" . $parent_id . " ORDER BY position");
if (!$this->pages->db->num_rows()) return;
echo '<ul>';
foreach ($this->pages->db->results() as $row) {
echo '<li><a href="/tuning-centr/' . $row->url . '/">' . $row->name . '</a>' . "\n";
$this->getServices($row->id);
echo '</li>';
}
echo '</ul>' . "\n";
}
function getSubServices($parent_id, $page_id, $level = 0)
{
$this->pages->db->query("SELECT url,name,id FROM __pages WHERE visible=1 AND parent=" . $parent_id . " ORDER BY position");
if (!$this->pages->db->num_rows()) return;
echo '<ul data-t="y">';
foreach ($this->pages->db->results() as $row) {
if ($row->id == $page_id) {
$active = ' class="active" ';
} else {
$active = '';
}
echo '<li ' . $active . ' ><a href="/tuning-centr/' . $row->url . '/">' . $row->name . '</a>';
if ($parent_id == $page_id or $level == 0) {
$this->getSubServices($row->id, $page_id, $level);
}
echo '</li>';
}
$level++;
echo '</ul>';
}
function setPageGalleries($text)
{
$text = preg_replace_callback('~\{gallery([ ]+)id=([0-9]+)\}~Uis', array($this, '_setPageGalleries'), $text);
if (strpos($text, 'flexslider-gallery')) {
$text .= '<script> $(document).ready(function(){
$(".flexslider-gallery").bxSlider({
slideWidth: 210,
//minSlides: 2,
maxSlides: 6,
slideMargin: 5,
pager: false
});
}); </script>';
}
//echo $text; die;
return $text;
}
function resizeBodyImages($m)
{
preg_match('~src=["\'](.*)["\']~Uis', $m[0], $img);
if (empty($img[1])) return $m[0];
preg_match('~title=["\'](.*)["\']~Uis', $m[0], $title);
preg_match('~alt=["\'](.*)["\']~Uis', $m[0], $alt);
$alt = isset($alt[1]) ? $alt[1] : '';
$title = isset($title[1]) ? $title[1] : '';
$src = Img::get(urldecode($img[1]), array('width' => 400, 'height' => 300, 'crop' => true));
$tl = $title ? '<div class="zooming2-title">' . $title . '</div>' : '';
return '<div class="col-sm-6 mb">' . $tl . '<img alt="' . $alt . '" class="zooming2 zooming-ready" src="' . $src . '" title="' . $title . '"></div>' . "\n";
}
function _setPageGalleries($m)
{ // return '';
if (empty($m[2])) return '';
$this->db->query("SELECT * FROM s_banners WHERE `visible`=1 AND `id_group` = ? ORDER BY `position`", (int)$m[2]);
$banners = $this->db->results();
if (!$banners) return '';
$out = '<div class="flexslider-gallery">';
foreach ($banners as $row) {
$width = 210;
$height = 150;
$src = Img::get('files/banners/' . $row->image, array('width' => 210, 'height' => 150));
/*$src = $this->image->add_resize_params('/files/banners/'.$row->image , $width, $height, false);
if(!is_file($_SERVER['DOCUMENT_ROOT'].$src)){
$this->image->image_constrain_gd($_SERVER['DOCUMENT_ROOT'].'/files/banners/'.$row->image, $_SERVER['DOCUMENT_ROOT'].$src, $width, $height);
}*/
$out .= '<div class="slide"><a class="fancybox" href="/files/banners/' . $row->image . '" rel="page-gallery-' . $m[2] . '"><img src="' . $src . '"></a></div>';
}
return $out .= '</div>';
}
function getCats($parent_id = 0)
{
$this->pages->db->query("SELECT url, name, id FROM __categories WHERE visible=1 AND parent_id=" . $parent_id . " ORDER BY name");
if (!$this->pages->db->num_rows())
return;
echo '<ul>';
foreach ($this->pages->db->results() as $row) {
echo '<li><a href="/catalog/' . $row->url . '/">' . $row->name . '</a>';
$this->getCats($row->id);
echo '</li>';
}
echo '</ul>';
}
}

328
view/ProductView.php Normal file
View File

@@ -0,0 +1,328 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2011 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
* Этот класс использует шаблон product.tpl
*
*/
require_once('View.php');
include $_SERVER['DOCUMENT_ROOT'] . '/modal-form/cp.php';
class ProductView extends View
{
function fetch()
{
require_once($_SERVER['DOCUMENT_ROOT'] . '/mobiledetect/Mobile_Detect.php');
$detect = new Mobile_Detect;
$this->design->assign('detect', $detect);
//print_r($_SESSION);die;
$product_url = $this->request->get('product_url', 'string');
//$this->design->assign('additional_title', ' Санкт-Петербурге');
if(empty($product_url))
return false;
// Выбираем товар из базы
$product = $this->products->get_product((string)$product_url);
if(empty($product) || (!$product->visible && empty($_SESSION['admin'])))
return false;
if($product->visible && empty($_SESSION['admin']))
$this->products->update_views($product->id);
$product->images = $this->products->get_images(array('product_id'=>$product->id));
$product->image = &$product->images[0];
$variants = array();
//foreach($this->variants->get_variants(array('product_id'=>$product->id, 'in_stock'=>true)) as $v)
foreach($this->variants->get_variants(array('product_id'=>$product->id)) as $v)
$variants[$v->id] = $v;
$product->variants = $variants;
$featuresvars = array();
$options2 = $this->features->get_product_variant_options($product->id);
if(is_array($options2)){
foreach($options2 as $option){
$product->variants[$option->id_veriant]->options[$option->feature_id][] = $option;
$featuresvars[$option->feature_id][] = $option->value;
}
}
foreach($featuresvars AS $index=>$arr){
sort($arr);
$temp[$index] = array_unique($arr);
}
//$featuresvars = $temp;
$featuresvars = $this->features->get_features(array('id'=>array_keys($featuresvars)));
foreach($featuresvars AS &$featur){
if($temp[$featur->id])
$featur->options = $temp[$featur->id];
}
$this->design->assign('featuresvars', $featuresvars);
//$this->design->assign('options2', $options2);
// Вариант по умолчанию
if(($v_id = $this->request->get('variant', 'integer'))>0 && isset($variants[$v_id]))
$product->variant = $variants[$v_id];
else
$product->variant = reset($variants);
$product->features = $this->features->get_product_options(array('product_id'=>$product->id,'on_prod'=>1));
// Автозаполнение имени для формы комментария
if(!empty($this->user))
$this->design->assign('comment_name', $this->user->name);
// Принимаем комментарий
if ($this->request->method('post') && $this->request->post('comment'))
{
$comment->name = $this->request->post('name');
$comment->text = $this->request->post('text');
// Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму
$this->design->assign('comment_text', $comment->text);
$this->design->assign('comment_name', $comment->name);
$cp = new ReCaptcha('6LegdywdAAAAAJaQLxIlHnITncRtuHQu-HHxeAYG');
$cpResult = $cp->verifyResponse($_SERVER['REMOTE_ADDR'], $this->request->post('recaptcha_response'));
if (!$cpResult->success) {
$this->design->assign('error', 'recaptcha');
}
elseif (empty($comment->name))
{
$this->design->assign('error', 'empty_name');
}
elseif (empty($comment->text))
{
$this->design->assign('error', 'empty_comment');
}
else
{
// Создаем комментарий
$comment->object_id = $product->id;
$comment->type = 'product';
$comment->ip = $_SERVER['REMOTE_ADDR'];
// Если были одобренные комментарии от текущего ip, одобряем сразу
$this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip);
if($this->db->num_rows()>0)
$comment->approved = 1;
// Добавляем комментарий в базу
if($this->request->post('email') == '' )
$comment_id = $this->comments->add_comment($comment);
// Отправляем email
$this->notify->email_comment_admin($comment_id);
header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id);
}
}
// Комментарии к товару
$comments = $this->comments->get_comments(array('type'=>'product', 'object_id'=>$product->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
$this->design->assign('comments', $comments);
// Связанные товары
$related_ids = array();
$related_products = array();
foreach($this->products->get_related_products($product->id) as $p)
{
$related_ids[] = $p->related_id;
$related_products[$p->related_id] = null;
}
if(!empty($related_ids))
{
foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
$related_products[$p->id] = $p;
$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
foreach($related_products_images as $related_product_image)
if(isset($related_products[$related_product_image->product_id]))
$related_products[$related_product_image->product_id]->images[] = $related_product_image;
$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
foreach($related_products_variants as $related_product_variant)
{
if(isset($related_products[$related_product_variant->product_id]))
{
$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach($related_products as $id=>$r)
{
if(is_object($r))
{
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
}
else
{
unset($related_products[$id]);
}
}
$this->design->assign('related_products', $related_products);
}
else {
$products->categories = $this->categories->get_categories(array('product_id'=>$product->id));
$category = reset($products->categories);
$related_products = array();
$after = false;
$products = $this->products->get_products(array('category_id' => $category->id, 'limit' => 100, 'in_stock'=>1, 'visible'=>1));
foreach($products as $p)
{
if($after && count($related_products) < 6)
$related_products[$p->id] = $p;
elseif($p->id == $product->id)
$after = true;
}
if(count($related_products) < 6)
foreach($products as $p)
if($p->id != $product->id && count($related_products) < 6)
$related_products[$p->id] = $p;
else break;
$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
foreach($related_products_images as $related_product_image)
if(isset($related_products[$related_product_image->product_id]))
$related_products[$related_product_image->product_id]->images[] = $related_product_image;
$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'instock'=>true));
foreach($related_products_variants as $related_product_variant)
{
if(isset($related_products[$related_product_variant->product_id]))
{
$related_product_variant->price *= (100-$discount)/100;
$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach($related_products as $r)
{
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
}
$this->design->assign('related_products', $related_products);
}
// Отзывы о товаре
$comments = $this->comments->get_comments(array('type'=>'product', 'object_id'=>$product->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR']));
// Соседние товары
$this->design->assign('next_product', $this->products->get_next_product($product->id));
$this->design->assign('prev_product', $this->products->get_prev_product($product->id));
// И передаем его в шаблон
$this->design->assign('product', $product);
$this->design->assign('comments', $comments);
// Категория и бренд товара
$product->categories = $this->categories->get_categories(array('product_id'=>$product->id));
$this->design->assign('brand', $this->brands->get_brand(intval($product->brand_id)));
$this->design->assign('category', reset($product->categories));
// Категории товаров
$this->design->assign('categories', $this->categories->get_categories_tree());
// Добавление в историю просмотров товаров
$max_visited_products = 100; // Максимальное число хранимых товаров в истории
$expire = time()+60*60*24*30; // Время жизни - 30 дней
if(!empty($_COOKIE['browsed_products']))
{
$browsed_products = explode(',', $_COOKIE['browsed_products']);
// Удалим текущий товар, если он был
if(($exists = array_search($product->id, $browsed_products)) !== false)
unset($browsed_products[$exists]);
}
// Добавим текущий товар
$browsed_products[] = $product->id;
$cookie_val = implode(',', array_slice($browsed_products, -$max_visited_products, $max_visited_products));
setcookie("browsed_products", $cookie_val, $expire, "/");
// Связанные объекты
$related_objects = $this->articles->get_related_articles(array('id'=>$product->id,'type'=>'product'));
if(!empty($related_objects))
{
foreach($related_objects as $related_a)
$r_articles[$related_a->article_id] = $related_a;
$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;
$this->design->assign('related_articles', $r_articles);
}
// if(!$product->meta_keywords){
$ssid = $this->categories->get_product_categories($product->id);
$this->db->query("SELECT id, name FROM __categories WHERE id=?", $ssid[0]->category_id);
$rows = $this->db->results();
$cname = $rows[0]->name;
// }
// echo $rows[0]->id;
/*
if(!$product->meta_title && $rows[0]->id == 443) $product->meta_title = $product->name.' в' ;
if(!$product->meta_keywords && $rows[0]->id == 443) $product->meta_keywords = $product->name.', для автомобиля, купить, цена, спб, установка, тюнинг, интернет-магазин carheart';
if(!$product->meta_description && $rows[0]->id == 443) $product->meta_description = 'В продаже '.$product->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа товаров для тюнинга авто.';
*/
$lowerName = htmlspecialchars(mb_strtolower($product->name, 'utf-8'));
$minPrice = $this->getMinPrice($product->variants);
if(!$product->meta_title) $product->meta_title = htmlspecialchars($product->name) . ' - купить в Санкт-Петербурге | Тюнинг центр';
if(!$product->meta_description){
if($minPrice != 0) $product->meta_description = $product->name . ' - купить в Санкт-Петербурге по цене '. number_format($minPrice, 0, '', ' ') .' руб. | Низкие цены, большой выбор, доставка по всей России - Интернет-магазин Atomic Garage - установка линз, тюнинг и ремонт фар, ПТФ, ДХО автомобиля.';
else $product->meta_description = $product->name . ' - купить в Санкт-Петербурге | Низкие цены, большой выбор, доставка по всей России - Интернет-магазин Atomic Garage - установка линз, тюнинг и ремонт фар, ПТФ, ДХО автомобиля.';
}
if(!$product->meta_keywords) $product->meta_keywords = $lowerName . ', купить, для автомобиля, авто, санкт-петербург, россия, доставка, цена, установка, тюнинг центр, линзы, оптика, фары, фонари, птф, ремонт';
$this->design->assign('meta_title', $product->meta_title);
$this->design->assign('meta_keywords', $product->meta_keywords);
$this->design->assign('meta_description', $product->meta_description);
if($product->product_h1 == '') $product->product_h1 = $product->name;
$this->design->assign('product_h1', $product->product_h1);
$adminBtn = '';
if(isset($_SESSION['admin']) && $_SESSION['admin'] == 'admin') $adminBtn = '/simpla/index.php?module=ProductAdmin&id=' . $product->id;
$this->design->assign('adminBtn', $adminBtn);
return $this->design->fetch('product.tpl');
}
function getMinPrice($variants){
$minPrice = 0;
foreach($variants as $row){
if($minPrice == 0 || $minPrice > $row->price) $minPrice = $row->price;
}
return $minPrice;
}
function lcfirst( $str ) {
$str = mb_strtolower( mb_substr($str, 0, 1) ) . mb_substr($str, 1);
return $str;
}
}

469
view/ProductsView.php Normal file
View File

@@ -0,0 +1,469 @@
<?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;
}

59
view/RegisterView.php Normal file
View File

@@ -0,0 +1,59 @@
<?PHP
require_once('View.php');
class RegisterView extends View
{
function fetch()
{
$default_status = 1; // Активен ли пользователь сразу после регистрации (0 или 1)
if($this->request->method('post') && $this->request->post('register'))
{
$name = $this->request->post('name');
$email = $this->request->post('email');
$password = $this->request->post('password');
$captcha_code = $this->request->post('captcha_code');
$recaptcha = $this->request->post('recaptcha_response');
$recaptchaIsValid = false;
if (!empty($recaptcha)) {
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = '6LegdywdAAAAAJaQLxIlHnITncRtuHQu-HHxeAYG';
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
$recaptchaIsValid = $recaptcha->score >= 0.7;
}
$this->design->assign('name', $name);
$this->design->assign('email', $email);
$this->db->query('SELECT count(*) as count FROM __users WHERE email=?', $email);
$user_exists = $this->db->result('count');
if($user_exists)
$this->design->assign('error', 'user_exists');
elseif(empty($name))
$this->design->assign('error', 'empty_name');
elseif(empty($email))
$this->design->assign('error', 'empty_email');
elseif(empty($password))
$this->design->assign('error', 'empty_password');
elseif (empty($recaptcha) || !$recaptchaIsValid) {
$this->design->assign('error', 'recaptcha');
}
elseif($user_id = $this->users->add_user(array('name'=>$name, 'email'=>$email, 'password'=>$password, 'enabled'=>$default_status, 'last_ip'=>$_SERVER['REMOTE_ADDR'])))
{
$_SESSION['user_id'] = $user_id;
if(!empty($_SESSION['last_visited_page']))
header('Location: '.$_SESSION['last_visited_page']);
else
header('Location: '.$this->config->root_url);
}
else
$this->design->assign('error', 'unknown error');
}
return $this->design->fetch('register.tpl');
}
}

63
view/SearchView.php Normal file
View File

@@ -0,0 +1,63 @@
<?php
require_once('View.php');
class SearchView extends View {
function fetch(){
$keyword = $this->request->get('keyword', 'string');
$this->db->query('SELECT * FROM __categories
WHERE name LIKE "%'.mysql_real_escape_string($keyword).'%" AND visible=1 ORDER BY name');
$cats = $this->db->results();
$cats = $cats ? $this->_setHeader($cats, 'Разделы') : array();
foreach($cats as $product) if(isset($product->url)) $product->url = '/catalog/' . $product->url . '/';
$products = $this->products->get_products(array('keyword'=>$keyword));
$products = $products ? $this->_setHeader($products, 'Товары') : array();
foreach($products as $product) if(isset($product->url)) $product->url = '/products/' . $product->url . '/';
$articles = $this->articles->get_articles(array('keyword'=>$keyword));
$articles = $articles ? $this->_setHeader($articles, 'Выполненные работы') : array();
foreach($articles as $article) if(isset($article->url)) $article->url = '/article/' . $article->url . '/';
$pages = $this->pages->get_pages(array('keyword'=>$keyword, 'menu_id'=>3));
$pages = $pages ? $this->_setHeader($pages, 'Услуги') : array();
foreach($pages as $page) if(isset($page->url)) $page->url = $page->parentUrl . $page->url . '/';
$items = array_merge($pages, $cats, $products, $articles);
foreach($items as $item){
if(!isset($item->name)) continue;
$item->name = $this->_highlight($item->name, $keyword);
$item->annotation = !empty($item->annotation) ? $this->_highlight($item->annotation, $keyword) : $this->_highlight($item->name, $keyword);
}
$no_results = count($items) ? '' : 'По вашему запросу ничего не найдено.';
$this->design->assign('items', $items);
$this->design->assign('no_results', $no_results);
$this->design->assign('meta_title', 'Поиск по сайту');
$this->design->assign('meta_keywords', 'Для быстрого перехода, предлагаем воспользоваться поиском по сайту atomicgarage.1gb.ru.');
$this->design->assign('meta_description', 'поиск, по сайту, найти, товар, atomicgarage.1gb.ru');
return $this->design->fetch('search.tpl');
}
function _setHeader($items, $header){
if($items) array_unshift($items, (object)array('_header' => $header) );
return $items;
}
function _highlight($text, $key){
$keys = explode(' ', $key);
foreach($keys as $word){
if(mb_strlen($word, 'utf-8') > 1){
$text = str_ireplace($word, '<span style="background:#595611">' . $word . '</span>', $text);
}
}
return $text;
}
}

218
view/ServiceView.php Normal file
View File

@@ -0,0 +1,218 @@
<?php
require_once('View.php');
class ServiceView extends View
{
function fetch()
{
// обрабатываем url
$url = $this->request->get('page_url');
if (strpos($url, '?') > 0)
$url = substr($url, 0, strpos($url, '?'));
$url = trim($url, '/');
// получаем страницу
$page = $this->services->get($url);
if (empty($page))
return false;
// Отображать скрытые страницы только админу
if (!$page->visible && empty($_SESSION['admin']))
return false;
// обновляем счётчик посещения страницы
$this->update_visited($page->id, $page->visited);
// zoom изображений
$page->body = preg_replace_callback('~<img.*class=.*zooming2[^>]*>~Uis', array($this, 'resizeBodyImages'), $page->body);
// Обрабатываем галереи на странице
$page->body = $this->setPageGalleries($page->body);
// Главная ли это страница услуг
$is_main_page = $this->services->root_id === intval($page->id);
$this->design->assign('is_main_page', $is_main_page);
if ($is_main_page) {
//услуги главной страница
$this->design->assign('home_services', $this->services->get_home_services(true, true));
} elseif ($this->services->has_children($page->id)) {
// Вложенные страницы услуги, кроме брендовых
$this->design->assign('sub_pages', $this->services->all(array(
'parent' => $page->id, 'brand_id' => 0, 'visible' => 1
)));
}
// для небрендовых услуг получаем привязанные брендовые страницы
if (!$is_main_page && !$page->brand_id) {
$brands = array();
$brands_pages = $this->services->get_brands_pages($page->id, ['visible' => 1]);
//брендовые страницы существуют, нужно выводить блок услуги по брендам, готовим данные
if (!empty($brands_pages)) {
$active_ids = array();
foreach ($brands_pages as $bp)
$active_ids[$bp->brand_id] = $bp;
$brands = $this->services->get_all_brands(); //все бренды
foreach ($brands as $brand) {
if (array_key_exists($brand->id, $active_ids)) {
$brand->url = $active_ids[$brand->id]->url;
$brand->page_id = $active_ids[$brand->id]->id;
} else {
unset($brand->url);
}
}
}
$this->design->assign('service_brands', $brands);
}
// Хлебные крошки
if ($page->brand_id) {
$breadcrumbs = $this->services->get_path_to($page->parent);
$breadcrumbs[] = $page;
} else {
$breadcrumbs = $this->services->get_path_to($page->id);
}
$this->design->assign('breadcrumbs', $breadcrumbs);
// Связанные со страницей объекты
$this->assign_related($page->id);
$this->design->assign('page', $page);
return $this->design->fetch('services.tpl');
}
private function assign_related($page_id)
{
// Связанные объекты
$related_objects = $this->pages->get_related_objects(array('id' => $page_id));
if (empty($related_objects))
return;
$r_products = array();
$r_pages = array();
$r_articles = array();
foreach ($related_objects as &$r_p) {
if ($r_p->type == 'product')
$r_products[$r_p->object_id] = &$r_p;
elseif ($r_p->type == 'page')
$r_pages[$r_p->object_id] = &$r_p;
elseif ($r_p->type == 'article')
$r_articles[$r_p->object_id] = &$r_p;
}
if (!empty($r_products)) {
foreach ($this->products->get_products(array('id' => array_keys($r_products), 'visible' => 1)) as $p)
$r_products[$p->id] = $p;
$r_products_images = $this->products->get_images(array('product_id' => array_keys($r_products)));
foreach ($r_products_images as $related_product_image)
if (isset($r_products[$related_product_image->product_id]))
$r_products[$related_product_image->product_id]->images[] = $related_product_image;
$r_products_variants = $this->variants->get_variants(array('product_id' => array_keys($r_products), 'instock' => true));
foreach ($r_products_variants as $related_product_variant) {
if (isset($r_products[$related_product_variant->product_id])) {
$r_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
}
}
foreach ($r_products as $id => $r) {
if (is_object($r)) {
$r->image = &$r->images[0];
$r->variant = &$r->variants[0];
} else {
unset($r_products[$id]);
}
}
}
if (!empty($r_pages)) {
$temp_pages = $this->pages->get_pages(array('id' => array_keys($r_pages)));
foreach ($temp_pages as $temp_page)
$r_pages[$temp_page->id] = $temp_page;
}
if (!empty($r_articles)) {
$temp_pages = $this->articles->get_articles(array('id' => array_keys($r_articles)));
foreach ($temp_pages as $temp_page)
$r_articles[$temp_page->id] = $temp_page;
}
$this->design->assign('related_products', $r_products);
$this->design->assign('related_pages', $r_pages);
$this->design->assign('related_articles', $r_articles);
}
function setPageGalleries($text)
{
$text = preg_replace_callback('~\{gallery([ ]+)id=([0-9]+)\}~Uis', array($this, '_setPageGalleries'), $text);
if (strpos($text, 'flexslider-gallery')) {
$text .= '<script> $(document).ready(function(){
$(".flexslider-gallery").bxSlider({
slideWidth: 210,
//minSlides: 2,
maxSlides: 6,
slideMargin: 5,
pager: false
});
}); </script>';
}
return $text;
}
function _setPageGalleries($m)
{ // return '';
if (empty($m[2])) return '';
$this->db->query("SELECT * FROM s_banners WHERE `visible`=1 AND `id_group` = ? ORDER BY `position`", (int)$m[2]);
$banners = $this->db->results();
if (!$banners) return '';
$out = '<div class="flexslider-gallery">';
foreach ($banners as $row) {
$width = 210;
$height = 150;
$src = Img::get('files/banners/' . $row->image, array('width' => 210, 'height' => 150));
$out .= '<div class="slide"><a class="fancybox" href="/files/banners/' . $row->image . '" rel="page-gallery-' . $m[2] . '"><img src="' . $src . '"></a></div>';
}
$out .= '</div>';
return $out;
}
function resizeBodyImages($m)
{
preg_match('~src=["\'](.*)["\']~Uis', $m[0], $img);
if (empty($img[1])) return $m[0];
preg_match('~title=["\'](.*)["\']~Uis', $m[0], $title);
preg_match('~alt=["\'](.*)["\']~Uis', $m[0], $alt);
$alt = isset($alt[1]) ? $alt[1] : '';
$title = isset($title[1]) ? $title[1] : '';
$src = Img::get(urldecode($img[1]), array('width' => 400, 'height' => 300, 'crop' => true));
$tl = $title ? '<div class="zooming2-title">' . $title . '</div>' : '';
return '<div class="col-sm-6 mb">' . $tl . '<img alt="' . $alt . '" class="zooming2 zooming-ready" src="' . $src . '" title="' . $title . '"></div>' . "\n";
}
private function update_visited($page_id, $current_count)
{
if (empty($_SESSION['admin']) && !empty($_COOKIE['stat_hash'])) {
$u = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$this->db->query("SELECT * FROM __visited WHERE stat_hash = '" . $_COOKIE['stat_hash'] . "' AND url_hash = '" . md5($u) . "' LIMIT 1");
if (!$this->db->num_rows()) {
$this->db->query("INSERT INTO __visited SET
url = '$u',
url_hash = '" . md5($u) . "',
stat_hash = '" . $_COOKIE['stat_hash'] . "',
date = NOW()
");
$this->pages->update_page($page_id, array('visited' => ++$current_count));
}
}
}
}

158
view/UserView.php Normal file
View File

@@ -0,0 +1,158 @@
<?PHP
/**
* Simpla CMS
*
* @copyright 2009 Denis Pikusov
* @link http://simp.la
* @author Denis Pikusov
*
* Отображение статей на сайте
* Этот класс использует шаблоны articles.tpl и article.tpl
*
*/
require_once('View.php');
class UserView extends View
{
function fetch()
{
if(empty($this->user) && !$this->request->post('mailing_email'))
{
header('Location: '.$this->config->root_url.'/user/login');
exit();
}
if(empty($this->user) && !$this->request->post('mailing_email'))
{
header('Location: '.$this->config->root_url.'/user/login');
exit();
}
if($this->request->method('post') && $this->request->post('mailing_email'))
{
if(filter_var(trim($this->request->post('mailing_email')), FILTER_VALIDATE_EMAIL))
{
$query = $this->db->placehold('select id from __mailing where email=?', $this->request->post('mailing_email'));
$this->db->query($query);
if($this->db->num_rows() < 1)
{
$query = $this->db->placehold('insert into __mailing(`email`)VALUES(?)', $this->request->post('mailing_email'));
$this->db->query($query);
}
}
else
{
$this->design->assign('error', 'email_syntax');
}
}
elseif($this->request->method('get') && $this->request->get('unsubscribe') && $this->request->get('mail'))
{
if(filter_var($this->request->get('mail'), FILTER_VALIDATE_EMAIL)){
$query = $this->db->placehold('select id from __mailing where email=?', $this->request->get('mail'));
$this->db->query($query);
if($this->db->num_rows() > 0){
$hash = md5($this->settings->license.$this->request->get('mail'));
if($hash == $this->request->get('unsubscribe')){
$query = $this->db->placehold('delete from __mailing where email=?', $this->request->get('mail'));
$this->db->query($query);
}else{
$this->design->assign('error', '00001');
}
}else{
$this->design->assign('error', '00001');
}
}else{
$this->design->assign('error', 'email_syntax');
}
}
elseif($this->request->method('post') && $this->request->post('name'))
{
$name = $this->request->post('name');
$name2 = $this->request->post('name2');
$phone = $this->request->post('phone');
$country = $this->request->post('country');
$region = $this->request->post('region');
$city = $this->request->post('city');
$indx = $this->request->post('indx');
$adress = $this->request->post('adress');
$email = $this->request->post('email');
$password = $this->request->post('password');
$this->design->assign('name', $name);
$this->design->assign('name2', $name2);
$this->design->assign('email', $email);
$this->design->assign('phone', $phone);
$this->design->assign('country', $country);
$this->design->assign('region', $region);
$this->design->assign('city', $city);
$this->design->assign('adress', $adress);
$this->design->assign('indx', $indx);
$this->db->query('SELECT count(*) as count FROM __users WHERE email=? AND id!=?', $email, $this->user->id);
$user_exists = $this->db->result('count');
if($user_exists)
$this->design->assign('error', 'user_exists');
elseif(empty($name))
$this->design->assign('error', 'empty_name');
elseif(empty($email))
$this->design->assign('error', 'empty_email');
elseif($user_id = $this->users->update_user($this->user->id,array(
'name'=>$name,
'name2'=>$name2,
'phone'=>$phone,
'country'=>$country,
'region'=>$region,
'city'=>$city,
'adress'=>$adress,
'indx'=>$indx,
'email'=>$email
)))
{
$this->user = $this->users->get_user(intval($user_id));
$this->design->assign('name', $this->user->name);
$this->design->assign('name2', $this->user->name2);
$this->design->assign('phone', $this->user->phone);
$this->design->assign('country', $this->user->country);
$this->design->assign('region', $this->user->region);
$this->design->assign('city', $this->user->city);
$this->design->assign('index', $this->user->index);
$this->design->assign('adress', $this->user->adress);
$this->design->assign('user', $this->user);
$this->design->assign('email', $this->user->email);
}
else
$this->design->assign('error', 'unknown error');
if(!empty($password))
{
$this->users->update_user($this->user->id, array('password'=>$password));
}
}
else
{
// Передаем в шаблон
$this->design->assign('name', $this->user->name);
$this->design->assign('name2', $this->user->name2);
$this->design->assign('phone', $this->user->phone);
$this->design->assign('country', $this->user->country);
$this->design->assign('region', $this->user->region);
$this->design->assign('city', $this->user->city);
$this->design->assign('indx', $this->user->indx);
$this->design->assign('adress', $this->user->adress);
$this->design->assign('email', $this->user->email);
}
$orders = $this->orders->get_orders(array('user_id'=>$this->user->id));
$this->design->assign('orders', $orders);
if(!$this->request->post('mailing_email')){$this->design->assign('meta_title', $this->user->name);}else{$this->design->assign('meta_title', 'Подписка на рассылку');}
$body = $this->design->fetch('user.tpl');
return $body;
}
}

457
view/View.php Normal file
View File

@@ -0,0 +1,457 @@
<?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();
}
}

146
view/meta.php Normal file
View File

@@ -0,0 +1,146 @@
<?php
function getCategoryAutoMeta($category,$seobrand){ //print_r($category);
$id1 = (isset($category->path[1]) && $category->path[1]->id) ? $category->path[1]->id : 0;
$id2 = (isset($category->path[2]) && $category->path[2]->id) ? $category->path[2]->id : 0;
$title = $desc = $keys = '';
//echo $id1;
//echo $seobrand->name;
//echo $category->id;
if($seobrand && $category->id == 551){
$title = 'Стекла для фар '.($seobrand->name).' в';
$desc = 'В продаже стекла для фар автомобиля '.($seobrand->name).' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа товаров для тюнинга авто.';
$keys = 'стекла для фар, автомобиля, '.$seobrand->name.', купить, цена, санкт-петербург, установка, тюнинг, интернет-магазин carheart, доставка по россии';
}
if($seobrand && isset($category->parent_id) && $category->parent_id == 488){
$title = 'Переходные рамки для автомобилей '.($seobrand->name).' в';
$desc = 'В продаже переходные рамки для автомобилей '.($seobrand->name).' по выгодным ценам в Санкт-Петербурге - магазин CarHeart.';
$keys = 'переходные рамки для '.$seobrand->name.', автомобиль, купить, цена, спб, установка, тюнинг, интернет-магазин, carheart, доставка по россии';
}
if($seobrand && $category->id == 241){
$title = 'Светодиодные противотуманные для '.($seobrand->name).' в';
$desc = 'В продаже светодиодные противотуманные фары для '.($seobrand->name).' с интегрированными дневными ходовыми огнями по выгодной цене в магазине CarHeart.';
$keys = 'противотуманные фары, для автомобиля, '.$seobrand->name.', светодиодные, ходовые огни, купить, цена, спб';
}
if($seobrand && $id1 == 443){
$title = $category->name.' '.($seobrand->name).' в';
$desc = 'В продаже '.$category->name.' '.($seobrand->name).' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа товаров для тюнинга авто.';
$keys = $category->name.', '.$seobrand->name.', для автомобиля, купить, цена, спб, установка, тюнинг, интернет-магазин carheart';
}
if($id2 && $id1 == 415){
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа товаров для тюнинга авто.';
$keys = $category->name.', капот, автомобиль, купить, цена, спб, установка, тюнинг';
}
if($seobrand && $id1 == 234){
$title = 'Автобаферы для '.($seobrand->name).' в';
$desc = 'В продаже автобаферы (амортизирующие подушки) всех размеров для '.$seobrand->name.' и других марок автомобилей
по выгодным ценам в Санкт-Петербурге | CarHeart';
$keys = 'автобаферы, для '.$seobrand->name.', амортизирующие подушки, уретановые, в пружины, подвески, на автомобиль, купить, цена, спб';
}
if($seobrand && $id2 == 40){
$title = '3D эмблемы (значки) с подсветкой логотипа '.($seobrand->name);
$desc = 'В продаже 3D эмблемы (значки) логотипа '.$seobrand->name.' с подсветкой различных цветов по выгодным ценам в Санкт-Петербурге | CarHeart';
$keys = '3 d эмблемы с подсветкой, для '.$seobrand->name.', купить, цена, спб, логитип, светящийся, значок авто';
}
if($seobrand && $id2 == 41){
$title = '4D эмблемы (значки) с подсветкой логотипа '.($seobrand->name);
$desc = 'В продаже 4D эмблемы (значки) логотипа '.$seobrand->name.' с подсветкой различных цветов по выгодным ценам в Санкт-Петербурге | CarHeart';
$keys = '4 d эмблемы с подсветкой, для '.$seobrand->name.', купить, цена, спб, логитип, светящийся, значок авто';
}
if($seobrand && $id1 == 20){
$title = 'Светодиодные задние фонари для '.($seobrand->name).' в';
$desc = 'В продаже светодиодные задние фонари для '.$seobrand->name.' и других марок авто по выгодным ценам в Санкт-Петербурге | CarHeart';
$keys = 'светодиодные задние фонари, для '.$seobrand->name.', купить, альтернативная, оптика, для автомобиля, цена, спб';
}
if($seobrand && $id1 == 241){
$title = 'Противотуманные фары для '.$seobrand->name.' со светодиодными ходовыми огнями в';
$desc = 'В продаже противотуманные фары со светодиодными ходовыми огнями для '.$seobrand->name.' и других марок автомобилей по выгодным ценам в Санкт-Петербурге | CarHeart.';
$keys = 'противотуманные фары, для '.$seobrand->name.', светодиодные, ходовые огни, купить, цена, спб, на автомобиль';
}
if($id2 && $id1 == 257){ return;
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart.';
$keys = $category->name.', светодиодные, на автомобиль, фары, купить, цена, спб, установка';
}
if($id2 && $id1 == 15){ //echo $id2;
if($id2 == 189 || $id2 == 177 || $id2 == 187) return;
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart.';
$keys = $category->name.', внешние световые приборы, на автомобиль, в штатные отверстия, купить, цена, спб, установка';
}
if($id2 && $id1 == 50){ //echo '--'.$title.'--';
if($id2 == 143) return;
if(!$category->meta_title) $title = $category->name.' в';
if(!$category->meta_description) $desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа световой оптики для тюнинга авто.';
if(!$category->meta_keywords) $keys = $category->name.', в фару, на автомобиль, светодиодные кольца, купить, цена, спб, установка, тюнинг, стайлинг, световая оптика';
}
if($id2 && $id1 == 33){
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - визуальный тюнинг авто.';
$keys = $category->name.', кузов, на автомобиль, купить, цена, спб, установка, тюнинг, стайлинг';
}
if($id2 && $id1 == 32){
if($id2 == 87 || $id2 == 84 || $id2 == 83 || $id2 == 82 || $id2 == 79 || $id2 == 81) return;
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - визуальный тюнинг авто.';
$keys = $category->name.', кузов, на автомобиль, купить, цена, спб, установка, тюнинг, стайлинг';
}
if($id2 == 43 && $category->path[3]->id && $id1 == 34){
$title = $category->name.' в';
$desc = 'В продаже '.$category->name.' по выгодным ценам в Санкт-Петербурге | CarHeart - продажа световой оптики для тюнинга авто.';
$keys = $category->name.', на автомобиль, кузов, подсветка, купить, цена, спб, установка, тюнинг, стайлинг, световая оптика';
}
if($seobrand && $id1 == 256){
$title = $category->name.' '.$seobrand->name.' в';
$desc = 'В продаже переходники, '.$category->name.' '.$seobrand->name.' и для других марок авто по выгодным ценам в CarHeart - тюнинг автомобильной оптики в Санкт-Петербурге.';
$keys = $category->name.' '.$seobrand->name.', переходники, установка ксенона, на автомобиль, в штатные места, цена, спб, тюнинг, стайлинг, световая оптика, ближний свет';
}
if($seobrand && $id1 == 48){
$title = $category->name.' '.$seobrand->name.' в';
$desc = 'В продаже '.$category->name.' '.$seobrand->name.' и для других марок авто по выгодным ценам в CarHeart - тюнинг автомобильной оптики в Санкт-Петербурге.';
$keys = $category->name.' '.$seobrand->name.', на автомобиль, комплект, обманки на ксенон, цена, спб, тюнинг, стайлинг, световая оптика';
}
if($seobrand && $id1 == 233){
$title = $category->name.' '.$seobrand->name.' в';
$desc = 'В продаже '.$category->name.' '.$seobrand->name.' и для других марок авто по выгодным ценам в CarHeart - тюнинг автомобильной оптики в Санкт-Петербурге.';
$keys = $category->name.' '.$seobrand->name.', на автомобиль, штатные, светодиодные, свечение фар, цена, спб, тюнинг, стайлинг, световая оптика';
}
if($seobrand && $id1 == 55){
$title = ''.$category->name.' '.$seobrand->name.' в';
$desc = 'В продаже '.$category->name.' '.$seobrand->name.' по выгодным ценам в CarHeart - визуальный тюнинг автомобильной оптики в Санкт-Петербурге.';
$keys = $category->name.' '.$seobrand->name.', на автомобиль, свет, кольца, светодиодные, свечение фар, цена, спб, тюнинг, стайлинг, световая оптика';
}
if($seobrand && $id1 == 396){
$title = ''.$category->name.' '.$seobrand->name.' в';
$desc = 'В продаже '.$category->name.' '.$seobrand->name.' и для других марок авто по выгодным ценам в CarHeart - тюнинг автомобильной оптики в Санкт-Петербурге.';
$keys = $category->name.' '.$seobrand->name.', купить, установка, на автомобиль, из нержавеющей стали, с подсветкой, светодиодная, цена, спб, тюнинг, кузов, стайлинг';
}
if($seobrand && $category->id == 10){
$title = 'Биксеноновые линзы на '.($seobrand->name).' в';
$desc = 'Предлагаем купить биксеноновые линзы на автомобили '.($seobrand->name).' и другие марки авто в Санкт-Петербурге с доставкой по всей России.';
$keys = 'биксеноновые линзы, купить, для автомобиля, '.$seobrand->name.', спб, цена, carheart';
}
if($title)
return array('title'=>$title,'desc'=>$desc,'keys'=>$keys);
else
return false;
}
$mt = getCategoryAutoMeta($category,$seobrand);
if($mt){
$title = $mt['title'];
$desc = $mt['desc'];
$keys = $mt['keys'];
}
//echo 'cid='.$category->id.'--'.$category->path[1]->id; echo '.'.$category->path[2]->id; echo '.'.$category->path[3]->id; echo '==='.$seobrand->name; echo $category->name;