Бесплатная CMS для вашего сайта Разумная альтернатива WordPress

Вывод записей с помощью класса Page_out

Класс Page_out служит для более простого и управляемого вывода записей. Сам по себе вывод записей осуществляется в цикле foreach type-файла, например так:

...
if ($pages) {
    foreach ($pages as $page) {     
        echo '<h1>' . $page['page_title'] . '</h1>';
        echo '<div>' . $page['page_date'] . '</div>';
        echo '<div>' . $page['page_content'] . '</div>';
    }   
}
...

Данный пример хорошо показывает, что html-разметку мы вынуждены размещать прямо в type-файле и для того, чтобы её изменить, потребуется как минимум использовать type_foreach-файл. Сложность ещё и в том, что необходимо генерировать разный html-код при различном выводе. Например заголовок записи на странице рубрики или главной, обычно обрамляется в ссылку. Таким образом необходимо не только прописать ссылку, но и дополнительно отслеживать условие её вывода.

Другая сложность заключается в том, что в html-тэгах могут использоваться разные css-классы. Таким образом простой, как изначально казалось вывод заголовка, может обрасти множеством условий, где будет меняться сам тэг, его расположение, атрибуты и дополнительная разметка (вроде ссылки).

Класс Page_out как раз и призван решить эту проблему.

Основной принцип заключается в том, что мы разделяем формат вывода от непосредственных данных. Рассмотрим упрощенный пример использования Page_out в type-файлах.

if ($pages) { 
    // создание объекта $p
    $p = new Page_out(); 
    
    // определяем формат вывода
    $p->format('title', '<h1>', '</h1>', false);
    $p->format('date', 'D, j F Y г.', '<span><time datetime="[page_date_publish_iso]">', '</time></span>');
    
    foreach ($pages as $page) {
        // загружаем данные записи
        $p->load($page);
        
        // заголовок записи «info-top»
        $p->html('<header>');
            $p->line('[title]');
            $p->line('[date]');
        $p->html('</header>');
        
        // текст записи
        $p->content('', '');
    }
}

Метод format() служит для создания/изменения формата вывода. Он может иметь разные параметры, в зависимости от того, что именно нужно указать.

$p->format('title', '<h1>', '</h1>', true); // до, после, ссылка?
$p->format('date', 'Y-m-d H:i:s', '', ''); // формат даты, до, после
$p->format('cat', ', ', '', ''); // разделитель, до, после
$p->format('tag', ', ', '', ''); // разделитель, до, после
$p->format('feed', 'Подписаться', '', ''); // титул, до, после
$p->format('author', '', ''); // до, после
$p->format('edit', 'Редактировать', '', ''); // титул, до, после
$p->format('read', 'Читать дальше', '', ''); // титул, до, после

// без комментариев, есть, до, после
$p->format('comments', 'Обсудить', 'Посмотреть комментарии', '', ''); 

Класс Page_out достаточно мощный и содержит множество методов для разных задач. Пока мы рассматриваем только тот случай, когда нужно вывести произвольный заголовок записи.

Очевидно, что можно создать type_foreach-файлы для формирования формата вывода и другой файл для непосредственного вывода в теле цикла foreach.

Строго говоря, можно сделать это и в одном type_foreach-файле, который будет работать в цикле вывода.

На основе этого, в MaxSite CMS предлагается использовать шаблоны заголовков или info-top, которые можно выбирать в админ-панели. То есть можно предусмотреть разные варианты вывода заголовков записей. Скажем для одной записи выбрать полный формат: дата, рубрика, метки и т.п., а для другой только заголовок и дату. Вариантов может быть очень много.

Поскольку такие файлы базируются на type_foreach, то и размещаются они в каталоге шаблона type_foreach/info-top. Этот каталог имеет особое назначение — он отображается в админ-панели при редактировании записи или в настройках вывода шаблона.

Для удобства управления, info-top-файлы, которые предназначены только для одиночных записей (page), можно разместить в type_foreach/info-top/page. Это позволит не смешивать между собой файлы для full-страниц (главная, рубрики, метки и т.п.) от одиночных.

Info-top файл подключается как обычный type_foreach-файл, поэтому ему будет доступен объект $p. Например может быть такой вывод:

$p->format('edit', '<i class="i-edit" title="Edit page"></i>');
$p->format('title', '<h1 class="t-gray800 mar10-t t220">', '</h1>', false);
$p->format('cat', ' | ', '<div class="i-bookmark" title="' . tf('Рубрика записи') . '">', '</div>');

$p->html('<header class="mar20-b">');
    $p->line('[title][edit]');
    
    $p->div_start('t-gray600 t90');
        $p->line('[cat]');
    $p->div_end();
    
$p->html('</header>');

Таким образом с помощью type_foreach-файлов и Page_out можно вынести заголовок записи отдельно без необходимости править type-файл.

Поскольку Page_out мощный класс, то с его помощью можно организовывать и более сложные вещи, например вывод записей миниатюрами, отключать/заменять вывод контента и т.д. Кроме того, этот класс используется для формирования главной страницы в виде юнитов.