Современная, быстрая и удобная система управления сайтом

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

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

<?php

...
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-файлах.

<?php

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() служит для создания/изменения формата вывода. Он может иметь разные параметры, в зависимости от того, что именно нужно указать.

<?php

$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. Например может быть такой вывод:

<?php

$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 мощный класс, то с его помощью можно организовывать и более сложные вещи, например вывод записей миниатюрами, отключать/заменять вывод контента и т.д. Кроме того, этот класс используется для формирования главной страницы в виде юнитов.