In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Работа классом MInputHelper

From In-Portal Developers Guide

Jump to: navigation, search
Работа с формами Работа с формами
Статьи в этой категории
Визуальный пример вывода блока "inp_edit_minput"
Визуальный пример вывода блока "inp_edit_minput"

Данный класс предназначен для ввода списка дополнительных данных в схожем формате, характеризующих основной предмет. Например, человек (people) - это пример основной сущности, а список его детей (children) - это пример дополнительной сущности. Т.е. ребенок (children) это подчинённый префикс для главного префикса people. Процесс ввода данных происходит по средствам использования блока "inp_edit_minput", который показан на изображении слева. Блок "inp_edit_minput" является стандартным начиная с Core v 4.2.2.

Contents

Базовая настройка

Редактирование файла people_config.php

Определить поле Children, используемое для хранения данных в XML формате. Поле в базе данных нужно сделать с типом TEXT.

'Fields' => Array (
	'Children' => Array ('type' => 'string', 'default' => NULL),
)

XML документ находящийся в данном поле будет выглядеть следующим образом:

<records>
	<record>
		<field name="ChildFullName">name1</field>
		<field name="ChildBirthDate_date">15/12/2008</field>
	</record>
	<record>
		<field name="ChildFullName">name2</field>
		<field name="ChildBirthDate_date">19/04/2005</field>
	</record>
</records>

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

Определить виртуальные поля ChildFullName и ChildBirthDate, которые нужны только для редактирования элементов, показываемых в списке из блока "inp_edit_minput".

'VirtualFields' => Array (
	'ChildFullName' => Array ('type' => 'string', 'max_len' => 255, 'default' => ''),
	'ChildBirthDate' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => ''),
)

Редактирование файла people_edit.tpl

В данном файле нужно добавить блоки, которые будут использоваться для ввода данных в блок "inp_edit_minput":

<inp2:m_RenderElement name="inp_edit_box" prefix="people" field="ChildFullName" title="la_fld_ChildFullName" style="width: 200px;" />
<inp2:m_RenderElement name="inp_edit_date" prefix="people" field="ChildBirthDate" title="la_fld_ChildBirthDate" style="width: 100px"/>
<inp2:m_RenderElement name="inp_edit_minput" prefix="people" field="Children" title="la_fld_Children" format="#ChildFullName# #ChildBirthDate_date#" />

Блок "inp_edit_minput" нужен для того, чтобы в поле Children (у главного префикса) формировался XML, который в последствии может быть обработан (через hook) и записан в подчинённую таблицу.

После определения всех блоков формы, нужно поместить следующий JavaScript код, использующийся для связи остальных элементов формы (в данном случае это элементы полей ChildFullName и ChildBirthDate) с полем Children главного префикса:

<script type="text/javascript">
	Children.registerControl('ChildFullName', 'textbox', true);
	Children.registerControl('ChildBirthDate_date', 'textbox', true);
	Children.LoadValues();
</script>

Метод registerControl используется для связи одного поля с блоком "inp_edit_minput". Если нужно связать сразу несколько полей, то нужно вызвать данный метод несколько раз с разными параметрами. В метод registerControl передаются следующие далее параметры.

название описание
$field_name (string) Название поля. Для поля, содержащего дату нужно к нему ещё приписать "_date".
$type (string) Тип HTML-элемента, используемого для ввода значений в поле:
  • select - элемент ограниченного выбора (dropdown);
  • textbox - текстовое поле (text, texarea);
  • checkbox.

Значение "checkbox" будет доступно начиная с Core v 5.0.0.

$required (bool) Пометка об обязательности ввода значения в поле перед добавлением записи или при её редактировании.
$options (array) Массив опций поля. Для элемента типа checkbox это массив опций форматера. Для текстовых полей там можно указать "{first_chars: 100}" и тогда показываемое значение из данного поля будет визуально ограничено 100 символами. Данный параметр является необязательным. Данный параметр будет доступен начиная с Core v 5.0.0.

После всех выше описанных операций нужно вызвать метод LoadValues, используемый для преобразования XML данных, находящихся в поле и показывания их в блоке "inp_edit_minput".

Параметры блока "inp_edit_minput"

Ниже приведено описание параметров блока "inp_edit_minput". Параметры "name", "prefix", "field", "title" и "style" являются стандартными для всех блоков, используемых на формах редактирования, поэтому в данной статье они описаны не будут.

