346 lines
12 KiB
PHP
346 lines
12 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Simpla CMS
|
|||
|
|
*
|
|||
|
|
* @copyright 2011 Denis Pikusov
|
|||
|
|
* @link http://simplacms.ru
|
|||
|
|
* @author Denis Pikusov
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
require_once ('Simpla.php');
|
|||
|
|
class Pages extends Simpla {
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Функция возвращает страницу по ее id или url (в зависимости от типа)
|
|||
|
|
* @param $id id или url страницы
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function get_page($id, $menu_to_omit = []) {
|
|||
|
|
$menu_condition = '';
|
|||
|
|
if (!empty($menu_to_omit)) {
|
|||
|
|
$menu_condition .= 'menu_id NOT IN ('. implode(',', $menu_to_omit) . ') AND';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (gettype($id) == 'string')
|
|||
|
|
$where = $this->db->placehold(' WHERE '. $menu_condition . 'url=? ', $id);
|
|||
|
|
else
|
|||
|
|
$where = $this->db->placehold(' WHERE '. $menu_condition . 'id=? ', intval($id));
|
|||
|
|
|
|||
|
|
$query = "SELECT * FROM __pages $where LIMIT 1";
|
|||
|
|
$this->db->query($query);
|
|||
|
|
$page = $this->db->result();
|
|||
|
|
|
|||
|
|
if ($page->name) {
|
|||
|
|
|
|||
|
|
$parentUrl = $this->get_parent_url($page->parent);
|
|||
|
|
|
|||
|
|
if ($parentUrl != '/')
|
|||
|
|
$page->parentUrl = '/' . $parentUrl;
|
|||
|
|
else
|
|||
|
|
$page->parentUrl = $parentUrl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(strpos($_SERVER['REQUEST_URI'], '/uslugi/') !== false) $page->parentUrl = '/uslugi/';
|
|||
|
|
if(strpos($_SERVER['REQUEST_URI'], '/tuning-centr/') !== false) $page->parentUrl = '/tuning-centr/';
|
|||
|
|
|
|||
|
|
|
|||
|
|
return $page;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Функция возвращает id страницы
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function get_page_id($alias) {
|
|||
|
|
$where = $this->db->placehold(' WHERE url=? ', $alias);
|
|||
|
|
$query = "SELECT id FROM __pages $where LIMIT 1";
|
|||
|
|
$this->db->query($query);
|
|||
|
|
$page = $this->db->result();
|
|||
|
|
return $page->id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getStartPage($id, $topParentId = 0){
|
|||
|
|
$id = (int)$id;
|
|||
|
|
$page = $this->get_page($id);
|
|||
|
|
return ($page->parent == $topParentId || !$page->parent) ? $page : $this->getStartPage($page->parent, $topParentId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Функция возвращает массив страниц, удовлетворяющих фильтру
|
|||
|
|
* @param $filter
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function get_pages($filter = array()) {
|
|||
|
|
$menu_filter = '';
|
|||
|
|
$visible_filter = $keyword_filter = '';
|
|||
|
|
$pages = array();
|
|||
|
|
if (isset($filter['id']))
|
|||
|
|
$menu_filter = $this->db->placehold('AND id in (?@)', (array )$filter['id']);
|
|||
|
|
if (isset($filter['parent']))
|
|||
|
|
$menu_filter = $this->db->placehold('AND parent in (?@)', (array )$filter['parent']);
|
|||
|
|
if (isset($filter['menu_id']))
|
|||
|
|
$menu_filter = $this->db->placehold('AND menu_id in (?@)', (array )$filter['menu_id']);
|
|||
|
|
if (isset($filter['visible']))
|
|||
|
|
$visible_filter = $this->db->placehold('AND visible = ?', intval($filter['visible']));
|
|||
|
|
if (isset($filter['show_home']))
|
|||
|
|
$visible_filter = $this->db->placehold('AND show_home = ?', intval($filter['show_home']));
|
|||
|
|
|
|||
|
|
if (isset($filter['show_service']))
|
|||
|
|
$visible_filter = $this->db->placehold('AND show_service = ?', intval($filter['show_service']));
|
|||
|
|
|
|||
|
|
if(isset($filter['keyword']))
|
|||
|
|
{
|
|||
|
|
$keywords = explode(' ', $filter['keyword']);
|
|||
|
|
foreach($keywords as $keyword)
|
|||
|
|
$keyword_filter .= $this->db->placehold('AND (name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR meta_keywords LIKE "%'.mysql_real_escape_string(trim($keyword)).'%") ');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$query = "SELECT id, parent, url, header, name, meta_title, meta_description, meta_keywords, image, introtext, toptext, body, bottext, menu_id, position, visible, show_home
|
|||
|
|
FROM __pages WHERE 1 $menu_filter $visible_filter $keyword_filter ORDER BY position";
|
|||
|
|
//echo($query) . '<hr>';
|
|||
|
|
$this->db->query($query);
|
|||
|
|
foreach ($this->db->results() as $page) {
|
|||
|
|
|
|||
|
|
if ($page->name) {
|
|||
|
|
|
|||
|
|
$parentUrl = $this->get_parent_url($page->parent);
|
|||
|
|
|
|||
|
|
if ($parentUrl != '/')
|
|||
|
|
$page->parentUrl = '/' . $parentUrl;
|
|||
|
|
else
|
|||
|
|
$page->parentUrl = $parentUrl;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(strpos($_SERVER['REQUEST_URI'], '/uslugi/') !== false) $page->parentUrl = '/uslugi/';
|
|||
|
|
if(strpos($_SERVER['REQUEST_URI'], '/tuning-centr/') !== false) $page->parentUrl = '/tuning-centr/';
|
|||
|
|
//$page->parentUrl = '';
|
|||
|
|
$pages[$page->id] = $page;
|
|||
|
|
}
|
|||
|
|
return $pages;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function get_parent_url($id, $url = '') {
|
|||
|
|
//if(strpos($_SERVER['REQUEST_URI'], '/tuning-centr/') !== false) return '/tuning-centr/';
|
|||
|
|
if (!$id) return;
|
|||
|
|
$id = intval($id);
|
|||
|
|
$page = $this->get_page($id);
|
|||
|
|
$url = $page->url . '/' . $url;
|
|||
|
|
|
|||
|
|
if ($page->parent > 0)
|
|||
|
|
return $this->get_parent_url($page->parent, $url);
|
|||
|
|
else
|
|||
|
|
return $url;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function get_breadcrumb($id, $breadcrumb = array()) {
|
|||
|
|
if (!$id) return;
|
|||
|
|
$id = intval($id);
|
|||
|
|
$page = $this->get_page($id);
|
|||
|
|
$breadcrumb[] = new ArrayObj(array('anchor' => $page->header, 'href' => $this->get_parent_url($page->id)));
|
|||
|
|
if ($page->parent > 0)
|
|||
|
|
return $this->get_breadcrumb($page->parent, $breadcrumb);
|
|||
|
|
else {
|
|||
|
|
$result = array_reverse($breadcrumb);
|
|||
|
|
$lastResult = array_pop($result);
|
|||
|
|
return new ArrayObj($result);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function get_breadcrumb_service($id, $breadcrumb = array()) {
|
|||
|
|
if (!$id) return;
|
|||
|
|
$id = intval($id);
|
|||
|
|
$page = $this->get_page($id); //echo '<!-- 999999'; print_r($page); echo '-->';
|
|||
|
|
//$breadcrumb[] = new ArrayObj(array('anchor' => $page->name, 'href' => $this->get_parent_url($page->id)));
|
|||
|
|
|
|||
|
|
$href = $page->url != 'tuning-centr' ? 'tuning-centr/' . $page->url . '/' : 'tuning-centr/';
|
|||
|
|
|
|||
|
|
$breadcrumb[] = new ArrayObj(array('anchor' => $page->name, 'href' => $href ));
|
|||
|
|
if ($page->parent > 0)
|
|||
|
|
return $this->get_breadcrumb_service($page->parent, $breadcrumb);
|
|||
|
|
else {
|
|||
|
|
$result = array_reverse($breadcrumb);
|
|||
|
|
$lastResult = array_pop($result);
|
|||
|
|
return new ArrayObj($result);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Функция возвращает массив id => name для выбора родительского раздела в админке
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function get_select_pages($filter = array(), $pages = array(), $del = '') {
|
|||
|
|
$menu_filter = '';
|
|||
|
|
$visible_filter = '';
|
|||
|
|
//$pages = array();
|
|||
|
|
if (isset($filter['parent']))
|
|||
|
|
$menu_filter = $this->db->placehold('AND parent in (?@)', (array )$filter['parent']);
|
|||
|
|
if (isset($filter['menu_id']))
|
|||
|
|
$menu_filter = $this->db->placehold('AND menu_id in (?@)', (array )$filter['menu_id']);
|
|||
|
|
if (isset($filter['visible']))
|
|||
|
|
$visible_filter = $this->db->placehold('AND visible = ?', intval($filter['visible']));
|
|||
|
|
if (isset($filter['show_home']))
|
|||
|
|
$visible_filter = $this->db->placehold('AND show_home = ?', intval($filter['show_home']));
|
|||
|
|
$query = "SELECT id, name FROM __pages WHERE 1 $menu_filter $visible_filter ORDER BY id"; //echo $query;
|
|||
|
|
$this->db->query($query);
|
|||
|
|
|
|||
|
|
foreach ($this->db->results() as $page){
|
|||
|
|
$page->name = $del . $page->name;
|
|||
|
|
$pages[$page->id] = $page;
|
|||
|
|
$filter2 = $filter;
|
|||
|
|
$filter2['parent'] = array($page->id);
|
|||
|
|
$pages = $this->get_select_pages($filter2, $pages, $del . '--');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
return $pages;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Создание страницы
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function add_page($page) {
|
|||
|
|
$query = $this->db->placehold('INSERT INTO __pages SET ?%', $page);
|
|||
|
|
if (!$this->db->query($query))
|
|||
|
|
return false;
|
|||
|
|
$id = $this->db->insert_id();
|
|||
|
|
$this->db->query("UPDATE __pages SET position=id WHERE id=?", $id);
|
|||
|
|
return $id;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Обновить страницу
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function update_page($id, $page) {
|
|||
|
|
$query = $this->db->placehold('UPDATE __pages SET ?% WHERE id in (?@)', $page, (array )$id);
|
|||
|
|
if (!$this->db->query($query))
|
|||
|
|
return false;
|
|||
|
|
return $id;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Удалить страницу
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function delete_page($id) {
|
|||
|
|
if (!empty($id)) {
|
|||
|
|
$query = $this->db->placehold("DELETE FROM __pages WHERE id=? LIMIT 1", intval($id));
|
|||
|
|
if ($this->db->query($query))
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
public function delete_image($id) {
|
|||
|
|
$query = $this->db->placehold("SELECT image FROM __pages WHERE id=?", intval($id));
|
|||
|
|
$this->db->query($query);
|
|||
|
|
$filename = $this->db->result('image');
|
|||
|
|
if (!empty($filename)) {
|
|||
|
|
$query = $this->db->placehold("UPDATE __pages SET image=NULL WHERE id=?", $id);
|
|||
|
|
$this->db->query($query);
|
|||
|
|
$query = $this->db->placehold("SELECT count(*) as count FROM __pages 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_menus() {
|
|||
|
|
$menus = array();
|
|||
|
|
$query = "SELECT * FROM __menu ORDER BY position";
|
|||
|
|
$this->db->query($query);
|
|||
|
|
foreach ($this->db->results() as $menu)
|
|||
|
|
$menus[$menu->id] = $menu;
|
|||
|
|
return $menus;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
*
|
|||
|
|
* Функция возвращает меню по id
|
|||
|
|
* @param $id
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
public function get_menu($menu_id) {
|
|||
|
|
$query = $this->db->placehold("SELECT * FROM __menu WHERE id=? LIMIT 1", intval($menu_id));
|
|||
|
|
$this->db->query($query);
|
|||
|
|
return $this->db->result();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
function get_related_objects($page_id = array())
|
|||
|
|
{
|
|||
|
|
if(empty($page_id))
|
|||
|
|
return array();
|
|||
|
|
|
|||
|
|
$query = $this->db->placehold("SELECT page_id, object_id, type
|
|||
|
|
FROM __pages_objects
|
|||
|
|
WHERE page_id in(?@)", (array)$page_id);
|
|||
|
|
$this->db->query($query);
|
|||
|
|
return $this->db->results();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public function add_related_object($page_id, $related_id, $type)
|
|||
|
|
{
|
|||
|
|
$query = $this->db->placehold("INSERT IGNORE INTO __pages_objects SET page_id=?, object_id=?, type=?", $page_id, $related_id, $type);
|
|||
|
|
$this->db->query($query);
|
|||
|
|
return $related_id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function delete_related_object($page_id, $related_id)
|
|||
|
|
{
|
|||
|
|
$query = $this->db->placehold("DELETE FROM __pages_objects WHERE page_id=? AND object_id=? LIMIT 1", intval($page_id), intval($related_id));
|
|||
|
|
$this->db->query($query);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
function get_related_articles($page_id = array())
|
|||
|
|
{
|
|||
|
|
if(empty($page_id))
|
|||
|
|
return array();
|
|||
|
|
|
|||
|
|
$query = $this->db->placehold("SELECT *
|
|||
|
|
FROM __related_articles
|
|||
|
|
WHERE page_id in(?@)", (array)$page_id);
|
|||
|
|
$this->db->query($query);
|
|||
|
|
return $this->db->results();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function add_related_article($page_id, $article_id)
|
|||
|
|
{
|
|||
|
|
$query = $this->db->placehold("INSERT IGNORE INTO __related_articles SET page_id=?, article_id=?", $page_id, $article_id);
|
|||
|
|
$this->db->query($query);
|
|||
|
|
return $article_id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function delete_related_article($page_id, $article_id)
|
|||
|
|
{
|
|||
|
|
$query = $this->db->placehold("DELETE FROM __related_articles WHERE page_id=? AND article_id=? LIMIT 1", intval($page_id), intval($article_id));
|
|||
|
|
$this->db->query($query);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class ArrayObj extends stdClass {
|
|||
|
|
function __construct($array = array()) {
|
|||
|
|
if (is_array($array))
|
|||
|
|
foreach ($array as $k => $v) $this->$k = $v;
|
|||
|
|
}
|
|||
|
|
}
|