<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * MaxSite CMS
 * (c) https://max-3000.com/
 * 
 */

// класс для вывода блоков записей
class Block_pages
{
    protected $param; // массив входящих данных для получения записей
    protected $pages; // полученные записи
    protected $pagination; // если используется пагинация

    public $go = false; // признак, что можно делать вывод

    public function __construct($r1 = [], $UNIT = [])
    {
        if ($r1 !== false) $this->get_pages($r1, $UNIT); // сразу получаем записи
    }

    // метод, где получаются записи
    protected function get_pages($r, $UNIT = [])
    {
        // дефолтные значения для получения записей
        $default = array(
            'limit' => 1, // колво записей
            'cut' => '»»»', // ссылка cut
            'pagination' => false, // выводить пагинацию
            'cat_id' => 0, // можно указать рубрики через запятую
            'exclude_cat_id' => 0, // исключенные рубрики через запятую
            'page_id' => 0, // можно указать записи через запятую
            'page_id_autor' => false, // записи автора
            'type' => 'blog', // можно указать тип записей
            'order' => 'page_date_publish', // поле сортировки страниц
            'order_asc' => 'desc', // поле сортировки страниц
            'show_cut' => true, // показывать ссылку cut
            'date_now' => true, // учитывать время публикации
            'exclude_page_allow' => true, // учитывать исключенные ранее страницы
            // 'exclude_page_add' => true, // разрешить добавлять полученные страницы в исключенные
            'function_add_custom_sql' => false, // дополнительная функция для sql-запроса 
            'pages_reverse' => false, // реверс результата 
        );

        $this->param = array_merge($default, $r); // объединяем с дефолтом
        $exclude_page_id = ($this->param['exclude_page_allow']) ? mso_get_val('exclude_page_id') : [];

        $this->pages = mso_get_pages(
            [
                'limit' => $this->param['limit'],
                'cut' => $this->param['cut'],
                'pagination' => $this->param['pagination'],
                'cat_id' => $this->param['cat_id'],
                'exclude_cat_id' => $this->param['exclude_cat_id'],
                'page_id' => $this->param['page_id'],
                'page_id_autor' => $this->param['page_id_autor'],
                'type' => $this->param['type'],
                'order' => $this->param['order'],
                'order_asc' => $this->param['order_asc'],

                'show_cut' => $this->param['show_cut'],
                'show_xcut' => $this->param['show_cut'],

                'date_now' => $this->param['date_now'],

                'custom_type' => 'home',
                'exclude_page_id' => $exclude_page_id, // исключаем получение уже выведенных записей

                'function_add_custom_sql' => $this->param['function_add_custom_sql'],
                'pages_reverse' => $this->param['pages_reverse'],

                // 'get_page_categories' => false,
                // 'get_page_count_comments' => false,

            ],
            $this->pagination
        );

        $this->go = ($this->pages) ? true : false;

        // цепляем $UNIT к каждой записи
        if ($this->pages) {
            for ($i = 0; $i < count($this->pages); $i++) {
                $this->pages[$i]['UNIT'] = $UNIT;
            }
        }
    }

    public function set_pages($pages, $pagination)
    {
        $this->pages = $pages;
        $this->pagination = $pagination;
        if ($pagination) $this->param['pagination'] = true;
        $this->go = ($this->pages) ? true : false;
    }

