$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',
));