\Config

Родительский класс для классов конфигурации

Summary

Methods
Properties
Constants
__construct()
prepareDetail()
getActualValue()
mergeFields()
removeField()
formatField()
fieldValue()
insertRecord()
getValuesFromTables()
addParameter()
getCustomGrid()
renderView()
saveRecord()
$connection
No constants found
No protected methods found
$_Loader
$_Local
$_DB
$_section_name
$_table_name
N/A
No private methods found
No private properties found
N/A

Properties

$connection

$connection

Соединение с БД

$_Loader

$_Loader

Экземпляр класса для подключения файлов

$_Local

$_Local

Экземпляр класса для локализации

$_DB

$_DB

Экземпляр класса для работы с БД

$_section_name

$_section_name

Код раздела

По умолчанию вычисляется автоматически из названия дочернего класса

$_table_name

$_table_name

Таблица раздела (без префикса)

По умолчанию вычисляется автоматически из кода раздела

Methods

__construct()

__construct(\Loader$Loader, string[]$files) : \Config

Конструктор

Parameters

\Loader $Loader

Deprecated

string[] $files

Список используемых файлов. Путь указывается относительно корня системы.

Returns

\Config

Пример

class s_Task extends Config
{
    // Переопределение контруктора в дочернем классе
    public function __construct()
    {
        // Подключаем дополнительные файлы
        parent::__construct(array(
            'config/common/Lib/lib.php',
            'config/common/Lib/access.php',
        ));
    }
    // ...
}

prepareDetail()

prepareDetail(mixed[]$params) : mixed[]|null

Вызов обработчика изменения родительского поля карточки при создании записи из вкладки

При вызове карточки из вкладки автоматически заполняется ссылка на поле-родитель. Например, при добавлении дела из карточки контакта, автоматически заполняется поле "Контакт". В стандартной конфигурации есть обработчик, который при изменении поля "Контакт" в карточке дела автоматически заполняет поле "Компания" значением из контакта. Метод prepareDetail() предназначен для вызова таких обработчиков. Этот метод имеет смысл вызывать только для карточек раздела, которые могут создаваться из вкладок.

Parameters

mixed[] $params

Параметры из onPrepare()

Returns

mixed[]|null —

Список полей для заполнения по умолчанию, которые вернул стандартный обработчик. Поля в принятом формате.

Пример

// Для карточки дела, 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()

getActualValue(mixed[]$old_data, mixed[]$new_data, string|string[]$field_name) : mixed|mixed[]|null

Получить актуальное значение из двух списков полей (поля должны быть в принятном формате).

Предпочтение отдается $new_data. Если в $new_data нет искомого поля, то поиск поля выполняется в $old_data. Регистр в разваниях полей не учитывается.

Parameters

mixed[] $old_data

Старые данные в принятом формате

mixed[] $new_data

Новые данные в принятом формате

string|string[] $field_name

Название поля или массив названий

Returns

mixed|mixed[]|null —

Если $field_name - строка, то значение поля. Если $field_name - массив, то будет возвращен массив значений полей. Если поле не найдено, то будет возвращен null.

Пример 1

public function onAfterPost($table, $id, $old_data, $new_data) {
    $parent_id = $this->getActualValue($old_data, $new_data,
            strtolower($this->_parent) . 'id');
    // ...
}

Пример 2

public function onBeforePostPrice($parameters) {
    list ($count, $price, $discount) =
            $this->getActualValue($parameters['old_data'],
            $parameters['new_data'],
            array('count', 'price', 'discount'));
    // ...
}

mergeFields()

mergeFields(mixed[]$fields1, mixed[]$fields2, bool$priority2) : void

Объединяет набор полей в принятом формате

По умолчанию $fields2 имеет приоритет. Результат помещается в первый аргумент. Регистр в разваниях полей не учитывается.

Parameters

mixed[] $fields1

Первый набор полей (передается по ссылке).

mixed[] $fields2

Второй набор полей

bool $priority2

Является ли значения $field2 приоритетными. По умолчанию true. Если false, то в случае, если поле с одинаковым называнием встречается в обоих наборах, будет отдан преоритет первому набору.

removeField()

removeField(mixed[]$fields, string|string[]$field_name) : bool

Удалить поле/поля из набора полей

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

Parameters

mixed[] $fields

Набор полей

string|string[] $field_name

Название поля, которое требуется удалить из списка. Или массив с названиями полей.

Returns

bool —

Если удаление было выполнено, то true. Если удаления не произошло (поле не найдено), то false.

Пример

При сохранении карточки дела удаляется из набора поле CreateID, чтобы данные не были подменены на клиенте. При создании карточки это поле заполняется автоматически на уровне ядра.

public function onBeforePost(&$parameters) {
    $this->removeField($parameters['new_data'], 'CreateID');
    return $parameters['new_data'];
}

formatField()

formatField(string$name, mixed$value, string$caption) : mixed[]

Сформировать поле в формате набора полей

Parameters

string $name

Код поля (название поля в БД)

mixed $value

Значение поля

string $caption

Необязательный параметр. Отображаемое значение поля. Имеет смысл для полей-справочников, у которых значением является GUID, а отображаться должно строковое значение из связанного справочника. По умолчанию null.

Returns

mixed[] —

Поле в формате набора полей

Пример

// Ответственный
$User = IrisUser::getInstance();
$this->mergeFields($result, $this->formatField('OwnerID',
        $User->property('id'), $User->property('name')));

fieldValue()

fieldValue(mixed[]$fields, mixed$field_name) : mixed|mixed[]|null

Получить значения конкретного поля из набора полей

Parameters

mixed[] $fields

Набор полей

mixed $field_name

Код поля (название поля в БД) или массив с кодами полей

Returns

