Beispiel #1
0
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\\](\\&nbsp;)*<br|', '[cut]<br', $content);
            $content = preg_replace('|\\[cut\\](\\&nbsp;)*(\\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;
}
Beispiel #2
0
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;
}