Дополнительные свойства для страниц


Типовая задача

Иногда требуется определить для страниц сайта дополнительные свойства. Например, мы хотим в каждой странице помимо основной контентной зоны показывать определенную картинку и текстовой блок, меняющиеся от страницы к странице.

Решение №1
Если количество изображений ограничено и жестко задано их число, то можно воспользоваться механизмом атрибутов и параметров XML тэга в файле menu.xml, используя при необходимости секцию для определения наборов значений.

Пример:
В файле menu.xml в секции <default> определяется заготовка для элемента node. Модифицируем её, добавив те свойства, которые нам нужны.

<node assign="" id="" title="Новый документ">
    ...
    <image-title editable="true" title="Графический заголовок" type="image-titles">
        o.gif
    </image-title>
</node>

В данном примере добавлено свойство image-title, признак editable="true" позволяет редактировать данное свойство редактору из админзоны, type определяет перечень допустимых значений для данного свойства. В этом примере значения будут браться из секции image-titles и по умолчанию при создании новой страницы будет подставляться значение "o.gif".

image-titles определяются в секции <declaration>:

<declaration>
    <image-titles>
        <item value="o.gif"/>
        <item value="head_download.gif"/>
        <item value="head_login.gif"/>
        ...
    </image-titles>
</declaration>

Решение №2 (реализовано с версии 4.22)
В файле Data/entities.xml определяется сущность со служебным идентификатором pageproperty, например:

<entity id="pageproperty" name="Свойства страницы">
    <field id="announce" type="string" sortas="literal" name="Анонс"/>
    <field id="picture" type="image" sortas="literal" name="Картинка"/>
</entity>

В тулбарах редакторов страниц автоматически появится кнопка, при нажатии на которую редактор получит возможность редактирования дополнительных свойств страницы.

Разработчик может использовать дополнительные свойства страниц стандартным образом через макроподстановку $NodeProperty[]$.

Сложная задача

Требуется для каждого шаблона страниц на сайте использовать различное количество полей в дополнительных свойствах страниц.

Решение (реализовано с версии 4.22)

Создаем несколько сущностей, по одной на каждый или на несколько шаблонов страниц, которые определены разработчиком в системе. В папке Data заводится справочник с предопределенным именем entityfortemplate. В нем необходимо создать записи, связывающие сущности для дополнительных свойств страниц и шаблоны. Поля данного справочника: id (содержит имя шаблона) и entity (содержит имя сущности). Если связующий справочник не планируется редактировать через админзону его можно создать в упрощенной форме, то есть только с двумя нужными нам полями:

id::internal1::entity::pageproperty1
id::internal2::entity::pageproperty2

В остальном решение полностью аналогично в реализации варианту с одной сущностью для описания дополнительных свойств на весь сайт.

Если система не найдет файла entityfortemplate или в нем не найдется шаблон, то будет использоваться имя сущности по умолчанию (pageproperty). Если такой сущности в entities.xml не будет найдено, система отключит возможность редактирования расширенных свойств в админзоне.

Стоит отметить, что все расширенные свойства для всех шаблонов (пусть даже и описываемые различными сущностями) будут по-прежнему храниться в файле pageproperties.dat.