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

657 lines
26 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?PHP
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;
}
}