Table of Contents | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Что такое компоненты
Компоненты - это основная единица хранения информации в K4
. Компонент представляет собой набор полей для хранения информации и правил их обработки, набор тэгов специально предназначенных именно для этого компонента, и так же специального набора событий. Каждый компонент может содержать теоретически неограниченное кол-во полей. Поля - это своего рода ячейки, в которых хранится информация об отдельных свойствах компонента. Например, если бы задачей была реализация функциональности гостевой книги, это могло выглядеть так:
компонент "сообщение" с полями "автор", "дата размещения комментария", "сообщение".
Что можно делать с компонентами
Компоненты могут быть использованы для хранения, обработки и отображения информации.
Класс, содержащий специализированные тэги компонента, является наследником базового класса kDBTagProcessor
, который уже содержит большинство необходимых тэгов для работы с компонентами. Однако, иногда может понадобиться добавить новый или изменить поведение какого-либо тэга для отдельного компонента - тогда изменения производятся в классе тэгов этого компонента. Таким образом, изменения не затронут основной класс и не повлияют на работу остальных существующих компонентов.
Описание работы с одним компонентом
Вывод данных компонента на шаблоне:
Code Block | ||
---|---|---|
| ||
<inp2:sample_Field name="Title" /> |
В этом примере выводится содержимое поля "Title
". Следует отметить, что данный код выполнится успешно только в том случае, если на странице загружен объект компонента "sample
" или передан идентификатор, для его автоматической загрузки. Автозагрузка - это автоматическая загрузка компонента по переданному идентификатору. Например, если на страницу методом POST
или GET
была передана переменная "sample_id
", то предыдущий пример выполнится успешно. Префикс "Авто" обозначает именно то, что объектом можно пользоваться без каких-либо подготовительных действий.
Создание экземпляра компонента путём вызова события "OnCreate
". Необходимо учесть, что создание компонента по-умолчанию запрещено для всех пользователей фронт-части. Чтобы пользователь не получал ошибку при попытке создать какой-нибудь компонент, в обработчике событий данного компонента необходимо произвести следующие манипуляции:
Code Block | ||
---|---|---|
| ||
function mapPermissions()
{
parent::mapPermissions();
$permissions = Array(
'OnCreate' => Array('self' => true),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
} |
Т.е. добавить событие "OnCreate
" этого компонента в список публично доступных. При отображении полей компонента на фронт-части, в список публично доступных так же необходимо добавить событие "OnItemBuild
".
Описание работы со списком
Для отображения списка компонентов применяется тэг PrintList2
. Пример:
Code Block | ||
---|---|---|
| ||
<inp2:sample_PrintList per_page="-1" render_as="block_name" columns="3" /> |
Приведённый выше код распечатает все компоненты "sample
" внутри таблицы с тремя колонками. Каждая новая строка будет представлена результатом обработки блока "block_name
".
Опция конфига ListSortings
позволяет управлять последовательностью, в которой будут выводиться списки. Необходимо указать Special
, поля и правила сортировки. Пример:
Code Block | ||
---|---|---|
| ||
'ListSortings' => Array(
'' => Array(
'ForcedSorting' => Array('Priority' => 'desc'),
'Sorting' => Array('OrderDate' => 'desc'),
)
), |
Параметр ForcedSorting
устанавливает принудительную сортировку.
Параметр конфига TitlePresets
управляет различными заголовками в административной части сайта:
Code Block | ||
---|---|---|
| ||
'TitlePresets' => Array(
'default' => Array(
'new_status_labels' => Array( 'order' => '!la_title_AddingOrder!' ),
'edit_status_labels' => Array( 'order' => '!la_title_DetailsOfOrder!' ),
'new_titlefield' => Array( 'order' => '!la_title_NewOrder!' ),
),
'order_list'=>Array(
'prefixes' => Array('order_List'),
'format' => "!la_title_purchases! (#order_recordcount#)",
),
'order_edit'=>Array(
'prefixes' => Array('order'),
'format' => "#order_status# #order_titlefield# - !la_title_General!",
),
), |
#order_recordcount#
- такая строка автоматически заменится на количество компонентов order
(общее или количество отфильтрованных, если на гриде применены фильтры).
Гриды
Грид - это список компонентов, выводящийся в административной части сайта. Грид предоставляет полную свободу действий над компонентами: просмотр как деталей отдельного компонента, так и сортированного списка всех компонентов, а так же поиска по любому полю.
Редактирование
Редактирование компонента может осуществляться как с пользовательской части сайта, так и из административной. Разница лишь в том, что административная часть уже содержит все необходимые формы и требует только заполнения конфиг файла для компонента.
Чтобы редактировать компонент с пользовательской части сайта, нужно составить форму с полями, которые необходимо редактировать, а так же передать в скрытом поле название события, которое обработает изменения. Пример:
Code Block | ||
---|---|---|
| ||
<form id="join_form" method="post" action="<inp2:m_FormAction m_cat_id="0" />" enctype="multipart/form-data">
</form> |
Если форма содержит поля для загрузки файлов - обязательно нужно указать параметр enctype="multipart/form-data"
.
Основные типы полей
В полях компонентов можно хранить информацию самых различных типов. От строковых данных до изображений (фактически, всё же, изображения хранятся в специально отведённом месте, а в поле компонента записана только ссылка на файл изображения). Поля в конфигурации определяются следующим образом:
Code Block | ||
---|---|---|
| ||
$config = Array(
'Fields' => Array(
'Title' => Array('type' => 'string', 'not_null' => 1, 'default' => '', 'max_len' => 255)
)
) |
В примере выше показана общая схема составления конфигурации полей. Ключ конфигурационного массива Fields
указывает на то, что начинается декларация полей компонента. Сам массив Fields
является ассоциативным и каждый ключ в нём является названием описываемого поля в базе данных (имена полей регистрозависимы и должны совпадать в шаблонах и в конфигурационном файле!). Массив 3-его уровня является описанием поля и перечисляет все его свойства и особенности. Далее в примерах будет приводиться только этот массив.
Текст
Пример определения текстового поля в конфигурационном файле компонента:
Code Block | ||
---|---|---|
| ||
Array('type' => 'string', 'not_null' => 1, 'default' => '', 'max_len' => 255) |
Таким массивом описывается простое текстовое поле. Обратите внимание на значение max_len
, если этот параметр не указан - то в поле можно потенциально записать строку неограниченной длинны (т.е. потенциально она может не поместиться в отведённое для неё место в базе данных).
Дата
Пример определения поля с датой в конфигурационном файле компонента:
Code Block | ||
---|---|---|
| ||
Array('type' => 'int', 'formatter' => 'kDateFormatter', 'not_null' => 1, 'default' => '#NOW#') |
Дата хранится в виде timestamp
, поэтому в базе необходимо поле для хранения целых чисел (длиной 11 символов). Обязательный в этом случае параметр formatter
, указывающий каким форматтером будет обрабатываться поле (для даты - kDateFormatter
). И ключевое слово #NOW# в качестве значения по-умолчанию, которое будет автоматически заменено на текущую дату при создании компонента.