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