<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) https://max-3000.com/
*
*/
// вывод списка страниц по паренту - навигация под страницами - все связанные
function mso_page_nav($page_id = 0, $page_id_parent = 0, $echo = false)
{
$r = mso_page_map($page_id, $page_id_parent); // построение карты страниц
$r = mso_create_list($r); // создание ul-списка
if ($echo)
echo $r;
else
return $r;
}
// вывод карты страниц по паренту - готовый массив с вложениями с childs=>...
// функция ресурсоемкая!
function mso_page_map($page_id = 0, $page_id_parent = 0)
{
$cache_key = 'mso_page_map' . $page_id . '-' . $page_id_parent;
$k = mso_get_cache($cache_key);
if ($k) return $k; // да есть в кэше
$CI = &get_instance();
$CI->db->select('page_id, page_id_parent, page_title, page_slug');
if ($page_id) {
$CI->db->where('page_id', $page_id);
$CI->db->where('page_id_parent', '0');
$CI->db->where('page_status', 'publish');
$CI->db->where('page_date_publish < ', date('Y-m-d H:i:s'));
$CI->db->or_where('page_id', $page_id_parent);
}
$CI->db->order_by('page_menu_order');
$query = $CI->db->get('page');
$result = $query->result_array(); // здесь все страницы
foreach ($result as $key => $row) {
$k = $row['page_id'];
$r[$k] = $row;
if ($k == $page_id) $r[$k]['current'] = 1;
$ch = _mso_page_map_get_child($row['page_id'], $page_id);
if ($ch) $r[$k]['childs'] = $ch;
}
if (!isset($r[$k]['childs'])) $r = []; // в итоге нет детей у первого элемента, все обнуляем
mso_add_cache($cache_key, $r); // в кэш
return $r;
}
// вспомогательная рекурсивная рубрика для получения всех потомков страницы
function _mso_page_map_get_child($page_id = 0, $cur_id = 0)
{
$CI = &get_instance();
$CI->db->select('page_id, page_id_parent, page_title, page_slug');
$CI->db->where('page_id_parent', $page_id);
$CI->db->where('page_status', 'publish');
$CI->db->where('page_date_publish <', date('Y-m-d H:i:s'));
$CI->db->order_by('page_menu_order');
$query = $CI->db->get('page');
$result = $query->result_array(); // здесь все рубрики
if ($result) {
$r0 = [];
foreach ($result as $key => $row) {
$k = $row['page_id'];
$r0[$k] = $row;
if ($k == $cur_id) $r0[$k]['current'] = 1;
}
$result = $r0;
foreach ($result as $key => $row) {
$r = _mso_page_map_get_child($row['page_id'], $cur_id);
if ($r) $result[$key]['childs'] = $r;
}
}
return $result;
}
// получить следующую и предыдущую запись после указанной
// возвращает масив $out['prev'] и $out['next'] с данными записей
// Если записей нет, то ключи равны false
function mso_next_prev_page($r = [])
{
// TODO: переделать: Если есть $next_id и $prev_id, то просто
// получаем записи, без прочих условий
// $par сделать единый вариант
// TODO: разбраться с этой глобальной $page
global $page;
$out = [];
$out['next'] = false;
$out['prev'] = false;
// если это page, то смотрим глобальную $page, где есть мета
// next_page_id и prev_page_id — id страниц на далее и ранее
$next_id = (isset($page['page_meta']['next_page_id'][0]) and $page['page_meta']['next_page_id'][0]) ? (int) $page['page_meta']['next_page_id'][0] : 0;
$prev_id = (isset($page['page_meta']['prev_page_id'][0]) and $page['page_meta']['prev_page_id'][0]) ? (int) $page['page_meta']['prev_page_id'][0] : 0;
if (!isset($r['page_id']) or !isset($r['page_categories']) or !isset($r['page_date_publish'])) {
return $out;
}
// передаем дату отдельно, она используется в function_add_custom_sql
mso_set_val('_sql_next_prev_pages_page_date_publish', $r['page_date_publish']);
// $r['use_category'] — если нужно учитывать рубрику
if (!isset($r['use_category'])) $r['use_category'] = true;
if (!isset($r['get_page_categories'])) $r['get_page_categories'] = false;
if (!isset($r['get_page_meta_tags'])) $r['get_page_meta_tags'] = false;
$cat = ''; // рубрика не учитывается
if ($r['use_category']) {
// рубрики
$cat = $r['page_categories'];
// если несколько рубрик, то ищем те, в которых
// category_id_parent не равен 0 — это подрубрики
// если такие есть, то по ним и делаем навигаци
if (count($r['page_categories']) > 1) {
$all_cat = mso_cat_array_single(); // все рубрики
foreach ($r['page_categories'] as $id) {
if ($all_cat[$id]['parents'] > 0) {
$cat = array($id);
break;
}
}
}
$cat = implode(',', $cat);
}
if (!isset($r['type'])) $r['type'] = 'blog'; // можно задать тип записей
// next
$par = [
'content' => false,
'cat_id' => $cat,
'order_asc' => 'asc',
'limit' => 1,
'pagination' => false,
'work_cut' => false,
'custom_type' => 'home',
'function_add_custom_sql' => '_sql_next_page',
'get_page_categories' => $r['get_page_categories'],
'get_page_meta_tags' => $r['get_page_meta_tags'],
'get_page_count_comments' => false,
'type' => $r['type'],
'exclude_page_id' => $r['page_id']
];
if ($next_id) {
unset($par['cat_id']);
unset($par['exclude_page_id']);
unset($par['function_add_custom_sql']);
$par['page_id'] = $next_id;
}
if ($pages = mso_get_pages($par, $temp)) $out['next'] = $pages[0];
// prev
$par = [
'content' => false,
'cat_id' => $cat,
'order_asc' => 'desc',
'limit' => 1,
'pagination' => false,
'work_cut' => false,
'custom_type' => 'home',
'function_add_custom_sql' => '_sql_prev_page',
'get_page_categories' => $r['get_page_categories'],
'get_page_meta_tags' => $r['get_page_meta_tags'],
'get_page_count_comments' => false,
'type' => $r['type'],
'exclude_page_id' => $r['page_id']
];
if ($prev_id) {
unset($par['cat_id']);
unset($par['exclude_page_id']);
unset($par['function_add_custom_sql']);
$par['page_id'] = $prev_id;
}
if ($pages = mso_get_pages($par, $temp)) $out['prev'] = $pages[0];
// $r['reverse'] — меняем местами пункты
if (isset($r['reverse']) and $r['reverse']) {
$o = [];
$o['next'] = $out['prev'];
$o['prev'] = $out['next'];
$out = $o;
}
return $out;
}
// вспомогательная функция для next mso_next_prev_page
function _sql_next_page()
{
$CI = &get_instance();
$CI->db->where('page_date_publish > ', mso_get_val('_sql_next_prev_pages_page_date_publish'));
}
// вспомогательная функция для prev mso_next_prev_page
function _sql_prev_page()
{
$CI = &get_instance();
$CI->db->where('page_date_publish < ', mso_get_val('_sql_next_prev_pages_page_date_publish'));
}
# end of file