    // метод, выводящий записи
    public function output($r = [])
    {
        if (!$this->pages) return; // нет записей, выходим

        // дефолтный формат вывода
        $default = [
            'title_start' => '<h3 class="home-last-page">',
            'title_end' => '</h3>',

            'date' => 'D, j F Y г. в H:i',
            'date_start' => '<span class="date"><time datetime="[page_date_publish_iso]">',
            'date_end' => '</time></span>',

            'cat_start' => ' | <span class="cat">',
            'cat_end' => '</span>',
            'cat_sep' => ', ',

            'tag_start' => ' | <span class="tag">',
            'tag_end' => '</span>',
            'tag_sep' => ', ',
            'tag_class' => '',

            'author_start' => '',
            'author_end' => '',

            'read' => '»»»',
            'read_start' => '',
            'read_end' => '',

            'comments_count_start' => '',
            'comments_count_end' => '',

            'thumb' => true, // использовать миниатюры
            'thumb_width' => 320,
            'thumb_height' => 180,
            'thumb_class' => 'thumb left', // css-класс картинки
            'thumb_link_class' => '', // css-класс ссылки 
            'thumb_link' => true, // формировать ссылку на запись 
            'thumb_add_start' => '', // произвольная добавка перед img 
            'thumb_add_end' => '', // произвольная добавка после img 
            'thumb_type_resize' => 'resize_full_crop_center', // тип создания миниатюры  

            // имя файла формируется как placehold_path + placehold_file
            'placehold' => false, // если нет картинки, выводим плейсхолд (true) или ничего (false)
            'placehold_path' => 'http://placehold.it/', // путь к плейсхолдеру
            // getinfo('template_url') . 'images/placehold/'
            'placehold_pattern' => '[W]x[H].png', // шаблон плейсхолдера : width x height .png
            // где [W] меняется на ширину, [H] — высоту, [RND] - число 1..10
            'placehold_file' => false,  // файл плейсхолдера, если false, то будет: width x height .png
            // если равно data, то свой плейсхолдер
            'placehold_data_bg' => '#CCCCCC', // цвет фона, если data

            'block_start' => '', // html вначале
            'block_end' => '', // html в конце

            'line1' => '[thumb]', // первая линия — перед контентом
            'line1_start' => '',
            'line1_end' => '',

            'line2' => '[title]', // вторая линия — перед контентом
            'line2_start' => '',
            'line2_end' => '',

            'line3' => '[date] [cat]', // третья линия — перед контентом
            'line3_start' => '',
            'line3_end' => '',

            'line4' => '', // четвертая линия — после контента
            'line4_start' => '',
            'line4_end' => '',

            'line5' => '', // пятая линия — после контента
            'line5_start' => '',
            'line5_end' => '',

            // вывод контента
            // если указано любое значение, то вывод по этому варианту иначе обычный вывод до cut
            'content' => true, // разрешить вывод контента 
            'content_chars' => 0, // колво символов 
            'content_words' => 0, // колво слов 
            'content_cut' => ' ...', // завершение в контенте 
            'content_start' => '<div class="mso-page-content">', // обрамляющий блок до
            'content_end' => '</div>', // обрамляющий блок после

            'clearfix' => false, // отбивать после вывода $p->clearfix();

            'page_start' => '', // html в начале вывода записи 
            'page_end' => '', // html в конце вывода записи

            'pagination_start' => '', // html в начале пагинации 
            'pagination_end' => '', // html в конце пагинации
            'pagination_in_block' => true, // пагинации внутри block_start и block_end

            'exclude_page_add' => true, // разрешить добавлять полученные страницы в исключенные

            // триггеры, которые срабатывают в начале указанного номера записи
            // trigger@3 = привет1
            // trigger@5 = привет2

        ];

        $r = array_merge($default, $r); // объединяем

        $p = new Page_out; // шаблонизатор

        eval(mso_tmpl_prepare($r['block_start'], false));

        // формат записи
        $p->format('title', $r['title_start'], $r['title_end']);
        $p->format('date', $r['date'], $r['date_start'], $r['date_end']);
        $p->format('author', $r['author_start'], $r['author_end']);
        $p->format('cat', $r['cat_sep'], $r['cat_start'], $r['cat_end']);
        $p->format('tag', $r['tag_sep'], $r['tag_start'], $r['tag_end'], $r['tag_class']);
        $p->format('read', $r['read'], $r['read_start'], $r['read_end']);
        $p->format('comments_count', $r['comments_count_start'], $r['comments_count_end']);

        if ($r['exclude_page_add']) $exclude_page_id = mso_get_val('exclude_page_id', []);

        foreach ($this->pages as $page) {
            $p->load($page); // загружаем данные записи

            if (isset($r['UNIT']['trigger@' . $p->num])) {
                eval(mso_tmpl_prepare($r['UNIT']['trigger@' . $p->num], false));
            }

            if ($r['thumb']) {
                // миниатюра
                // плейсхолд
                if ($r['placehold']) {
                    if ($r['placehold_file']) {
                        if ($r['placehold_file'] == 'data') {
                            // сами генерируем плейсхолд
                            // mso_holder($width = 100, $height = 100, $text = true, $background_color = '#CCCCCC', $text_color = '#777777', $font_size = 5)
                            $t_placehold = mso_holder($r['thumb_width'], $r['thumb_height'], false, $r['placehold_data_bg']);
                        } else {
                            $t_placehold = $r['placehold_path'] . $r['placehold_file'];
                        }
                    } else {
                        $t_placehold_pattern = str_replace('[W]', $r['thumb_width'], $r['placehold_pattern']);
                        $t_placehold_pattern = str_replace('[H]', $r['thumb_height'], $t_placehold_pattern);
                        $t_placehold_pattern = str_replace('[RND]', rand(1, 10), $t_placehold_pattern);

                        $t_placehold = $r['placehold_path'] . $t_placehold_pattern;
                    }
                } else {
                    $t_placehold = false;
                }

                // если используется thumb_type_resize != resize_full_crop_center, то меняем постфикс
                $thumb_postfix = true;

                if ($r['thumb_type_resize'] !== 'resize_full_crop_center') {

                    $thumb_postfix = '-' . $r['thumb_width'] . '-' . $r['thumb_height'] . '-' . $r['thumb_type_resize'];
                }

                if (
                    $thumb = thumb_generate(
                        $p->meta_val('image_for_page'), // адрес
                        $r['thumb_width'], //ширина
                        $r['thumb_height'], //высота
                        $t_placehold,
                        $r['thumb_type_resize'], // тип создания
                        false,
                        'mini',
                        $thumb_postfix,
                        mso_get_option('upload_resize_images_quality', 'general', 90)
                    )
                ) {
                    if ($r['thumb_link'])
                        $p->thumb = '<a class="' . $r['thumb_link_class'] . '" href="' . mso_page_url($p->val('page_slug')) . '" title="' . htmlspecialchars($p->val('page_title')) . '">' . $r['thumb_add_start'] . '<img src="' . $thumb . '" class="' . $r['thumb_class'] . '" alt="' . htmlspecialchars($p->val('page_title')) . '">' . $r['thumb_add_end'] . '</a>';
                    else
                        $p->thumb = $r['thumb_add_start'] . '<img src="' . $thumb . '" class="' . $r['thumb_class'] . '" alt="' . htmlspecialchars($p->val('page_title')) . '">' . $r['thumb_add_end'];

                    $p->thumb_url = $thumb;
                    $r['thumb_url'] = $thumb;
                }
            }

            // eval(mso_tmpl_prepare($r['page_start'], false));
            $p->line($r['page_start']); // можно использовать все []-коды
            $p->line($r['line1'], $r['line1_start'], $r['line1_end']);
            $p->line($r['line2'], $r['line2_start'], $r['line2_end']);
            $p->line($r['line3'], $r['line3_start'], $r['line3_end']);

            if ($r['content']) {
                if ($r['content_chars']) {
                    $p->content_chars($r['content_chars'], $r['content_cut'], $r['content_start'], $r['content_end']);  // текст обрезанный
                } elseif ($r['content_words']) {
                    $p->content_words($r['content_words'], $r['content_cut'], $r['content_start'], $r['content_end']);  // текст обрезанный
                } else {
                    $p->content($r['content_start'], $r['content_end']);
                }
            }

            $p->line($r['line4'], $r['line4_start'], $r['line4_end']);
            $p->line($r['line5'], $r['line5_start'], $r['line5_end']);

            if ($r['clearfix']) $p->clearfix();

            // eval(mso_tmpl_prepare($r['page_end'], false));
            $p->line($r['page_end']); // можно использовать все []-коды

            // сохраняем id записей, чтобы их исключить из вывода			
            if ($r['exclude_page_add']) $exclude_page_id[] = $p->val('page_id');
        }

        if ($r['exclude_page_add']) mso_set_val('exclude_page_id', $exclude_page_id);

        if ($r['pagination_in_block'] == false)
            eval(mso_tmpl_prepare($r['block_end'], false));

        if ($this->param['pagination']) {
            if (mso_hook_present('pagination')) {
                eval(mso_tmpl_prepare($r['pagination_start'], false));
                mso_hook('pagination', $this->pagination);
                eval(mso_tmpl_prepare($r['pagination_end'], false));
            }
        }

        if ($r['pagination_in_block'] == true)
            eval(mso_tmpl_prepare($r['block_end'], false));
    }
}

# end of file
