Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
minLevel1
maxLevel6
outlinetrue
stylenone
typelist
printabletrue

Что такое компоненты

Компоненты - это основная единица хранения информации в K4. Компонент представляет собой набор полей для хранения информации и правил их обработки, набор тэгов специально предназначенных именно для этого компонента, и так же специального набора событий. Каждый компонент может содержать теоретически неограниченное кол-во полей. Поля - это своего рода ячейки, в которых хранится информация об отдельных свойствах компонента. Например, если бы задачей была реализация функциональности гостевой книги, это могло выглядеть так:

компонент "сообщение" с полями "автор", "дата размещения комментария", "сообщение".

Что можно делать с компонентами

Компоненты могут быть использованы для хранения, обработки и отображения информации.

Класс, содержащий специализированные тэги компонента, является наследником базового класса kDBTagProcessor, который уже содержит большинство необходимых тэгов для работы с компонентами. Однако, иногда может понадобиться добавить новый или изменить поведение какого-либо тэга для отдельного компонента - тогда изменения производятся в классе тэгов этого компонента. Таким образом, изменения не затронут основной класс и не повлияют на работу остальных существующих компонентов.

Описание работы с одним компонентом

Вывод данных компонента на шаблоне:

Code Block
languagehtml
<inp2:sample_Field name="Title" />

В этом примере выводится содержимое поля "Title". Следует отметить, что данный код выполнится успешно только в том случае, если на странице загружен объект компонента "sample" или передан идентификатор, для его автоматической загрузки. Автозагрузка - это автоматическая загрузка компонента по переданному идентификатору. Например, если на страницу методом POST или GET была передана переменная "sample_id", то предыдущий пример выполнится успешно. Префикс "Авто" обозначает именно то, что объектом можно пользоваться без каких-либо подготовительных действий.

Создание экземпляра компонента путём вызова события "OnCreate". Необходимо учесть, что создание компонента по-умолчанию запрещено для всех пользователей фронт-части. Чтобы пользователь не получал ошибку при попытке создать какой-нибудь компонент, в обработчике событий данного компонента необходимо произвести следующие манипуляции:

Code Block
languagephp
function mapPermissions()
{
	parent::mapPermissions();
	$permissions = Array(
		'OnCreate'	=>	Array('self' => true),
	);
	$this->permMapping = array_merge($this->permMapping, $permissions);
}

Т.е. добавить событие "OnCreate" этого компонента в список публично доступных. При отображении полей компонента на фронт-части, в список публично доступных так же необходимо добавить событие "OnItemBuild".

Описание работы со списком

Для отображения списка компонентов применяется тэг PrintList2. Пример:

Code Block
languagehtml
<inp2:sample_PrintList per_page="-1" render_as="block_name" columns="3" />

Приведённый выше код распечатает все компоненты "sample" внутри таблицы с тремя колонками. Каждая новая строка будет представлена результатом обработки блока "block_name".

Опция конфига ListSortings позволяет управлять последовательностью, в которой будут выводиться списки. Необходимо указать Special, поля и правила сортировки. Пример:

Code Block
languagephp
'ListSortings'	=> Array(
		'' => Array(
			'ForcedSorting' => Array('Priority' => 'desc'),
			'Sorting' => Array('OrderDate' => 'desc'),
		)
	),

Параметр ForcedSorting устанавливает принудительную сортировку.

Параметр конфига TitlePresets управляет различными заголовками в административной части сайта:

Code Block
languagephp
'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
languagehtml
<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
languagephp
$config = Array(
	'Fields' => Array(
		'Title' => Array('type' => 'string', 'not_null' => 1, 'default' => '', 'max_len' => 255)
	)
)

В примере выше показана общая схема составления конфигурации полей. Ключ конфигурационного массива Fields указывает на то, что начинается декларация полей компонента. Сам массив Fields является ассоциативным и каждый ключ в нём является названием описываемого поля в базе данных (имена полей регистрозависимы и должны совпадать в шаблонах и в конфигурационном файле!). Массив 3-его уровня является описанием поля и перечисляет все его свойства и особенности. Далее в примерах будет приводиться только этот массив.

Текст

Пример определения текстового поля в конфигурационном файле компонента:

Code Block
languagephp
Array('type' => 'string', 'not_null' => 1, 'default' => '', 'max_len' => 255)

Таким массивом описывается простое текстовое поле. Обратите внимание на значение max_len, если этот параметр не указан - то в поле можно потенциально записать строку неограниченной длинны (т.е. потенциально она может не поместиться в отведённое для неё место в базе данных).

Дата

Пример определения поля с датой в конфигурационном файле компонента:

Code Block
languagephp
Array('type' => 'int', 'formatter' => 'kDateFormatter', 'not_null' => 1, 'default' => '#NOW#')

Дата хранится в виде timestamp, поэтому в базе необходимо поле для хранения целых чисел (длиной 11 символов). Обязательный в этом случае параметр formatter, указывающий каким форматтером будет обрабатываться поле (для даты - kDateFormatter). И ключевое слово #NOW# в качестве значения по-умолчанию, которое будет автоматически заменено на текущую дату при создании компонента.