- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/kanban.php
- Класс: Bitrix\Crm\Kanban
- Вызов: Kanban::getColumns
public function getColumns(bool $clear = false, bool $withoutCache = false, array $params = []): array
{
static $columns = [];
if($withoutCache)
{
$clear = $withoutCache;
}
if (isset($params['ONLY_ITEMS']) && $params['ONLY_ITEMS'] === 'Y')
{
return $columns;
}
if($clear)
{
$columns = [];
}
$params['originalColumns'] = ($params['originalColumns'] ?? false);
$filter = ($params['filter'] ?? []);
unset($params['filter']);
if(empty($columns))
{
$runtime = [];
$baseCurrency = $this->currency;
if($this->entity->getTypeName() === \CCrmOwnerType::OrderName)
{
$filterCommon = $this->getOrderFilter($runtime);
if(isset($filterCommon[$this->getStatusKey()]))
{
$this->allowStages = $filterCommon[$this->getStatusKey()];
}
}
else
{
$filterCommon = $this->getFilter($params);
}
$filter = array_merge($filterCommon, $filter);
if (
isset($params['VIEW_MODE'])
&& $params['VIEW_MODE'] === ViewMode::MODE_ACTIVITIES
&& isset($filter['CATEGORY_ID'])
&& $filter['CATEGORY_ID'] === -1
)
{
unset($filter['CATEGORY_ID']);
}
$sort = 0;
$winColumn = [];
$userPerms = $this->getCurrentUserPermissions();
// prepare each status
$isFirstDropZone = false;
foreach($this->getStatuses($clear) as $status)
{
$sort += 100;
$isDropZone = $this->isDropZone($status);
// first drop zone
if(!$isFirstDropZone && $isDropZone)
{
$isFirstDropZone = true;
}
// add 'delete' column
if($isFirstDropZone && !$params['originalColumns'])
{
$isFirstDropZone = false;
$columns[static::COLUMN_NAME_DELETED] = $this->getDeleteColumn([
'real_sort' => $status['SORT'],
'sort' => $sort
]);
}
// format column
$column = [
'real_id' => $status['ID'] ?? null,
'real_sort' => $status['SORT'] ?? null,
'id' => $status['STATUS_ID'] ?? null,
'name' => $status['NAME'] ?? null,
'color' => $this->getColumnColor($status),
'type' => $status['PROGRESS_TYPE'] ?? null,
'sort' => $sort,
'count' => 0,
'total' => 0,
'currency' => $baseCurrency,
'dropzone' => $isDropZone,
'alwaysShowInDropzone' => $this->isAlwaysShowInDropzone($status),
'canAddItem' => $this->entity->canAddItemToStage($status['STATUS_ID'], $userPerms, $status['SEMANTICS']),
'blockedIncomingMoving' => ($status['BLOCKED_INCOMING_MOVING'] ?? false),
];
$column = array_merge($column, $this->getAdditionalColumnParams());
// win column
if(!$params['originalColumns'] && $status['PROGRESS_TYPE'] === 'WIN')
{
$winColumn[$status['STATUS_ID']] = $column;
}
else
{
$columns[$status['STATUS_ID']] = $column;
}
}
$columns += $winColumn;
$lastColumn = end($columns);
if(!isset($columns[static::COLUMN_NAME_DELETED]))
{
$columns[static::COLUMN_NAME_DELETED] = $this->getDeleteColumn([
'real_sort' => $lastColumn['real_sort'] + 10,
'sort' => $lastColumn['sort'] + 10
]);
}
// Pass symantic param to the deadlines view for correct filter works
if (
$this->viewMode === ViewMode::MODE_DEADLINES &&
!empty($this->allowSemantics) &&
is_array($this->allowSemantics) &&
$this->entity instanceof \Bitrix\Crm\Kanban\Entity\Dynamic
) {
$filter['STAGE_SEMANTIC_ID'] = $this->allowSemantics;
}
//get sums and counts
$this->entity->fillStageTotalSums($filter, $runtime, $columns);
}
// without static cache
if($withoutCache)
{
$tmpColumns = $columns;
$columns = [];
return $tmpColumns;
}
return $columns;
}