параметр описание
format (string) *

Значением данного параметра является строка, которая может состоять из названий полей (зарегистрированных в шаблоне при помощи метода registerControl) и любого текста. Название каждого поля должно быть заключено в символы "#". Например "#ChildFullName# #ChildBirthDate_date#". Фразы использовать нельзя, т.к. они не обрабатываются.

style (string) Можно указать стиль для блока, обычно в данном случае ставиться стиль размера блока, например style="width: 400px; height: 100px;".
allow_add (int) Можно разрешить/запретить добавление элементов списка, по умолчанию разрешено.
allow_edit (int) Можно разрешить/запретить редактирование элементов списка, по умолчанию разрешено.
allow_delete (int) Можно разрешить/запретить удаление элементов списка, по умолчанию разрешено.
allow_move (int) Можно разрешить/запретить перемещение элементов вверх и вниз в списке, по умолчанию разрешено. Добавлен начиная с Core v 4.3.1.
Image:Tipbox Icon.gif В зависимости от того, как будет обрабатываться полученный XML может получиться, что в базе данных ничего перемещаться не будет.

* Параметр обязателен

Хранение данных в связанной таблице

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

Редактирование конфигурационных файлов

Нужно отредактировать конфигурационные файлы для главного префикса people и подчинённого префикса children.

a) файл "people_config.php":

'IDField' => 'PeopleId',
'SubItems' => Array ('children'),
 
'VirtualFields' => Array (
	'PeopleId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
	'ChildFullName' => Array ('type' => 'string', 'max_len' => 255, 'default' => NULL),
	'ChildBirthDate' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL),
	'Children' => Array ('type' => 'string', 'default' => NULL),
),

В выше приведённом примере устанавливается значение IDField, подчиненный префикс children, а также описываются виртуальные поля ChildFullName и ChildBirthDate для главного префикса people. Эти поля аналогичны полям из префикса children, только в данном случае они виртуальные. Поле Children нужно для загрузки XML структуры списка детей.

б) файл "children_config.php":

Нужно установить связь с главным префиксом people, в параметре Fields описать поля для подчинённого префикса children. И установить hook, который нужен для сохранения данных в подчинённую таблицу при сохранении главной записи.

'Hooks' => Array (
	Array (
		'Mode' => hAFTER,
		'Conditional' => false,
		'HookToPrefix' => '#PARENT#',
		'HookToSpecial' => '*',
		'HookToEvent' => Array ('OnAfterItemCreate', 'OnAfterItemUpdate'),
		'DoPrefix' => '',
		'DoSpecial' => '*',
		'DoEvent' => 'OnSaveChildren',
	),
),
 
'ForeignKey' => 'PeopleId',
'ParentTableKey' => 'PeopleId',
'ParentPrefix' => 'people',
'AutoDelete' => true,
'AutoClone' => true,
 
'Fields' => Array(
	'ChildId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
	'PeopleId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
	'ChildFullName' => Array ('type' => 'string', 'max_len' => 255, 'default' => ''),
	'ChildBirthDate' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => NULL)
),

Редактирование обработчиков событий

а) Добавить метод OnAfterItemLoad в файле people_eh.php.

function OnAfterItemLoad(&$event)
{
	parent::OnAfterItemLoad($event);
 
	$minput_helper =& $this->Application->recallObject('MInputHelper');
	/* @var $minput_helper MInputHelper */
 
	$use_fields = Array ('ChildFullName', 'ChildBirthDate_date');
	$minput_helper->LoadValues($event, 'Children', 'children', $use_fields);
}

Используемый метод "LoadValues" класса MInputHelper нужен для формирования XML строки из подчинённой таблицы и помещения его в поле Children главного префикса.

б) Добавить метод OnSaveChildren в файле "children_eh.php".

function OnSaveChildren(&$event)
{
	if ($event->MasterEvent->status != erSUCCESS) {
		return ;
	}
 
	$minput_helper =& $this->Application->recallObject('MInputHelper');
	/* @var $minput_helper MInputHelper */
 
	$minput_helper->SaveValues($event, 'Children');
}

Данный hook к главному префиксу (см. выше) нужен для сохранения в базу данных сведений о детях. Для этих целей используется метод SaveValues класса MInputHelper.

См. также