• Модуль: 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;
}