Вернёмся к основной линии...
Отображение объектов
После успешной загрузки объекта и проведения ряда опциональных вспомогательных действий (об этом позже. Например, проверки валидности данных, обработка GET/POST-запросов, в т.ч. аплоады файлов и т.п. - до отображения дело может и не дойти) система пытается отобразить его, вызвав метод
content() (соответственно, можно при крайней необходимости его переопределить) и, в случае удачи, выводя результат в браузер. Также, полученный результат может автоматически сохраниться на диске для статического кеширования. Об этом подробно тоже позднее.
Метод content() работает, если не вдаваться в детали кеширования, защиты от параллельных запросов и т.п. просто. Он загружает механизм отображения,
render_engine класса и вызывает метод render() этого механизма, передав в качестве параметра отображаемый объект. Метод же возвращает готовый результат.
Сейчас совсем немного таких механизмов:
- render_page (по умолчанию) - Отображает обычную страницу сайта, используя шаблонные механизмы и т.п.
- render_fullpage - аналогично render_page, но шаблон тела сообщения является готовым результатом, а не вставкой в общий шаблон, как в случае render_page (подробнее разница будет рассмотрена позже)
- render_php - рендеринг шаблона средствами самого PHP.
- render_self - когда метод render() определён в самом рисуемом классе. Собственно, из-за наличия этого механизма список готовых рендереров так невелик. Вся экзотика (включая картинки) рисуется обычно через render_self.
Рассмотрим подробнее основной механизм,
render_page.
Рядом с каждым .php-файлом класса может лежать одноимённый *.html-файл. Это Smarty-шаблон собственного контента объекта. В простейшем случае может быть вообще статический HTML-код. render_engine насыщает нужными данными Smarty-объект, парсит этот шаблон, и результат подставляет в переменную $body глобального шаблона страницы.
Пример
Выведем на отдельной странице имя того самого пользователя с самой высокой репутацией, которого упоминали выше.
Привязка ссылки (в виде регекспа) к отображающему эту ссылку объекту осуществляется в каталогах handlers/bors_map.php, локальных, системных или глобальных. Формат очень простой, файл должен вернуть переменную $map, содержащую простой массив строк.
Каждая строка - запись вида
регексп_ссылки => объект
Предположим, что мы хотим видеть нашего пользователя на странице
/bors/examples/top-reputation/
А класс, который будет заниматься отображением пользователя, будет иметь имя examples_topReputation (тут некрасивое смешение стилей, так как для примеров не хочется усложнять структуру

)
Так и запишем:
<?php
$map = array(
// ...
"(/bors/examples/)top\-reputaton/ => examples_topReputation",
// ...
);
Никаких параметров в нашем случае объекту передавать не надо.
Необязательное выделение первой регексповой группой (скобки) - это автоматическое указание на родительский объект в навигационной иерархии. Вполне можно допустить, что родитель страницы /bors/examples/top-reputaton/ - это /bors/examples/

При необходимости каждый класс может и явно указывать на своих родителей.
Перейдём к классу объекта:
<?php
class examples_topReputation extends base_page
{
function title() { return ec("Наш лучший пользователь"); }
function local_template_data_set()
{
return array(
'user' => objects_first('forum_user', array('order' => '-reputation')),
);
}
}
Всё. Разберём этот класс.
extends base_page - класс является наследником базового класса страницы. Характерная особенность - необязательность загрузки данных. Ибо, вот, в нашем случае мы ничего не грузим со стороны, только вычисляем.
метод
title() возвращает заголовок страницы. (Функция ec() -
encode перекодирует строку из UTF-8, в которой по умолчанию пишется вся система в текущую локаль сайта.)
метод
local_template_data_set() возвращает хэш-массив данных, которыми насыщается шаблон. В нашем случае мы в шаблоне сможем использовать переменную $user.
Файл находится по пути classes/bors/examples/topReputation.php в одном из возможных каталогов - локальном, системном или ядра фреймворка.
Перейдём к шаблону. Всё, что сейчас сделаем для простоты, изобразим имя пользователя и уровень его репутации.
Сам шаблон будет находится по пути classes/bors/examples/topReputation.html
<p>Пользователь: {$user->title()}</p>
<p>Репутация: {$user->reputation()}</p>
Всё.
Данная страница уже может отображаться. Смотрите результат по адресу:
http://balancer.ru/bors/examples/top-reputation/.
Естественно, что шаблон там используется от сайта по умолчанию. Мы задали только контент страницы.
Ловите файлы, закоммиченные в ядро:
404 Not Found