Current Path : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/common/ |
Current File : /var/www/html/clients/nsmk.e-nk.ru/application/maxsite/common/page.php |
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); /** * MaxSite CMS * (c) http://max-3000.com/ * Функции для страниц */ # переменную $page мы объявляем как глобальную - в ней содержится массив текущей страницы # никогда не используйте свою глобальную $page! global $page; # функция получения выборки страниц function mso_get_pages($r = array(), &$pag) { global $MSO; if ( !isset($r['limit']) ) $r['limit'] = 7; // сколько отдавать страниц else { // проверим входящий лимит - он должен быть числом $r['limit'] = (int) $r['limit']; $r['limit'] = abs( $r['limit'] ); if (!$r['limit']) $r['limit'] = 7; // что-то не то, заменяем на дефолт=7 } if ( !isset($r['cut']) ) $r['cut'] = t('Далее'); // ссылка на [cut] if ( !isset($r['xcut']) ) $r['xcut'] = true; // для тех у кого нет cut, но есть xcut выводить после xcut if ( !isset($r['show_cut']) ) $r['show_cut'] = true; // отображать ссылку «далее» для [cut] ? if ( !isset($r['show_xcut']) ) $r['show_xcut'] = true; // отображать ссылку «далее» для [xcut] ? // приписка к ссылке на страницу полной записи if ( !isset($r['a_link_cut']) ) $r['a_link_cut'] = '#cut'; // удалять ли [cut], если false, то cut не обрабатывается // если false, то $r['cut'] и $r['xcut'] уже не учитываются if ( !isset($r['work_cut']) ) $r['work_cut'] = true; // отдавать все поля из таблиц (только для типов home и page) // если false, то только то, что предопределено if ( !isset($r['all_fields']) ) $r['all_fields'] = false; if ( !isset($r['cat_order']) ) $r['cat_order'] = 'category_name'; // сортировка рубрик if ( !isset($r['cat_order_asc']) ) $r['cat_order_asc'] = 'asc'; // порядок рубрик if ( !isset($r['pagination']) ) $r['pagination'] = true; // использовать пагинацию if ( !isset($r['content']) ) $r['content'] = true; // получать весь текст if ( !isset($r['page_id']) ) $r['page_id'] = 0; // если 0, значит все страницы - только для главной if ( !isset($r['cat_id']) ) $r['cat_id'] = 0; // если 0, значит все рубрики - только для главной if ( !isset($r['type']) ) $r['type'] = 'blog'; // если false - то все, иначе blog или static if ($r['page_id']) $r['type'] = false; // если указан номер, то тип страницы сбрасываем if ( !isset($r['order']) ) $r['order'] = 'page_date_publish'; // поле сортировки страниц if ( !isset($r['order_asc']) ) $r['order_asc'] = 'desc'; // поле сортировки страниц // если нужно вывести все данные, невзирая на limit, то no_limit=true - пагинация при этом отключается if ( !isset($r['no_limit']) ) $r['no_limit'] = false; if ($r['no_limit']) $r['pagination'] = false; // custom_type - аналог is_type - анализ явного указания типа данных if ( !isset($r['custom_type']) ) $r['custom_type'] = false; // кастомная функция - вызывается вместо автоанализа по is_type // эта функция обязательно должна быть подобна _mso_sql_build_home($r, &$pag) и т.п. if ( !isset($r['custom_func']) ) $r['custom_func'] = false; // для функции mso_page_title - передаем тип ссылки для страниц if ( !isset($r['link_page_type']) ) $r['link_page_type'] = 'page'; // для _mso_sql_build_category можно указать массив номеров рубрик // и получить все записи указанных рубрик if ( !isset($r['categories']) ) $r['categories'] = array(); // исключить указанные в массиве записи if ( !isset($r['exclude_page_id']) )$r['exclude_page_id'] = array(); // произвольный slug - используется там, где вычисляется mso_segment(2) // страница, рубрика, метка, поиск if ( !isset($r['slug']) ) $r['slug'] = false; // если true, то публикуется только те, которые старше текущей даты // если false - то публикуются все // если юзер залогинен, то дата сбрасывается при выводе page if ( !isset($r['date_now']) ) $r['date_now'] = true; // смещение времени в формате ЧЧ:ММ // если нет, то берется из настроек if ( !isset($r['time_zone']) ) { $time_zone = getinfo('time_zone'); if ($time_zone < 10 and $time_zone > 0) $time_zone = '0' . $time_zone; elseif ($time_zone > -10 and $time_zone < 0) { $time_zone = '0' . $time_zone; $time_zone = str_replace('0-', '-0', $time_zone); } else $time_zone = '00.00'; $time_zone = str_replace('.', ':', $time_zone); $r['time_zone'] = $time_zone; } // учитывать ли опцию публикация RSS в странице - // если true, то отдаются только те, которые отмечены с этой опцией, false - все if ( !isset($r['only_feed']) ) $r['only_feed'] = false; // стутус страниц - если false, то не учитывается if ( !isset($r['page_status']) ) $r['page_status'] = 'publish'; // можно указать номер автора - получим только его записи if ( !isset($r['page_id_autor']) ) $r['page_id_autor'] = false; // получать ли информацию о рубриках // если false, то возвращает пустые массивы page_categories и page_categories_detail if ( !isset($r['get_page_categories']) ) $r['get_page_categories'] = true; // получать ли информацию о метках и мета страницы // объединены, потому что это один sql-запрос // если false, то возвращает пустые массивы page_tags и page_meta if ( !isset($r['get_page_meta_tags']) ) $r['get_page_meta_tags'] = true; // можно указать key и table для получения произвольных выборок мета, например метки // используется только для _mso_sql_build_tag // в качестве meta_value используется $slug if ( !isset($r['meta_key']) ) $r['meta_key'] = 'tags'; if ( !isset($r['meta_table']) ) $r['meta_table'] = 'page'; // сегмент, признак пагинации if ( !isset($r['pagination_next_url']) ) $r['pagination_next_url'] = 'next'; // функция со своим sql, в которой можно добавить свои условия if ( !isset($r['function_add_custom_sql']) ) $r['function_add_custom_sql'] = false; else if (!function_exists($r['function_add_custom_sql'])) $r['function_add_custom_sql'] = false; $CI = & get_instance(); # для каждого типа страниц строится свой sql-запрос # мы оформляем его в $CI, а здесь только выполняем $CI->db->get(); // если указана кастомная функция, то выполняем r1 if ( $r['custom_func'] and function_exists($r['custom_func']) ) $r['custom_func']($r, $pag); elseif ($r['custom_type']) // указан какой-то свой тип данных - аналог is_type { $custom_type = $r['custom_type']; if ( $custom_type == 'home' ) _mso_sql_build_home($r, &$pag); elseif ( $custom_type == 'page' ) _mso_sql_build_page($r, &$pag); elseif ( $custom_type == 'category' ) _mso_sql_build_category($r, &$pag); elseif ( $custom_type == 'tag' ) _mso_sql_build_tag($r, &$pag); elseif ( $custom_type == 'archive' ) _mso_sql_build_archive($r, &$pag); elseif ( $custom_type == 'search' ) _mso_sql_build_search($r, &$pag); elseif ( $custom_type == 'author' ) _mso_sql_build_author($r, &$pag); else return array(); } elseif ( is_type('home') ) _mso_sql_build_home($r, &$pag); elseif ( is_type('page') ) _mso_sql_build_page($r, &$pag); elseif ( is_type('category') ) _mso_sql_build_category($r, &$pag); elseif ( is_type('tag') ) _mso_sql_build_tag($r, &$pag); elseif ( is_type('archive') ) _mso_sql_build_archive($r, &$pag); elseif ( is_type('search') ) _mso_sql_build_search($r, &$pag); elseif ( is_type('author') ) _mso_sql_build_author($r, &$pag); else return array(); // хук, если нужно поменять параметры // $r_restore = $r; $r = mso_hook('mso_get_pages', $r); // pr(_sql()); // сам запрос и его обработка $query = $CI->db->get(); // восстанавливать после запроса??? // $r = mso_hook('mso_get_pages_restore', $r_restore); if ($query->num_rows() > 0) { $pages = $query->result_array(); // pr($pages); if (is_type('page')) { // проверяем статус публикации - если page_status <> publish то смотрим автора и сравниваем с текущим юзером $page_status = $pages[0]['page_status']; // в page - всегда одна запись if ($page_status != 'publish') // не опубликовано { if ( isset($MSO->data['session']['users_id']) ) // залогинен { if ( $pages[0]['page_id_autor'] <> $MSO->data['session']['users_id'] ) return array(); else { if ($page_status == 'draft') $pages[0]['page_title'] .= ' ' . t('(черновик)'); // else $pages[0]['page_title'] .= ' (личное)'; } } else return array(); // не залогинен } } // массив всех page_id $all_page_id = array(); foreach ($pages as $key=>$page) { $all_page_id[] = $page['page_id']; $content = $page['page_content']; $content = str_replace('<!-- pagebreak -->', '[cut]', $content); // совместимость с TinyMCE # если после [cut] пробелы до конца строки, то удалим их $content = preg_replace('|\[cut\]\s*<br|', '[cut]<br', $content); $content = preg_replace('|\[cut\](\ )*<br|', '[cut]<br', $content); $content = preg_replace('|\[cut\](\ )*(\s)*<br|', '[cut]<br', $content); //$content = mso_hook('content', $content); //$content = mso_hook('content_auto_tag', $content); //$content = mso_hook('content_balance_tags', $content); //$content = mso_hook('content_out', $content); $pages[$key]['page_slug'] = $page['page_slug'] = mso_slug($page['page_slug']); if ($r['work_cut']) // обрабатывать cut { if ($r['xcut']) // можно использовать [xcut] $content = str_replace('[xcut', '[mso_xcut][cut', $content); else $content = str_replace('[xcut', '[cut', $content); if ( preg_match('/\[cut(.*?)?\]/', $content, $matches) ) { $content = explode($matches[0], $content, 2); $cut = $matches[1]; } else { $content = array($content); $cut = ''; } $output = $content[0]; if ( count($content) > 1 ) { // ссылка на «далее...» if ($r['cut']) { if ($cut) { if (isset($content[1])) { if (strpos($cut, '%wordcount%')!==false) $cut = str_replace('%wordcount%', mso_wordcount($content[1]), $cut); } } else $cut = $r['cut']; # отображать ссылку? if ($r['show_cut']) $output .= mso_page_title( $page['page_slug'] . $r['a_link_cut'], $cut, '<span class="cut">', '</span>', true, false, $r['link_page_type'] ); } else { $output .= '<a name="cut"></a>' . $content[1]; } // $output = mso_balance_tags($output); } if ($r['xcut']) { if (strpos($output, '[mso_xcut]') !== false) { $xcontent = explode('[mso_xcut]', $output); if ($r['cut'] and $cut) { if ($r['show_xcut']) $cut = mso_page_title( $page['page_slug'] . $r['a_link_cut'], $cut, '<span class="cut">', '</span>', true, false, $r['link_page_type'] ); else $cut = ''; $output = $xcontent[0] . $cut; } else $output = $xcontent[1]; } } } else $output = $content; // отдаем как есть # хуки на контент # по возможности используйте хук content - остальные могут поменяться $output = mso_hook('content_in', $output); $output = mso_hook('content', $output); $output = mso_hook('content_auto_tag', $output); $output = mso_hook('content_balance_tags', $output); $output = mso_hook('content_out', $output); $output = mso_hook('content_complete', $output); $pages[$key]['page_content'] = $output; $pages[$key]['page_categories'] = array(); $pages[$key]['page_categories_detail'] = array(); $pages[$key]['page_tags'] = array(); $pages[$key]['page_meta'] = array(); } if ($r['get_page_categories']) { // теперь одним запросом получим все рубрики каждой записи $CI->db->select('page_id, category.category_id, category.category_name, category.category_slug'); $CI->db->where_in('page_id', $all_page_id); $CI->db->order_by('category.' . $r['cat_order'], $r['cat_order_asc']); // сортировка рубрик $CI->db->from('cat2obj'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); $query = $CI->db->get(); $cat = $query->result_array(); // переместим все в массив page_id[] = category_id $page_cat = array(); $page_cat_detail = array(); foreach ($cat as $key=>$val) { $page_cat[$val['page_id']][] = $val['category_id']; $page_cat_detail[$val['page_id']][$val['category_id']] = array('category_name'=>$val['category_name'], 'category_slug' => $val['category_slug']); } } if ($r['get_page_meta_tags']) { // по этому же принципу получаем все метки $CI->db->select('meta_id_obj, meta_key, meta_value'); $CI->db->where( array ( 'meta_table' => 'page' ) ); $CI->db->where_in('meta_id_obj', $all_page_id); $CI->db->order_by('meta_value'); $query = $CI->db->get('meta'); $meta = $query->result_array(); // переместим все в массив page_id[] = category_id $page_meta = array(); foreach ($meta as $key=>$val) { $page_meta[$val['meta_id_obj']][$val['meta_key']][] = $val['meta_value']; } } // добавим в массив pages полученную информацию по меткам и рубрикам foreach ($pages as $key=>$val) { // рубрики if ( $r['get_page_categories'] and isset($page_cat[$val['page_id']]) and $page_cat[$val['page_id']] ) { $pages[$key]['page_categories'] = $page_cat[$val['page_id']]; $pages[$key]['page_categories_detail'] = $page_cat_detail[$val['page_id']]; } // метки отдельно как page_tags if ($r['get_page_meta_tags'] and isset($page_meta[ $val['page_id'] ]['tags'] ) and $page_meta[$val['page_id']]['tags'] ) $pages[$key]['page_tags'] = $page_meta[$val['page_id']]['tags']; // остальные мета отдельно в page_meta if ( $r['get_page_meta_tags'] and isset($page_meta[$val['page_id']]) and $page_meta[$val['page_id']] ) $pages[$key]['page_meta'] = $page_meta[$val['page_id']]; } } else $pages = array(); return $pages; } # главная страница - home function _mso_sql_build_home($r, &$pag) { $CI = & get_instance(); $offset = 0; if ($r['cat_id']) $cat_id = mso_explode($r['cat_id']); else $cat_id = false; // еслу указан массив номеров рубрик, значит выводим только его if ($r['categories']) $categories = true; else $categories = false; // если указаны номера записей, котоыре следует исключить if ($r['exclude_page_id']) $exclude_page_id = true; else $exclude_page_id = false; // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page.page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page.page_status', $r['page_status']); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish < ', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type.page_type_name', $r['type']); else $CI->db->where('page_type.page_type_name', $r['type']); } if ($r['page_id']) $CI->db->where('page.page_id', $r['page_id']); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); if ($cat_id) // указаны рубрики { $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id', 'left'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); $CI->db->where_in('category.category_id', $cat_id); } if ($categories) $CI->db->where_in('category.category_id', $r['categories']); if ($exclude_page_id) $CI->db->where_not_in('page.page_id', $r['exclude_page_id']); $CI->db->order_by('page_date_publish', 'desc'); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы if (!$r['all_fields']) { if ($r['content']) { $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); } else { # такие селекты теперь нужно вызывать с false в конце... $CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login', false); } } else { $CI->db->select('page.*, page_type.*, users.*, COUNT(comments_id) AS page_count_comments'); } $CI->db->from('page'); if ($r['page_id']) $CI->db->where('page.page_id', $r['page_id']); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now ); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW' ); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['only_feed']) $CI->db->where('page_feed_allow', '1'); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('users', 'users.users_id = page.page_id_autor', 'left'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id', 'left'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); if ($cat_id) // указаны рубрики { $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id', 'left'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); $CI->db->where_in('category.category_id', $cat_id); } if ($categories) $CI->db->where_in('category.category_id', $r['categories']); if ($exclude_page_id) $CI->db->where_not_in('page.page_id', $r['exclude_page_id']); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); $CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # одиночная страница по id или slug function _mso_sql_build_page($r, &$pag) { $CI = & get_instance(); // $pag = false; if ($r['slug']) $slug = $r['slug']; else $slug = mso_segment(2); // если slug есть число, то выполняем поиск по id if (!is_numeric($slug)) $id = false; // slug не число else $id = (int) $slug; // $id = (int) $slug; // if ( (string) $slug != (string) $id ) $id = false; // slug не число if (!$r['all_fields']) { $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, page.page_id_autor, users_description, users_login'); } else { $CI->db->select('page.*, page_type.*, users.*'); } $CI->db->from('page'); // if ($page_status) $CI->db->where('page_status', $page_status); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); if (!is_login()) { //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); //if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); } if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); if ($id) // если slug число, то это может быть и номер и сам slug - неопределенность! { $CI->db->where(array('page_slug'=>$slug)); $CI->db->or_where(array('page_id'=>$slug)); } else { $CI->db->where(array('page_slug'=>$slug)); } /* #if ($id) # $CI->db->where('page_id', $id); #else # $CI->db->where('page_slug', $slug); */ $CI->db->join('users', 'users.users_id = page.page_id_autor'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->limit(1); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # рубрики function _mso_sql_build_category($r, &$pag) { $CI = & get_instance(); if ($r['slug']) $slug = $r['slug']; else $slug = mso_segment(2); // $slug = mso_segment(2); // если slug есть число, то выполняем поиск по id if (!is_numeric($slug)) $id = false; // slug не число else $id = (int) $slug; // еслу указан массив номеров рубрик, значит выводим только его if ($r['categories']) $categories = true; else $categories = false; // если указаны номера записей, котоыре следует исключить if ($r['exclude_page_id']) $exclude_page_id = true; else $exclude_page_id = false; // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); $offset = 0; if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page.page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); if ($categories) { $CI->db->where_in('category.category_id', $r['categories']); } else { if ($id) $CI->db->where('category.category_id', $id); else $CI->db->where('category.category_slug', $slug); } if ($exclude_page_id) $CI->db->where_not_in('page.page_id', $r['exclude_page_id']); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы if ($r['content']) $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, category.category_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); else $CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, users_avatar_url, category.category_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login', false); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['only_feed']) $CI->db->where('page.page_feed_allow', '1'); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } $CI->db->join('users', 'users.users_id = page.page_id_autor'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); if ($categories) { $CI->db->where_in('category.category_id', $r['categories']); } else { if ($id) { $CI->db->where('category.category_id', $id); $CI->db->or_where('category.category_slug', $slug); } else $CI->db->where('category.category_slug', $slug); } if ($exclude_page_id) $CI->db->where_not_in('page.page_id', $r['exclude_page_id']); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); $CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # страница меток function _mso_sql_build_tag($r, &$pag) { $CI = & get_instance(); if ($r['slug']) $slug = $r['slug']; else $slug = mso_segment(2); // $slug = mso_segment(2); // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); $offset = 0; if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page.page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); // $CI->db->where('page_type_name', 'blog'); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('meta', 'meta.meta_id_obj = page.page_id'); $CI->db->where('meta_key', $r['meta_key']); $CI->db->where('meta_table', $r['meta_table']); if ($slug) $CI->db->where('meta_value', $slug); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы if ($r['content']) $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, meta.meta_value AS tag_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); else $CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, meta.meta_value AS tag_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login', false); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); // $CI->db->where('page_type_name', 'blog'); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('users', 'users.users_id = page.page_id_autor'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('meta', 'meta.meta_id_obj = page.page_id'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); $CI->db->where('meta_key', $r['meta_key']); $CI->db->where('meta_table', $r['meta_table']); if ($slug) $CI->db->where('meta_value', $slug); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); $CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # архивы по датам function _mso_sql_build_archive($r, &$pag) { $CI = & get_instance(); $offset = 0; $year = (int) mso_segment(2); if ($year>date('Y', mktime()) or $year<2006) $year = date('Y', mktime()); $month = (int) mso_segment(3); if ($month>12 or $month<1) $month = date('m', mktime()); $day = (int) mso_segment(4); if ($day) { if ($day>31 or $day<1) $day = 1; $dmax = get_total_days($month, $year); if ( $day>$dmax ) $day = $dmax; } //else $day = 1; if ($day) { $date_in = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month. '-' . $day . ' 00:00:00', -1); $date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month. '-' . $day . ' 23:59:59', -1); } else { $date_in = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month. '-1 00:00:00', -1); $date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month. '-31 23:59:59', -1); } // pr($date_in); // pr($date_in_59); // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); // echo $year . $month . $day; if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } $CI->db->where('page_date_publish >= ', $date_in); $CI->db->where('page_date_publish <= ', $date_in_59); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); // $CI->db->order_by('page_date_publish', 'desc'); $CI->db->order_by($r['order'], $r['order_asc']); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); $CI->db->where('page_date_publish >= ', $date_in); $CI->db->where('page_date_publish <= ', $date_in_59); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } $CI->db->join('users', 'users.users_id = page.page_id_autor'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); $CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # страница поиска function _mso_sql_build_search($r, &$pag) { $CI = & get_instance(); if ($r['slug']) $search = $r['slug']; else $search = mso_segment(2); // $search = mso_segment(2); $search = mso_strip(strip_tags($search)); // при получении учитываем часовой пояс //$date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); $offset = 0; if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); // $CI->db->like('page_content', $search); // $CI->db->or_like('page_title', $search); $CI->db->where( '(`page_content` LIKE \'%' . $CI->db->escape_str($search) . '%\' OR `page_title` LIKE \'%' . $CI->db->escape_str($search) . '%\')', '', false); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); // $CI->db->order_by('page_date_publish', 'desc'); $CI->db->order_by($r['order'], $r['order_asc']); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); $CI->db->from('page'); //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']); // like делаем свой $CI->db->where( '(`page_content` LIKE \'%' . $CI->db->escape_str($search) . '%\' OR `page_title` LIKE \'%' . $CI->db->escape_str($search) . '%\')', '', false); // $CI->db->like('page_content', $search); // $CI->db->or_like('page_title', $search); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } $CI->db->join('users', 'users.users_id = page.page_id_autor', 'left'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id', 'left'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); // $CI->db->order_by('page_date_publish', 'desc'); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); $CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # страницы автора function _mso_sql_build_author($r, &$pag) { // $CI = & get_instance(); // _mso_sql_build_home($r, &$pag); $CI = & get_instance(); if ($r['slug']) $slug = $r['slug']; else $slug = mso_segment(2); // $slug = mso_segment(2); // если slug есть число, то выполняем поиск по id if (!is_numeric($slug)) $id = 0; // slug не число else $id = (int) $slug; // при получении учитываем часовой пояс // $date_now = mso_date_convert('Y-m-d H:i:s', date('Y-m-d H:i:s')); $offset = 0; if ($r['pagination']) { # пагинация # для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу # сама пагинация выводится отдельным плагином # запрос один в один, кроме limit и юзеров $CI->db->select('page.page_id'); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } //if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); //$CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id'); //$CI->db->join('category', 'cat2obj.category_id = category.category_id'); $CI->db->where('page.page_id_autor', $id); if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); $query = $CI->db->get(); $pag_row = $query->num_rows(); if ($pag_row > 0) { $pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации $pag['limit'] = $r['limit']; // записей на страницу $current_paged = mso_current_paged($r['pagination_next_url']); if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount']; $offset = $current_paged * $pag['limit'] - $pag['limit']; } else { $pag = false; } } else $pag = false; // теперь сами страницы if ($r['content']) $CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, users_avatar_url, category.category_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login'); else $CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, users_avatar_url, category.category_name, COUNT(comments_id) AS page_count_comments, page.page_id_autor, users_description, users_login', false); $CI->db->from('page'); if ($r['page_status']) $CI->db->where('page_status', $r['page_status']); // if ($r['date_now']) $CI->db->where('page_date_publish <', $date_now); // if ($r['date_now']) $CI->db->where('page_date_publish <', 'NOW'); if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); if ($r['only_feed']) $CI->db->where('page.page_feed_allow', '1'); if ($r['type']) { if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']); else $CI->db->where('page_type_name', $r['type']); } $CI->db->join('users', 'users.users_id = page.page_id_autor'); $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id'); $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id'); $CI->db->join('category', 'cat2obj.category_id = category.category_id'); $CI->db->join('comments', 'comments.comments_page_id = page.page_id AND comments_approved = 1', 'left'); $CI->db->where('page.page_id_autor', $id); $CI->db->order_by($r['order'], $r['order_asc']); $CI->db->group_by('page.page_id'); //$CI->db->group_by('comments_page_id'); if (!$r['no_limit']) { if ($pag and $offset) $CI->db->limit($r['limit'], $offset); else $CI->db->limit($r['limit']); } if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql(); } # получить ссылку на редактирование страницы function mso_page_edit_link($id = 0, $title = 'Редактировать', $do = '', $posle = '', $echo = true) { global $MSO; $id = (int) $id; if (!$id) return ''; if (is_login()) { if ($echo) echo $do . '<a href="' . $MSO->config['site_admin_url'] . 'page_edit/' . $id . '">' . t($title) . '</a>' . $posle; else return $do . '<a href="' . $MSO->config['site_admin_url'] . 'page_edit/' . $id . '">' . t($title) . '</a>' . $posle; } } # получить ссылки на рубрики указанной страницы function mso_page_cat_link($cat = array(), $sep = ', ', $do = '', $posle = '', $echo = true, $type = 'category', $link = true) { global $MSO; if (!$cat) return ''; // получим массив рубрик из mso_cat_array_single $all_cat = mso_cat_array_single(); $out = ''; foreach ($cat as $id) { if ($link) $out .= '<a href="' . $MSO->config['site_url'] . $type . '/' . $all_cat[$id]['category_slug'] . '">' . $all_cat[$id]['category_name'] . '</a> '; else $out .= $all_cat[$id]['category_name'] . ' '; } $out = trim($out); $out = str_replace(' ', $sep, $out); if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # получить ссылки на метки указанной страницы function mso_page_tag_link($tags = array(), $sep = ', ', $do = '', $posle = '', $echo = true, $type = 'tag', $link = true) { global $MSO; if (!$tags) return ''; $out = ''; foreach ($tags as $tag) { if ($link) $out .= '<a href="' . $MSO->config['site_url'] . $type . '/' . urlencode($tag) . '" rel="tag">' . $tag . '</a> '; else $out .= $tag . ' '; } $out = trim($out); $out = str_replace(' ', $sep, $out); if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # получение даты function mso_page_date($date = 0, $format = 'Y-m-d H:i:s', $do = '', $posle = '', $echo = true) { if (!$date) return ''; if (is_array($format)) // формат в массиве, значит там и замены { if (isset($format['format'])) $df = $format['format']; else $df = 'Y-m-d H:i:s'; if (isset($format['days'])) $dd = $format['days']; else $dd = false; if (isset($format['month'])) $dm = $format['month']; else $dm = false; } else { $df = $format; $dd = false; $dm = false; } // учитываем смещение времени time_zone $out = mso_date_convert($df, $date, true, $dd, $dm); if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # формирование титла или ссылки на страницу function mso_page_title($page_slug = '', $page_title = 'no title', $do = '<h1>', $posle = '</h1>', $link = true, $echo = true, $type = 'page') { global $MSO; if (!$page_slug) return ''; if ($link) $out = '<a href="' . $MSO->config['site_url'] . $type . '/' . $page_slug . '" title="' . mso_strip($page_title) . '">' . $page_title . '</a>'; else $out = $page_title; if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # формирование ссылки для rss страницы function mso_page_feed($page_slug = '', $page_title = 'Подписаться', $do = '<p>', $posle = '</p>', $link = true, $echo = true, $type = 'page') { global $MSO; if (!$page_slug) return ''; if ($link) $out = '<a href="' . $MSO->config['site_url'] . $type . '/' . $page_slug . '/feed">' . t($page_title) . '</a>'; else $out = $page_title; if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # вывод текста function mso_page_content($page_content = '', $use_password = true, $message = 'Данная запись защищена паролем.') { global $page; mso_hook('content_start'); # хук на начало блока if ($use_password and $page['page_password']) // есть пароль { $form ='<p><strong>' . t($message) . '</strong></p>'; $form .= '<form action="' . getinfo('siteurl') . 'page/' . $page['page_slug'] . '" method="post">' . mso_form_session('f_session_id'); $form .= '<input type="hidden" name="f_page_id" value="' . $page['page_id'] . '">'; $form .= '<p>' . t('Пароль:', 'common') . ' <input type="text" name="f_password" value=""> '; $form .= '<input type="submit" name="f_submit" value="ОК"></p>'; $form .= '</form>'; // возможно пароль уже был отправлен if ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_page_id', 'f_password')) ) { mso_checkreferer(); $f_page_id = (int) $post['f_page_id']; // номер записи $f_password = $post['f_password']; // пароль if ($f_page_id == $page['page_id'] and $f_password == $page['page_password']) { // верный пароль echo mso_hook('content_content', $page_content); } else // ошибка в пароле { echo '<p style="color: red;">' . t('<strong>Ошибочный пароль!</strong> Повторите ввод.') . '</p>'. $form; } } else // нет post, выводим форму { echo $form; } } else // нет пароля { echo mso_hook('content_content', $page_content); } // mso_hook('content_end'); # хук на конец блока } # некоторые плагины нужно выводить после всех хуков на content function mso_page_content_end() { mso_hook('content_end'); # хук на конец блока } # получение meta function mso_page_meta($meta = '', $page_meta = array(), $do = '', $posle = '', $razd = ', ', $echo = true) { if (!$meta or !$page_meta) return ''; if (isset($page_meta[$meta]) and $page_meta[$meta]) { $out = ''; foreach ( $page_meta[$meta] as $val ) $out .= $val . ' '; $out = trim($out); if (!$out) return ''; $out = str_replace(' ', $razd, trim($out) ); } else return ''; if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # формирование ссылки «обсудить» если разрешен комментарий function mso_page_comments_link($page_comment_allow = true, $page_slug = '', $title = 'Обсудить', $do = '', $posle = '', $echo = true, $type = 'page') { global $MSO; if (is_array($page_comment_allow)) // первый элемент - массив, значит принимаем его значения - остальное игнорируем { $def = array( 'page_comment_allow' => true, // разрешены комментарии? 'page_slug' => '', // короткая ссылка страницы 'title' => t('Обсудить'), // титул, если есть ссылка 'title_no_link' => t('Посмотреть комментарии'), // титул если ссылки нет 'title_no_comments' => t('Обсудить'), // титул если еще нет комментариев 'do' => '', // текст ДО 'posle' => '', // текст ПОСЛЕ 'echo' => true, // выводить? 'page_count_comments' => 0 // колво комментов ); $r = array_merge($def, $page_comment_allow); // объединяем дефолт с входящим if (!$r['page_slug']) return ''; // не указан slug - выходим // pr($r); $out = ''; if (!$r['page_comment_allow']) // коментирование запрещено { if ( $r['page_count_comments'] ) // но если уже есть комментарии, то выводи строчку title_no_link { $out = $r['do'] . '<a href="' . $MSO->config['site_url'] . $type . '/' . $r['page_slug'] . '#comments">' . $r['title_no_link'] . '</a>' . $r['posle']; } } else { if ( !$r['page_count_comments'] ) // если нет комментариев, то выводим строчку title_no_link $out = $r['do'] . '<a href="' . $MSO->config['site_url'] . $type . '/' . $r['page_slug'] . '#comments">' . t($r['title_no_comments']) . '</a>' . $r['posle']; else $out = $r['do'] . '<a href="' . $MSO->config['site_url'] . $type . '/' . $r['page_slug'] . '#comments">' . t($r['title']) . '</a>' . $r['posle']; } if ($r['echo']) echo $out; else return $out; } else // обычные параметры { if (!$page_slug) return ''; if (!$page_comment_allow) return ''; $out = $do . '<a href="' . $MSO->config['site_url'] . $type . '/' . $page_slug . '#comments">' . t($title) . '</a>' . $posle; if ($echo) echo $out; else return $out; } } # получить ссылкe на автора страницы function mso_page_author_link($users_nik = '', $page_id_autor = '', $do = '', $posle = '', $echo = true, $type = 'author', $link = true) { global $MSO; if (!$users_nik or !$page_id_autor) return ''; $out = ''; if ($link) $out .= '<a href="' . $MSO->config['site_url'] . $type . '/' . $page_id_autor . '">' . $users_nik . '</a>'; else $out .= $users_nik; if ($echo) echo $do . $out . $posle; else return $do . $out . $posle; } # функция из Calendar.php if ( !function_exists('get_total_days') ) { function get_total_days($month, $year) { $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if ($month < 1 OR $month > 12) return 0; if ($month == 2) { if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) return 29; } return $days_in_month[$month - 1]; } } # Функции которые выполняют роль подсчета количества прочтения записи # первая функция, проверяет из кука значение массива с текущим url # если номера не совпадают, то функция устанавливает значение прочтений больше на 1 # если совпадают, значит запись уже была прочитана с этого компа # если нужно убрать уникальность и учитывать все хиты, то $unique = false # начения хранятся в виде url1|url2|url2|url3 # url - второй сегмент # время жизни 30 дней: 60 секунд * 60 минут * 24 часа * 30 дней = 2592000 /* старый вариант function mso_page_view_count_first($unique = true, $name_cookies = 'maxsite-cms', $expire = 2592000) { if ( !mso_get_option('page_view_enable', 'templates', '1') ) return true; global $_COOKIE; if (isset($_COOKIE[$name_cookies])) $all_slug = $_COOKIE[$name_cookies]; // значения текущего кука else $all_slug = ''; // нет такой куки вообще $slug = mso_segment(2); $all_slug = explode('|', $all_slug); // разделим в массив if ( $unique ) if ( in_array($slug, $all_slug) ) return false; // уже есть текущий урл - не увеличиваем счетчик // нужно увеличить счетчик $all_slug[] = $slug; // добавляем текущий id $all_slug = array_unique($all_slug); // удалим дубли на всякий пожарный $all_slug = implode('|', $all_slug); // соединяем обратно в строку $expire = time() + $expire; @setcookie($name_cookies, $all_slug, $expire); // записали в кук // получим текущее значение page_view_count // и увеличиваем значение на 1 $CI = & get_instance(); $CI->db->select('page_view_count'); $CI->db->where('page_slug', $slug); $CI->db->limit(1); $query = $CI->db->get('page'); if ($query->num_rows() > 0) { $pages = $query->row_array(); $page_view_count = $pages['page_view_count'] + 1; $CI->db->where('page_slug', $slug); $CI->db->update('page', array('page_view_count'=>$page_view_count)); $CI->db->cache_delete('page', $slug); return true; } } */ # новый вариант от Ramir'а # http://forum.max-3000.com/viewtopic.php?f=6&t=129#p689 function mso_page_view_count_first($unique = false, $name_cookies = 'maxsite-cms', $expire = 2592000) { global $_COOKIE, $_SESSION; if ( !mso_get_option('page_view_enable', 'templates', '1') AND !$unique) return true; //если нет такой опции или не пришло в функцию, то выходим if ( !$unique ) $unique = mso_get_option('page_view_enable', 'templates', '1'); $slug = mso_segment(2); $all_slug = array(); if( $unique == 0 ) return false; // не вести подсчет elseif ($unique == 1) //с помощью куки { if (isset($_COOKIE[$name_cookies])) $all_slug = explode('|', $_COOKIE[$name_cookies]); // значения текущего кука if ( in_array($slug, $all_slug) ) return false; // уже есть текущий урл - не увеличиваем счетчик } elseif ($unique == 2) //с помощью сессии { session_start(); if (isset($_SESSION[$name_cookies])) $all_slug = explode('|', $_SESSION[$name_cookies]); // значения текущей сессии if ( in_array($slug, $all_slug) ) return false; // уже есть текущий урл - не увеличиваем счетчик } // нужно увеличить счетчик $all_slug[] = $slug; // добавляем текущий slug $all_slug = array_unique($all_slug); // удалим дубли на всякий пожарный $all_slug = implode('|', $all_slug); // соединяем обратно в строку $expire = time() + $expire; if ($unique == 1) @setcookie($name_cookies, $all_slug, $expire); // записали в кук elseif ($unique == 2) $_SESSION[$name_cookies]=$all_slug; // записали в сессию // получим текущее значение page_view_count // и увеличиваем значение на 1 $CI = & get_instance(); $CI->db->select('page_view_count'); $CI->db->where('page_slug', $slug); $CI->db->limit(1); $query = $CI->db->get('page'); if ($query->num_rows() > 0) { $pages = $query->row_array(); $page_view_count = $pages['page_view_count'] + 1; $CI->db->where('page_slug', $slug); $CI->db->update('page', array('page_view_count'=>$page_view_count)); $CI->db->cache_delete('page', $slug); return true; } } # вывод количества просмотров текущей записи function mso_page_view_count($page_view_count = 0, $do = '<span>Прочтений:</span> ', $posle = '', $echo = true) { if (!$page_view_count) return ''; // если в опции включено не вести подсчет, то блок не выводим if (mso_get_option('page_view_enable', 'templates', 0) == 0) return ''; if ($echo) echo t($do) . $page_view_count . $posle; else return t($do) . $page_view_count . $posle; } # вывод списка страниц по паренту - навигация под страницами - все связанные 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->where('page_date_publish <', 'NOW'); $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; } // pr($k); // pr($r); if (!isset($r[$k]['childs'])) $r = array(); // в итоге нет детей у первого элемента, все обнуляем 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->where('page_date_publish <', 'NOW'); $CI->db->order_by('page_menu_order'); $query = $CI->db->get('page'); $result = $query->result_array(); // здесь все рубрики if ($result) { $r0 = array(); 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; } ?>