function mso_get_pages($r = array(), &$pag) { global $MSO, $mso_page_current; $CI =& get_instance(); 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'] = tf('Далее'); } // ссылка на [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['meta_order'])) { $r['meta_order'] = 'meta_value'; } // сортировка meta if (!isset($r['meta_order_asc'])) { $r['meta_order_asc'] = 'asc'; } // порядок meta if (!isset($r['pagination'])) { $r['pagination'] = true; } // использовать пагинацию if (!isset($r['content'])) { $r['content'] = true; } // получать весь текст // если 0, значит все страницы - только для главной // можно указать номера страниц через запятую if (!isset($r['page_id'])) { $r['page_id'] = 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; } // если указано учитывать время публикации, то выполняем запрос в котором получаем // все записи, которые будущие и которые следует исключить из выборки // сей алгоритм связан с оптимизацией запросов к MySQL и значительным (очень!) ускорением // сложного select без использования NOW() if ($r['date_now']) { $CI->db->select('SQL_BUFFER_RESULT `page_id`', false); $CI->db->where('page_date_publish > ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false); $query = $CI->db->get('page'); if ($query and $query->num_rows() > 0) { $page_id_date_now = $query->result_array(); $r['page_id_date_now'] = array(); foreach ($page_id_date_now as $key => $val) { $r['page_id_date_now'][] = $val['page_id']; } } else { $r['page_id_date_now'] = false; } // нет записей } else { $r['page_id_date_now'] = false; } // не нужно учитывать время // учитывать ли опцию публикация 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; } // нужно ли получать данные по количеству комментариев к страницам if (!isset($r['get_page_count_comments'])) { $r['get_page_count_comments'] = 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; } } // хук, если нужно поменять параметры // $r_restore = $r; $r = mso_hook('mso_get_pages', $r); # для каждого типа страниц строится свой 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']) { $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(); } // сам запрос и его обработка // $query = $CI->db->get(); // нужно добавить SQL_BUFFER_RESULT // поскольку CodeIgniteryt не позволяет добавлять его явно, придется извращаться $query_sql = str_replace('SELECT ', 'SELECT SQL_BUFFER_RESULT ', $CI->db->_compile_select()); // дурацкое экранирование CodeIgniter - используем свои костыли для запятых в запросе $query_sql = str_replace('_MSO_ZAP_', ',', $query_sql); $query = $CI->db->query($query_sql); $CI->db->_reset_select(); // восстанавливать после запроса??? // $r = mso_hook('mso_get_pages_restore', $r_restore); if ($query and $query->num_rows() > 0) { $pages = $query->result_array(); $MSO->data['pages_is'] = true; // ставим признак, что записи получены 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(); if ($pages[0]['page_id_autor'] != $MSO->data['session']['users_id'] && !mso_check_allow('admin_page_edit_other')) { return array(); } else { if ($page_status == 'draft') { $pages[0]['page_title'] .= ' ' . tf('(черновик)'); } // 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 = mso_hook('content_init', $content); $content = str_replace('<!-- pagebreak -->', '[cut]', $content); // совместимость с TinyMCE $content = str_replace('<!--more-->', '[cut]', $content); // совместимость с Wordpress # если после [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']) { 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="mso-cut">', '</span>', true, false, $r['link_page_type']); } } else { $output .= '<a id="cut"></a>' . $content[1]; } } 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="mso-cut">', '</span>', true, false, $r['link_page_type']); } else { $cut = ''; } $output = $xcontent[0] . $cut; } else { $output = $xcontent[1]; } } } } else { $output = $content; } // отдаем как есть # хуки на контент $mso_page_current = $page; // глобальная переменная, где хранится текущая обрабатываемая page $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, category.category_desc, category.category_id_parent'); $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'); if ($query = $CI->db->get()) { $cat = $query->result_array(); } else { $cat = 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'], 'category_desc' => $val['category_desc'], 'category_id_parent' => $val['category_id_parent'], 'category_id' => $val['category_id']); } } if ($r['get_page_meta_tags']) { // по этому же принципу получаем все метки $CI->db->select('SQL_BUFFER_RESULT `meta_id_obj`, `meta_key`, `meta_value`', false); $CI->db->where(array('meta_table' => 'page')); $CI->db->where_in('meta_id_obj', $all_page_id); $CI->db->order_by($r['meta_order'], $r['meta_order_asc']); // сортировка мета if ($query = $CI->db->get('meta')) { $meta = $query->result_array(); } else { $meta = 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']; } } // нужно получить колво комментариев к записям if ($r['get_page_count_comments']) { $CI->db->select('SQL_BUFFER_RESULT `comments_page_id`, COUNT(`comments_id`) AS `page_count_comments`', false); $CI->db->where_in('comments_page_id', $all_page_id); $CI->db->where('comments_approved', '1'); $CI->db->group_by('comments_page_id'); $CI->db->from('comments'); $query = $CI->db->get(); $count_comments = $query->result_array(); // переместим все в массив page_count_comments $page_count_comments = array(); foreach ($count_comments as $key => $val) { $page_count_comments[$val['comments_page_id']] = $val['page_count_comments']; } } // получим данные о всех парсерах $parser_all = mso_hook('parser_register', array()); // все зарегистрированные парсеры // добавим в массив 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']]; } // колво комментариев if ($r['get_page_count_comments']) { if (isset($page_count_comments[$val['page_id']])) { $pages[$key]['page_count_comments'] = $page_count_comments[$val['page_id']]; } else { $pages[$key]['page_count_comments'] = 0; } // нет комментариев } else { $pages[$key]['page_count_comments'] = 0; } // ставим, что нет комментариев // обработка контента хуками $output = $pages[$key]['page_content']; // обработка парсером if (isset($pages[$key]['page_meta']['parser_content'])) { if ($pages[$key]['page_meta']['parser_content'][0] !== 'none') { $p = $pages[$key]['page_meta']['parser_content'][0]; if (isset($parser_all[$p]['content'])) { $func = $parser_all[$p]['content']; // функция, которую нужно выполнить if (function_exists($func)) { $output = $func($output); } } } } else { // парсер не указан, используем дефолтный // проверим его наличие по функции parser_default_content() // иначе нужно включить плагин if (!function_exists('parser_default_content')) { require_once getinfo('plugins_dir') . 'parser_default/index.php'; } $output = parser_default_content($output); } // pr($output, 1); // старые хуки, больше не используются // $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; } } else { $pages = array(); $MSO->data['pages_is'] = false; // ставим признак, что записей нет } return $pages; }
function mso_comments_content($text = '') { // текст комментария прогоняется через стандартный парсер if (!function_exists('parser_default_content')) { require_once getinfo('plugins_dir') . 'parser_default/index.php'; } $text = str_replace("\n", "<br>", $text); // обязательная замена $text = parser_default_content($text); $text = mso_hook('comments_content_out', $text); return $text; }