$connection
$connection
Соединение с БД
Родительский класс для классов конфигурации
__construct(\Loader$Loader, string[]$files) : \Config
Конструктор
| \Loader | $Loader | Deprecated |
| string[] | $files | Список используемых файлов. Путь указывается относительно корня системы. |
class s_Task extends Config
{
// Переопределение контруктора в дочернем классе
public function __construct()
{
// Подключаем дополнительные файлы
parent::__construct(array(
'config/common/Lib/lib.php',
'config/common/Lib/access.php',
));
}
// ...
}
prepareDetail(mixed[]$params) : mixed[]|null
Вызов обработчика изменения родительского поля карточки при создании записи из вкладки
При вызове карточки из вкладки автоматически заполняется ссылка на поле-родитель. Например, при добавлении дела из карточки контакта, автоматически заполняется поле "Контакт". В стандартной конфигурации есть обработчик, который при изменении поля "Контакт" в карточке дела автоматически заполняет поле "Компания" значением из контакта. Метод prepareDetail() предназначен для вызова таких обработчиков. Этот метод имеет смысл вызывать только для карточек раздела, которые могут создаваться из вкладок.
| mixed[] | $params | Параметры из onPrepare() |
Список полей для заполнения по умолчанию, которые вернул стандартный обработчик. Поля в принятом формате.
// Для карточки дела, config/sections/Task/s_task.php
public function onPrepare($params)
{
if ($params['mode'] != 'insert') {
$cnt = $this->nextTasksCount($params['rec_id']);
$this->addParameter($result, 'HaveNextTask', $cnt);
return $result;
}
$result = $this->prepareDetail($params);
// ...
return $result;
}
getActualValue(mixed[]$old_data, mixed[]$new_data, string|string[]$field_name) : mixed|mixed[]|null
Получить актуальное значение из двух списков полей (поля должны быть в принятном формате).
Предпочтение отдается $new_data. Если в $new_data нет искомого поля, то поиск поля выполняется в $old_data. Регистр в разваниях полей не учитывается.
| mixed[] | $old_data | Старые данные в принятом формате |
| mixed[] | $new_data | Новые данные в принятом формате |
| string|string[] | $field_name | Название поля или массив названий |
Если $field_name - строка, то значение поля. Если $field_name - массив, то будет возвращен массив значений полей. Если поле не найдено, то будет возвращен null.
public function onAfterPost($table, $id, $old_data, $new_data) {
$parent_id = $this->getActualValue($old_data, $new_data,
strtolower($this->_parent) . 'id');
// ...
}
public function onBeforePostPrice($parameters) {
list ($count, $price, $discount) =
$this->getActualValue($parameters['old_data'],
$parameters['new_data'],
array('count', 'price', 'discount'));
// ...
}
mergeFields(mixed[]$fields1, mixed[]$fields2, bool$priority2) : void
Объединяет набор полей в принятом формате
По умолчанию $fields2 имеет приоритет. Результат помещается в первый аргумент. Регистр в разваниях полей не учитывается.
| mixed[] | $fields1 | Первый набор полей (передается по ссылке). |
| mixed[] | $fields2 | Второй набор полей |
| bool | $priority2 | Является ли значения $field2 приоритетными. По умолчанию true. Если false, то в случае, если поле с одинаковым называнием встречается в обоих наборах, будет отдан преоритет первому набору. |
removeField(mixed[]$fields, string|string[]$field_name) : bool
Удалить поле/поля из набора полей
Регистр в разваниях полей не учитывается. Результат будет помещен в первый аргумент, который должен быть передан по ссылке.
| mixed[] | $fields | Набор полей |
| string|string[] | $field_name | Название поля, которое требуется удалить из списка. Или массив с названиями полей. |
Если удаление было выполнено, то true. Если удаления не произошло (поле не найдено), то false.
public function onBeforePost(&$parameters) {
$this->removeField($parameters['new_data'], 'CreateID');
return $parameters['new_data'];
}
formatField(string$name, mixed$value, string$caption) : mixed[]
Сформировать поле в формате набора полей
| string | $name | Код поля (название поля в БД) |
| mixed | $value | Значение поля |
| string | $caption | Необязательный параметр. Отображаемое значение поля. Имеет смысл для полей-справочников, у которых значением является GUID, а отображаться должно строковое значение из связанного справочника. По умолчанию null. |
Поле в формате набора полей
// Ответственный
$User = IrisUser::getInstance();
$this->mergeFields($result, $this->formatField('OwnerID',
$User->property('id'), $User->property('name')));
fieldValue(mixed[]$fields, mixed$field_name) : mixed|mixed[]|null
Получить значения конкретного поля из набора полей
| mixed[] | $fields | Набор полей |
| mixed | $field_name | Код поля (название поля в БД) или массив с кодами полей |
Если $field_name - строка, то будет возвращено значение поля. Если $field_name - массив строк, то будет возвращен массив со значениями полей. Если поле не найдено, то null.
$number_old = $this->fieldValue($old_data, 'number');
$number_new = $this->getActualValue($old_data, $new_data, 'number');
insertRecord(mixed[]$fields, string$table_name) : bool
Вставка записи в БД
| mixed[] | $fields | Набор полей для вставки в таблицу |
| string | $table_name | Необязательный параметр. Название таблицы, в которую надо вставить запись. Желательно с {}. Если название таблицы не указано, то будет использовано свойство Config::$_table_name. |
true в случае успеха и false в случае неудачи
if ($this->insertRecord($fields)) { ... }
// ...
$this->mergeFields($fields, $this->formatField('OwnerID',
$User->property('id'), $User->property('name')));
if ($this->insertRecord($fields, '{Task}')) { ... }
getValuesFromTables(mixed[]$fields, mixed[]$params) : true
Получить несколько значений из разных таблиц (одним запросом к БД)
Этот метод целесообразно использовать, например, для подготовки значений по умолчанию при создании новой карточки раздела. Если требуется заполнить несколько полей-справочников, то это можно сделать, выполнив всего один запрос к БД. Данный метод формирует запрос, объединяя подзапросы для каждого значения с помощью union.
| mixed[] | $fields | Исходный набор полей |
| mixed[] | $params | Массив с описанием, какие значения из каких таблиц надо получить. Названия таблиц необходимо указывать с {} |
в случае успеха. Иначе false. null, если $params пуст.
// Значения справочников
$this->getValuesFromTables($result, array(
'{TaskState}' => 'Plan',
'{TaskImportance}' => 'Normal',
'{TaskType}' => 'Execute',
));
$this->getValuesFromTables($result, array(
'{TaskState}' => 'Plan',
));
$this->getValuesFromTables($result, array(
'{TaskImportance}' => 'Normal',
));
$this->getValuesFromTables($result, array(
'{TaskType}' => 'Execute',
));
addParameter(mixed[]$result, string$param_name, mixed$param_value) : null
Добавить параметр к набору полей
Используется в обработчиках onPrepare(). Установленный параметр будет доступен в картчоке на кдиенте. Значение параметра будет записано в первый аргумент.
| mixed[] | $result | Массив с набором полей (и параметров) |
| string | $param_name | Название параметра |
| mixed | $param_value | Значение параметра |
public function onPrepare($params)
{
if ($params['mode'] != 'insert') {
$cnt = $this->nextTasksCount($params['rec_id']);
$this->addParameter($result, 'HaveNextTask', $cnt);
return $result;
}
// ...
}
Далее на JavaScript этот параметр анализируется для того, чтобы настроить доступ к полям.
onOpen: function () {
// ...
if (this.parameter('HaveNextTask') > 0) {
this.fieldProperty('NextTaskTargetID', 'readonly', true);
this.fieldProperty('NextStartDate', 'readonly', true);
this.fieldProperty('_select_next_target', 'readonly', true);
}
}
getCustomGrid(mixed[]$columns, array[]$values, array$params) : mixed[]
Возвращает данные для построения пользовательского грида
| mixed[] | $columns | Описание колонок |
| array[] | $values | Значения для грида. Среди колонок бязательно должна присутствовать колонка id. Обычно сюда передаётся результат DB::exec(). |
| array | $params | Необязательный параметр. Ассоциативный массив с параметрами грида. Доступные ключи:
|
Данные для передачи в представление грида.
public function renderSelectRecordDialog($params)
{
// Описание колонок, которые будут отображаться в таблице
$columns = array(
'orderpos' => array(
'caption' => 'Порядок',
'type' => 'int',
'display' => false,
'sort' => 'asc',
'width' => '10%',
),
'stagename' => array(
'caption' => 'Стадия',
'type' => 'string',
'width' => '20%',
),
'name' => array(
'caption' => 'Название',
'type' => 'string',
'width' => '50%',
),
'completed' => array(
'caption' => 'Завершено',
'type' => 'datetime',
'width' => '20%',
),
);
// Выбираем данные для отображеия в таблице
$sql = "select t0.id as id,
t0.orderpos as orderpos,
t1.name as stagename,
t0.name as name,
_iris_datetime_to_string[(select max(FinishDate)
from iris_task t00
left join iris_taskstate t01 on t01.id = t00.taskstateid
where t00.projectid = :projectid
and t00.tasktargetid = t0.id
and t01.code = 'Finished'
)] as completed
from iris_tasktarget t0
left join iris_projectstage t1 on t0.projectstageid = t1.id
where t0.isactive = 1
order by t0.orderpos
";
$filter = array(
':projectid' => $params['projectid'],
);
$values = $this->_DB->exec($sql, $filter);
// Выбранная по умолчанию запись - либо следующая либо текущая цель
$targetid = $params['nexttargetid'] && $params['nexttargetid'] != 'null'
? $params['nexttargetid'] : $params['targetid'];
$parameters = array(
'selected_id' => $targetid,
'grid_id' => 'custom_grid_'. md5(time() . rand(0, 10000)),
);
// Подготовка данных для пердставления таблицы
$data = $this->getCustomGrid($columns, $values, $parameters);
// Построение представления таблицы
$result = array(
//'Error' => 'Возникла ошибка',
'Card' => $this->renderView('grid', $data),
'GridId' => $parameters['grid_id'],
);
return $result;
}
saveRecord(mixed[]$data, array$params) : mixed[]
Сохранение записи в БД с вызовом стандартных обработчиков и назначением прав доступа
| mixed[] | $data | Набор полей |
| array | $params | Необязательный элемент. Ассоциативный массив с параметрами. Значения ключей по умолчанию:
|
// ...
$this->mergeFields($data, $this->formatField('StartDate', $nextstartdate));
$this->mergeFields($data, $this->formatField('FinishDate', $nextfinishdate));
// Создаем новое дело с вызывом обработчиков и добавлением прав
$this->saveRecord($data, array(
'mode' => 'insert',
'source_name' => 'Task',
));