mixed|mixed[]|null —

Если $field_name - строка, то будет возвращено значение поля. Если $field_name - массив строк, то будет возвращен массив со значениями полей. Если поле не найдено, то null.

Пример

$number_old = $this->fieldValue($old_data, 'number');
$number_new = $this->getActualValue($old_data, $new_data, 'number');

insertRecord()

insertRecord(mixed[]$fields, string$table_name) : bool

Вставка записи в БД

Parameters

mixed[] $fields

Набор полей для вставки в таблицу

string $table_name

Необязательный параметр. Название таблицы, в которую надо вставить запись. Желательно с {}. Если название таблицы не указано, то будет использовано свойство Config::$_table_name.

Returns

bool —

true в случае успеха и false в случае неудачи

Пример 1

Вставка записи в таблицу раздела, для которого создан текущий экземпляр Config

if ($this->insertRecord($fields)) { ... }

Пример 2

Вставка записи в таблицу дел

// ...
$this->mergeFields($fields, $this->formatField('OwnerID',
        $User->property('id'), $User->property('name')));
if ($this->insertRecord($fields, '{Task}')) { ... }

getValuesFromTables()

getValuesFromTables(mixed[]$fields, mixed[]$params) : true

Получить несколько значений из разных таблиц (одним запросом к БД)

Этот метод целесообразно использовать, например, для подготовки значений по умолчанию при создании новой карточки раздела. Если требуется заполнить несколько полей-справочников, то это можно сделать, выполнив всего один запрос к БД. Данный метод формирует запрос, объединяя подзапросы для каждого значения с помощью union.

Parameters

mixed[] $fields

Исходный набор полей

mixed[] $params

Массив с описанием, какие значения из каких таблиц надо получить. Названия таблиц необходимо указывать с {}

array(
  'table1' => 'code1', // {Название таблицы} => Значение поля Code
  'table2' => 'code2', // {Название таблицы} => Значение поля Code
  'table3' => array(   // Альтернативный ватиант
    'filter' => 'id3', // Необязательный элемент. Название поля,
                       // по которому требуется выполнить фильтрацию
                       // По умолчанию - 'Code'.
    'value' => 'value3',  // Значение поля для фильтрации
    'result' => 'field3', // Необязательный элкмент. Название поля,
                          // из которого необходимо
                          // получить результат. По умолчанию
                          // вычисляется из названия таблицы.
  ),
)

Returns

true —

в случае успеха. Иначе false. null, если $params пуст.

Пример 1

Из onPrepare() карточки дела

// Значения справочников
$this->getValuesFromTables($result, array(
    '{TaskState}' => 'Plan',
    '{TaskImportance}' => 'Normal',
    '{TaskType}' => 'Execute',
));

Пример 2 (Антишаблон!)

Так использовать метод не следует.

$this->getValuesFromTables($result, array(
    '{TaskState}' => 'Plan',
));
$this->getValuesFromTables($result, array(
    '{TaskImportance}' => 'Normal',
));
$this->getValuesFromTables($result, array(
    '{TaskType}' => 'Execute',
));

addParameter()

addParameter(mixed[]$result, string$param_name, mixed$param_value) : null

Добавить параметр к набору полей

Используется в обработчиках onPrepare(). Установленный параметр будет доступен в картчоке на кдиенте. Значение параметра будет записано в первый аргумент.

Parameters

mixed[] $result

Массив с набором полей (и параметров)

string $param_name

Название параметра

mixed $param_value

Значение параметра

Returns

null —

Пример

В карточку дела передается параметр HaveNextTask - сколько дел создано из текущего дела.

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()

getCustomGrid(mixed[]$columns, array[]$values, array$params) : mixed[]

Возвращает данные для построения пользовательского грида

Parameters

mixed[] $columns

Описание колонок

array[] $values

Значения для грида. Среди колонок бязательно должна присутствовать колонка id. Обычно сюда передаётся результат DB::exec().

array $params

Необязательный параметр. Ассоциативный массив с параметрами грида. Доступные ключи:

  • lines - Количество строк в каждой строке грида
  • selected_id - Id выбранной строки грида
  • selected_row_number - Номер выбранной строки грида
  • grid_id - Id грида

Returns

mixed[] —

Данные для передачи в представление грида.

Пример

Подготовка грида для выбора следующего дела в инкубаторе продаж (из карточки дела).

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;
}

renderView()

renderView(string$name, mixed$data) : string

Построение html представления

Parameters

string $name

Название представления

mixed $data

Данные для представления

Returns

string —

Строка с HTML текстом представления

saveRecord()

saveRecord(mixed[]$data, array$params) : mixed[]

Сохранение записи в БД с вызовом стандартных обработчиков и назначением прав доступа

Parameters

mixed[] $data

Набор полей

array $params

Необязательный элемент. Ассоциативный массив с параметрами. Значения ключей по умолчанию:

  • 'mode' => 'insert', // insert или update
  • 'id' => 'null', // Указывается в случае обновления записи
  • 'source_name_real' => null,
  • 'duplicate_ignore' => 1, // Не выполнять проверку наличия дубликатов
  • 'parent_type' => 'grid',
  • 'source_type' => null, // Тип источника сохраняемой записи
  • 'source_name' => $this->_section_name, // Код источника сохраняемой записи
  • 'detail_name' => '', // Код вкладки сохраняемой записи

Returns

mixed[] —

Пример

// ...
$this->mergeFields($data, $this->formatField('StartDate', $nextstartdate));
$this->mergeFields($data, $this->formatField('FinishDate', $nextfinishdate));
// Создаем новое дело с вызывом обработчиков и добавлением прав
$this->saveRecord($data, array(
    'mode' => 'insert',
    'source_name' => 'Task',
));