Files
AtomicOld/api/Articles.php

674 lines
23 KiB
PHP
Raw Permalink Normal View History

2026-02-14 19:34:54 +03:00
<?php //exit;
/**
* Simpla CMS
*
* @copyright 2014 Vitaly Raevsky
* @link http://bwdesign.ru
* @email vitaly.raevsky@gmail.com
*
*/
require_once('Simpla.php');
class Articles extends Simpla
{
// Список указателей на категории в дереве категорий (ключ = id категории)
private $all_categories;
// Дерево категорий
private $categories_tree;
/*
*
* Функция возвращает пост по его id или url
* (в зависимости от типа аргумента, int - id, string - url)
* @param $id id или url поста
*
*/
public function get_article($id)
{
if(is_int($id))
$where = $this->db->placehold(' WHERE a.id=? ', intval($id));
else
$where = $this->db->placehold(' WHERE a.url=? ', $id);
$query = $this->db->placehold("SELECT a.*, c.url category_url, c.name category, a.image
FROM __articles a
LEFT JOIN __article_categories c ON c.id = a.category_id
$where LIMIT 1");
if($this->db->query($query))
return $this->db->result();
else
return false;
}
/*
*
* Функция возвращает массив постов, удовлетворяющих фильтру
* @param $filter
*
*/
public function get_articles($filter = array())
{
// По умолчанию
$limit = 1000;
$page = 1;
$article_id_filter = '';
$visible_filter = '';
$keyword_filter = '';
$category_filter = '';
$group_by = '';
if(isset($filter['limit']))
$limit = max(1, intval($filter['limit']));
if(isset($filter['page']))
$page = max(1, intval($filter['page']));
if(!empty($filter['id']))
$article_id_filter = $this->db->placehold('AND a.id in(?@)', (array)$filter['id']);
if(isset($filter['visible']))
$visible_filter = $this->db->placehold('AND a.visible = ?', intval($filter['visible']));
if(isset($filter['category_id'])){
$category_filter = $this->db->placehold('INNER JOIN __articles_categories pc ON pc.article_id = a.id AND pc.category_id in(?@)', (array)$filter['category_id']);
//$category_filter = $this->db->placehold('AND a.category_id in(?@)', (array)$filter['category_id']);
$group_by = "GROUP BY a.id";
}
if(isset($filter['keyword']))
{
$keywords = explode(' ', $filter['keyword']);
foreach($keywords as $keyword)
$keyword_filter .= $this->db->placehold('AND (a.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR a.meta_keywords LIKE "%'.mysql_real_escape_string(trim($keyword)).'%") ');
}
$sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
$query = $this->db->placehold("SELECT a.*
FROM __articles a
$category_filter
WHERE 1 $article_id_filter $visible_filter $keyword_filter
$group_by ORDER BY date DESC, id DESC $sql_limit");
$this->db->query($query);
return $this->db->results();
}
/*
*
* Функция вычисляет количество постов, удовлетворяющих фильтру
* @param $filter
*
*/
public function count_articles($filter = array())
{
$post_id_filter = '';
$visible_filter = '';
$keyword_filter = '';
$category_filter = '';
if(!empty($filter['id']))
$post_id_filter = $this->db->placehold('AND a.id in(?@)', (array)$filter['id']);
if(isset($filter['visible']))
$visible_filter = $this->db->placehold('AND a.visible = ?', intval($filter['visible']));
if(isset($filter['category_id']))
$category_filter = $this->db->placehold('INNER JOIN __articles_categories pc ON pc.article_id = a.id AND pc.category_id in(?@)', (array)$filter['category_id']);
//$category_filter = $this->db->placehold('AND a.category_id in(?@)', (array)$filter['category_id']);
if(isset($filter['keyword']))
{
$keywords = explode(' ', $filter['keyword']);
foreach($keywords as $keyword)
$keyword_filter .= $this->db->placehold('AND (a.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR a.meta_keywords LIKE "%'.mysql_real_escape_string(trim($keyword)).'%") ');
}
$query = "SELECT COUNT(distinct a.id) as count
FROM __articles a $category_filter WHERE 1 $post_id_filter $visible_filter $keyword_filter";
if($this->db->query($query))
return $this->db->result('count');
else
return false;
}
/*
*
* Создание поста
* @param $post
*
*/
public function add_article($post)
{
if(isset($post->date))
{
$date = $post->date;
unset($post->date);
//$date_query = $this->db->placehold(', date=STR_TO_DATE(?, ?)', $date, $this->settings->date_format);
$date_query = $this->db->placehold(', date=?', date('Y-m-d H:i:s', strtotime($date) ) ) ;
}
$query = $this->db->placehold("INSERT INTO __articles SET ?% $date_query", $post);
if(!$this->db->query($query))
return false;
else
return $this->db->insert_id();
}
/*
*
* Обновить пост(ы)
* @param $post
*
*/
public function update_article($id, $post)
{
$query = $this->db->placehold("UPDATE __articles SET ?% WHERE id in(?@) LIMIT ?", $post, (array)$id, count((array)$id));
$this->db->query($query);
return $id;
}
/*
*
* Удалить пост
* @param $id
*
*/
public function delete_article($id)
{
if(!empty($id))
{
// Удаляем связанные
$related = $this->get_related_objects($id);
foreach($related as $r)
$this->delete_related_object($id, $r->related_id);
$query = $this->db->placehold("DELETE FROM __articles WHERE id=? LIMIT 1", intval($id));
if($this->db->query($query))
{
$query = $this->db->placehold("DELETE FROM __comments WHERE type='article' AND object_id=? LIMIT 1", intval($id));
if($this->db->query($query))
return true;
}
}
return false;
}
/*
*
* Следующий пост
* @param $post
*
*/
public function get_next_article($id, $category=0)
{
$this->db->query("SELECT date FROM __articles WHERE id=? LIMIT 1", $id);
$date = $this->db->result('date');
$this->db->query("(SELECT id FROM __articles WHERE date=? AND id>? AND visible ORDER BY id limit 1)
UNION
(SELECT id FROM __articles WHERE date>? AND visible ORDER BY date, id limit 1)",
$date, $id, $date);
$next_id = $this->db->result('id');
if($next_id)
return $this->get_article(intval($next_id));
else
return false;
}
/*
*
* Предыдущий пост
* @param $post
*
*/
public function get_prev_article($id, $category=0)
{
$this->db->query("SELECT date FROM __articles WHERE id=? LIMIT 1", $id);
$date = $this->db->result('date');
$this->db->query("(SELECT id FROM __articles WHERE date=? AND id<? AND visible ORDER BY id DESC limit 1)
UNION
(SELECT id FROM __articles WHERE date<? AND visible ORDER BY date DESC, id DESC limit 1)",
$date, $id, $date);
$prev_id = $this->db->result('id');
if($prev_id)
return $this->get_article(intval($prev_id));
else
return false;
}
function get_related_objects($article_id = array())
{
if(empty($article_id))
return array();
$query = $this->db->placehold("SELECT article_id, object_id, type
FROM __article_objects
WHERE article_id in(?@)", (array)$article_id);
$this->db->query($query);
return $this->db->results();
}
function get_related_markas($article_id){
$this->db->query("SELECT * FROM __article_models WHERE model_id=0 AND article_id = " . (int)$article_id);
$rows = $this->db->results();
$res = array();
foreach($rows as $row) $res[] = $this->marka->get_brand( (int)$row->marka_id);
return $res;
}
function get_related_models($article_id){
$this->db->query("SELECT * FROM __article_models WHERE model_id != 0 AND article_id = " . (int)$article_id);
$rows = $this->db->results();
$res = array();
foreach($rows as $row) $res[] = $this->model->get_model( (int)$row->model_id );
return $res;
}
function get_related_pages($article_id)
{
$this->db->query("SELECT * FROM __article_pages WHERE article_id = " . (int)$article_id);
$rows = $this->db->results();
$res = array();
foreach ($rows as $row) $res[] = $this->pages->get_page( (int)$row->page_id );
// remove empty elements
return array_filter($res);
}
function get_related_articles($filter = array())
{
// По умолчанию
$limit = 1000;
$type_filter = '';
$object_id_filter = '';
if(isset($filter['limit']))
$limit = max(1, intval($filter['limit']));
if(!empty($filter['type']))
$type_filter = $this->db->placehold('AND type=?', $filter['type']);
if(!empty($filter['id']))
$object_id_filter = $this->db->placehold('AND object_id=?', (int)$filter['id']);
$sql_limit = $this->db->placehold(' LIMIT ?', $limit);
$query = $this->db->placehold("SELECT article_id, object_id, type
FROM __article_objects
WHERE 1 $object_id_filter $type_filter $sql_limit");
$this->db->query($query);
return $this->db->results();
}
// Функция возвращает связанные товары
public function add_related_object($article_id, $related_id, $type)
{
$query = $this->db->placehold("INSERT IGNORE INTO __article_objects SET article_id=?, object_id=?, type=?", $article_id, $related_id, $type);
$this->db->query($query);
return $related_id;
}
// Удаление связанного товара
public function delete_related_object($article_id, $related_id)
{
$query = $this->db->placehold("DELETE FROM __article_objects WHERE article_id=? AND object_id=? LIMIT 1", intval($article_id), intval($related_id));
$this->db->query($query);
}
// Функция возвращает массив категорий
public function get_categories($id)
{
if(!isset($this->categories_tree))
$this->init_categories();
if(!empty($id))
{
if(isset($this->all_categories[$id]))
return $result = $this->all_categories[$id];
}
return $this->all_categories;
}
// Функция возвращает массив категорий статей
public function get_articles_categories_filter($filter = array())
{
if(!isset($this->categories_tree))
$this->init_categories();
/*mt1sk*/if ($filter['article_id'] == -1) {
return $this->all_categories[0];
} else/*/mt1sk*/
if(!empty($filter['article_id']))
{
$query = $this->db->placehold("SELECT category_id FROM __articles_categories WHERE article_id in(?@) ORDER BY position", (array)$filter['article_id']);
$this->db->query($query);
$categories_ids = $this->db->results('category_id');
$result = array();
foreach($categories_ids as $id)
if(isset($this->all_categories[$id]))
$result[$id] = $this->all_categories[$id];
return $result;
}
return $this->all_categories;
}
// Функция возвращает id категорий для заданной статьи
public function get_article_categories($article_id)
{
$query = $this->db->placehold("SELECT article_id, category_id, position FROM __articles_categories WHERE article_id in(?@) ORDER BY position", (array)$article_id);
$this->db->query($query);
return $this->db->results();
}
// Функция возвращает id категорий для всех статей
public function get_articles_categories()
{
$query = $this->db->placehold("SELECT article_id, category_id, position FROM __articles_categories ORDER BY position");
$this->db->query($query);
return $this->db->results();
}
// Добавить категорию к заданному товару
public function add_article_category($article_id, $category_id, $position=0)
{
$query = $this->db->placehold("INSERT IGNORE INTO __articles_categories SET article_id=?, category_id=?, position=?", $article_id, $category_id, $position);
$this->db->query($query);
}
// Удалить категорию заданного товара
public function delete_article_category($article_id, $category_id)
{
$query = $this->db->placehold("DELETE FROM __articles_categories WHERE article_id=? AND category_id=? LIMIT 1", intval($article_id), intval($category_id));
$this->db->query($query);
}
// Функция возвращает дерево категорий
public function get_categories_tree()
{
if(!isset($this->categories_tree))
$this->init_categories();
return $this->categories_tree;
}
// Функция возвращает заданную категорию
public function get_category($id)
{
if(!isset($this->all_categories))
$this->init_categories();
if(is_int($id) && array_key_exists(intval($id), $this->all_categories))
return $category = $this->all_categories[intval($id)];
elseif(is_string($id))
foreach ($this->all_categories as $category)
if ($category->url == $id)
return $this->get_category((int)$category->id);
return false;
}
// Добавление категории
public function add_category($category)
{
$category = (array)$category;
if(empty($category['url']))
{
$category['url'] = preg_replace("/[\s]+/ui", '_', $category['name']);
$category['url'] = strtolower(preg_replace("/[^0-9a-zа-я_]+/ui", '', $category['url']));
}
$this->db->query("INSERT INTO __article_categories SET ?%", $category);
$id = $this->db->insert_id();
$this->db->query("UPDATE __article_categories SET position=id WHERE id=?", $id);
$this->init_categories();
return $id;
}
// Изменение категории
public function update_category($id, $category)
{
$query = $this->db->placehold("UPDATE __article_categories SET ?% WHERE id=? LIMIT 1", $category, intval($id));
$this->db->query($query);
$this->init_categories();
return $id;
}
// Удаление категории
public function delete_category($id)
{
if(!$category = $this->get_category(intval($id)))
return false;
foreach($category->children as $id)
{
if(!empty($id))
{
$query = $this->db->placehold("DELETE FROM __article_categories WHERE id=? LIMIT 1", $id);
$this->db->query($query);
$query = $this->db->placehold("DELETE FROM __articles_categories WHERE category_id in(?@)", $category->children);
$this->db->query($query);
$this->init_categories();
}
}
return true;
}
// Инициализация категорий, после которой категории будем выбирать из локальной переменной
private function init_categories()
{
// Дерево категорий
$tree = new stdClass();
$tree->subcategories = array();
// Указатели на узлы дерева
$pointers = array();
$pointers[0] = &$tree;
$pointers[0]->path = array();
// Выбираем все категории
// if($_SESSION['admin'] == 'admin')
$query = $this->db->placehold("SELECT * FROM __article_categories ORDER BY parent_id, position");
// else
// $query = $this->db->placehold("SELECT * FROM __article_categories WHERE `visible`=1 ORDER BY parent_id, position");
$this->db->query($query);
$categories = $this->db->results(); //echo '<!--';var_dump($categories); echo '-->';
$finish = false;
// Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть
while(!empty($categories) && !$finish)
{
$flag = false;
// Проходим все выбранные категории
foreach($categories as $k=>$category)
{
if(isset($pointers[$category->parent_id]))
{
// В дерево категорий (через указатель) добавляем текущую категорию
$pointers[$category->id] = $pointers[$category->parent_id]->subcategories[] = $category;
// Путь к текущей категории
$curr = clone($pointers[$category->id]);
$pointers[$category->id]->path = array_merge((array)$pointers[$category->parent_id]->path, array($curr));
// Убираем использованную категорию из массива категорий
unset($categories[$k]);
$flag = true;
}
}
if(!$flag) $finish = true;
}
// Для каждой категории id всех ее деток узнаем
$ids = array_reverse(array_keys($pointers));
foreach($ids as $id)
{
if($id>0)
{
$pointers[$id]->children[] = $id;
if(isset($pointers[$pointers[$id]->parent_id]->children))
$pointers[$pointers[$id]->parent_id]->children = array_merge($pointers[$id]->children, $pointers[$pointers[$id]->parent_id]->children);
else
$pointers[$pointers[$id]->parent_id]->children = $pointers[$id]->children;
}
}
unset($pointers[0]);
$this->categories_tree = $tree->subcategories;
$this->all_categories = $pointers;
}
public function delete_image($id)
{
$query = $this->db->placehold("SELECT image FROM __articles WHERE id=?", intval($id));
$this->db->query($query);
$filename = $this->db->result('image');
if(!empty($filename))
{
$query = $this->db->placehold("UPDATE __articles SET image=NULL WHERE id=?", $id);
$this->db->query($query);
$query = $this->db->placehold("SELECT count(*) as count FROM __articles WHERE image=? LIMIT 1", $filename);
$this->db->query($query);
$count = $this->db->result('count');
if($count == 0)
{
@unlink($this->config->root_dir.$this->config->original_images_dir.$filename);
}
}
}
/*
// Функция возвращает массив категорий
public function get_articles_categories($filter = array())
{
if(!isset($this->articles_categories_tree))
$this->init_articles_categories();
return $this->all_articles_categories;
}
// Функция возвращает дерево категорий
public function get_articles_categories_tree()
{
if(!isset($this->articles_categories_tree))
$this->init_articles_categories();
return $this->articles_categories_tree;
}
// Функция возвращает заданную категорию
public function get_articles_category($id)
{
if(!isset($this->all_articles_categories))
$this->init_articles_categories();
if(is_int($id) && array_key_exists(intval($id), $this->all_articles_categories))
return $category = $this->all_articles_categories[intval($id)];
elseif(is_string($id))
foreach ($this->all_articles_categories as $category)
if ($category->url == $id)
return $this->get_articles_category((int)$category->id);
return false;
}
// Добавление категории
public function add_articles_category($category)
{
$category = (array)$category;
if(empty($category['url']))
{
$category['url'] = preg_replace("/[\s]+/ui", '_', $category['name']);
$category['url'] = strtolower(preg_replace("/[^0-9a-zа-я_]+/ui", '', $category['url']));
}
// Если есть категория с таким URL, добавляем к нему число
while($this->get_articles_category((string)$category['url']))
{
if(preg_match('/(.+)_([0-9]+)$/', $category['url'], $parts))
$category['url'] = $parts[1].'_'.($parts[2]+1);
else
$category['url'] = $category['url'].'_2';
}
$this->db->query("INSERT INTO __articles_categories SET ?%", $category);
$id = $this->db->insert_id();
$this->db->query("UPDATE __articles_categories SET position=id WHERE id=?", $id);
$this->init_articles_categories();
return $id;
}
// Изменение категории
public function update_articles_category($id, $category)
{
$query = $this->db->placehold("UPDATE __articles_categories SET ?% WHERE id=? LIMIT 1", $category, intval($id));
$this->db->query($query);
$this->init_articles_categories();
return $id;
}
// Удаление категории
public function delete_articles_category($id)
{
if(!$category = $this->get_articles_category(intval($id)))
return false;
foreach($category->children as $id)
{
if(!empty($id))
{
$this->delete_image($id);
$query = $this->db->placehold("DELETE FROM __articles_categories WHERE id=? LIMIT 1", $id);
$this->db->query($query);
$query = $this->db->placehold("DELETE FROM __products_articles_categories WHERE category_id=?", $id);
$this->db->query($query);
$this->init_articles_categories();
}
}
return true;
}
*/
// Изменение категории
public function update_articles_category($id, $category)
{
$query = $this->db->placehold("UPDATE __article_categories SET ?% WHERE id=? LIMIT 1", $category, intval($id));
$this->db->query($query);
// $this->init_articles_categories();
return $id;
}
// Удалить изображение категории
public function delete_category_image($category_id)
{
$query = $this->db->placehold("SELECT image FROM __article_categories WHERE id=?", $category_id);
$this->db->query($query);
$filename = $this->db->result('image');
if(!empty($filename))
{
$query = $this->db->placehold("UPDATE __article_categories SET image=NULL WHERE id=?", $category_id);
$this->db->query($query);
$query = $this->db->placehold("SELECT count(*) as count FROM __article_categories WHERE image=? LIMIT 1", $filename);
$this->db->query($query);
$count = $this->db->result('count');
if($count == 0)
{
@unlink($this->config->root_dir.$this->config->categories_images_dir.$filename);
}
// $this->init_articles_categories();
}
}
}