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

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;
}
}