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

674 lines
23 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 //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();
}
}
}