Классы вершин
Классы вершин – невидимые объекты Смереки. Основное их назначение – служить интерфейсом к базе данных. Экземпляр класса вершины умеет прочитать свои атрибуты из базы данных и записать модифицировать атрибуты в БД. Итак, новые классы вершин создаются по мере того, как в информационной модели сайта появляются новые сущности с новыми наборами атрибутов.
Следует заметить, что в Смереке есть определенная терминологическая путаница между классами PHP и классами вершин. Классы PHP – это программные объекты, которые создаются в оперативной памяти сервера на основании информации из БД. Смерека имеет полиморфный конструктор классов PHP; какой именно класс будет создан – определяется атрибутом class вершины и соответствующим метакласом.
Для разных классов вершин можно создавать экземпляры одного класса PHP. Новый класс вершин нужно декларировать для того, чтобы создать новую сущность со своим уникальным набором атрибутов; Новый класс PHP нужно декларировать, когда новая сущность должна иметь какие-то новые, специфические методы работы с атрибутами. Если стандартных методов класса PHP Node достаточно, то создание нового класса PHP является лишним.
Итак, в документации слово «класс» чаще всего означает класс вершины, не класс PHP.
Класс не определяет внешнего вида веб-страниц. За это отвечают шаблоны страниц, использующих атрибуты экземпляров классов для компоновки HTML кода.
Метаобьекты
Смерека определяет свойства своих объектов через другие свои объекты (метаобъекты). Их свойства задаются непосредственно в программном коде Смереки, а все остальные декларации объектов (экземпляры метаобъектов) создаются и редактируются с помощью стандартного редактора вершин Смереки.
Чтобы попасть в редактор метаобъектов, нужно иметь права администратора, зайти на страницу «Настройки пользователя» и щелкнуть ссылку «Метаданные».
Смерека имеет четыре метаобъекта: метакласс, меташаблон, метаредактор и метаполе (метаатрибут).
Метакласс
Метакласс является специальным классом вершин, который описывает свойства других классов вершин. Он имеет следующие атрибуты:
Module – путь к модулю PHP, содержащий программный код класса; отсчитывается от корневого каталога Смереки. По умолчанию – node.php.
ClassName – имя класса PHP, который надо создать. По умолчанию – Node.
Hidden – выключатель, который надо установить, чтобы скрыть класс в списках выбора. Редактор вершин не сможет в процессе редактирования изменить класс вершины на этот скрытый класс. По умолчанию применяется для классов администрирования (группы, пользователи и т.д.).
Fields – список атрибутов класса, разделенный запятыми. Например, для класса Node этот список выглядит так: symbname, class, Template, accesslevel, link, Hidden, HideChildren, Smerecasheable, Indexable. Он содержит не все атрибуты класса, а только те, для которых шаблон редактора должно создать элементы управления. Имена полей должны соответствовать именам вершин класса Метаатрибут. Если перед именем поля поставить символ «-» (минус), это поле будет исключено из шаблона редактора.
link – в контексте метакласса используется для задания суперкласса. Если эта ссылка задана, данный Метакласс становится подклассом Метакласса-ссылки и наследует все его поля. Шаблон редактора выставляет в начале страницы собственные атрибуты, введенные в метаклассе, а затем группирует поля, унаследованные от суперкласса. Если в подклассе какой-то из атрибутов суперкласса является лишним, его имя следует «отнять» в поле Fields.
ClassTpl – шаблон класса, указатель на меташаблон, который должен использоваться с метакласом. Смерека использует мягкий и жесткий контексты шаблона класса. В мягком контексте (по умолчанию) шаблон класса будет применен только в случае, когда вершина (экземпляр данного класса) не содержит атрибута «Шаблон». В жестком контексте атрибут вершины «Шаблон» (даже если он задан) игнорируется и всегда применяется шаблон класса. Примером применения жесткого контекста является класс RSSChannel, который всегда используется в связке с шаблоном RSSMaker – использование его с другим шаблоном наверное нецелесообразно.
Description – текстовое описание класса. Чтение этих описаний – лучший способ понять назначения класса.
Меташаблон и метаредактор
Эти метаобьекты определяют внешний вид веб-страниц, генерируемых Смерекой. Меташаблон определяет вид страницы для читателя; метаредактор определяет вид страницы для редактирования соответствующей вершины; остальные свойства совпадают:
Description – текстовое описание шаблона. Чтение этих описаний – лучший способ понять назначение шаблона.
TemplateText – текст HTML кода шаблона. Этот код может содержать смеретеги (поля подстановки) и секции. Он сохраняется непосредственно в базе данных. Этот способ хранения является рекомендованным, но Смерека может использовать также шаблоны из отдельных файлов.
link – В контексте меташаблона используется для задания шаблона-предка. Если эта ссылка задана, данный шаблон должен содержать не полный код, а лишь секцию, которую надо заменить в шаблоне-предке.
Module – путь к модулю PHP, содержащий программный код класса PHP для шаблона; отсчитывается от корневого каталога Смереки. По умолчанию – page.php.
ClassName – имя класса PHP, который надо создать. По умолчанию – Page.
Hidden – выключатель, который надо установить, чтобы скрыть шаблон в списках выбора. Редактор вершин не сможет в процессе редактирования изменить шаблон вершины на этот скрытый шаблон. По умолчанию применяется для шаблонов классов.
Path – если TemplateText является пустым, Смерека будет искать шаблон на этом относительном пути, который отсчитывается от корневого каталога Смереки. Например: ../example/templates
FileName – имя файла шаблона. Например: newtpl.html. Следует учитывать, что при таком способе сохранения шаблонов Смерека будет искать его по полному пути ../example/templates/uk/newtpl.html, где uk – имя текущего языка. Следовательно, даже если сайт содержит только одну языковую версию, все равно надо создавать промежуточный каталог с именем этого языка.
Метаатрибут
Метаатрибут задает определение атрибута. Следует знать, что один атрибут может использоваться с различными классами и даже нести разное смысловую нагрузку в контексте разных классов. Он имеет следующие атрибуты:
DataType – тип данных атрибута.
ControlType – Тип элемента управления для атрибута. На основании этого атрибута шаблон редактора создает соответствующий элемент. Часто тип элемента управления однозначно диктуется типом данных, но для атрибута типа «Целое число», например, можно вместо строкового поля создать список выбора или выключатель.
Properties – текстовое поле с перечнем свойств в стиле name="value", разделенных пробелами. Для фиксированных списков выбора (ControlType=select) здесь можно записать список элементов списка.
Если метаатрибут описывает указатель (то есть его тип данных – ид вершины), в это поле можно дополнительно задать класс вершины, на которую может указывать это поле.
Например, для метаатрибута Template задано свойство Class="33". Значением этого атрибута может быть только меташаблон. Смерека не даст изменить это поле на объект иного класса (в том числе и на пустое значение).
По умолчанию это свойство не задано, что позволяет полю указывать на вершину любого класса (в том числе иметь пустое значение).
LangAware – выключатель, который определяет, является ли данный атрибут языково-зависимым.
Label – подпись поля в редакторе.
Description – текстовое описание атрибута. Чтение этих описаний – лучший способ понять назначение атрибутов.
Изменение класса вершины
Когда при редактировании БД для уже существующей вершины задается новый класс, Смерека действует по консервативному алгоритму: все атрибуты старого класса остаются присоединенными к вершине, даже если определение нового класса не предполагает их наличия. Принципиально каждая вершина может иметь любые атрибуты (другое дело, будут ли все они где-то использоваться).
Смерека не умеет определять, используется где некий атрибут конкретной вершины, или нет. Поэтому многократная смена класса вершины может привести к образованию целого «хвоста» неактуальных атрибутов. Желательно этого избегать.
Следует знать, что редактор вершин Смереки показывает не все атрибуты, которые хранятся в БД, а только те, которые предусмотрены текущим классом вершины и соответствующим шаблоном редактора (шаблон может скрывать некоторые из атрибутов для упрощения вида редактора).