- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/entity/entitybase.php
- Класс: Bitrix\Crm\Entity\EntityBase
- Вызов: EntityBase::getTopIDs
public function getTopIDs(array $params)
{
$order = isset($params['order']) && is_array($params['order']) ? $params['order'] : ['ID' => 'ASC'];
$filter = isset($params['filter']) && is_array($params['filter']) ? $params['filter'] : [];
$limit = isset($params['limit']) ? (int)$params['limit'] : 0;
$enablePermissionCheck = isset($params['enablePermissionCheck']) ? (bool)$params['enablePermissionCheck'] : true;
if (
!$this->areFieldsCompatibleWithOrm(array_keys($order))
|| !$this->areFieldsCompatibleWithOrm(array_keys($filter))
)
{
if (!$enablePermissionCheck)
{
$filter['CHECK_PERMISSIONS'] = 'N';
}
return $this->getTopIdsInCompatibilityMode($limit, $order, $filter);
}
static $cache;
$cacheKey = md5(serialize($params) . $this->getEntityTypeID());
if (isset($cache[$cacheKey]))
{
return $cache[$cacheKey];
}
$cache[$cacheKey] = [];
$categories = $filter['=CATEGORY_ID'] ?? $filter['@CATEGORY_ID'] ?? $filter['CATEGORY_ID'] ?? null;
if (!is_null($categories))
{
$categories = array_unique(array_map('intval', (array)$categories));
if (empty($categories))
{
$categories = null;
}
}
if ($enablePermissionCheck)
{
$userPermissions = $params['userPermissions'] ?? \CCrmPerms::GetCurrentUserPermissions();
$builderOptions = (new Options())
->setNeedReturnRawQuery(true)
;
if ($categories)
{
$builderOptions->setSkipCheckOtherEntityTypes(true);
}
$builderResult = $this->buildPermissionSqlForCategories(
$userPermissions->GetUserID(),
$builderOptions,
$categories ?? [0]
);
}
$isOnlyCategoryFilter = (count($filter) === 1) && is_array($categories);
if ($enablePermissionCheck && !$builderResult->hasAccess()) // Access denied
{
return $cache[$cacheKey];
}
elseif (
$enablePermissionCheck
&& $builderResult->hasRestrictions() // need to check permissions
&& (empty($filter) || $isOnlyCategoryFilter) // filter is suitable
&& count($order) === 1 // and ordered only by ID
&& isset($order['ID'])
)
{
$cache[$cacheKey] = $this->getTopIdsFromPermissions(
$userPermissions,
$limit,
$order['ID'],
$categories ?? [0] // for backward compatibility, use categoryId = 0 if not defined
);
return $cache[$cacheKey];
}
$query = new \Bitrix\Main\Entity\Query($this->getDbEntity());
$query->addSelect('ID');
$query->setOrder($order);
$query->setFilter($filter);
$query->setLimit($limit);
if ($enablePermissionCheck && $builderResult->hasRestrictions())
{
$query->addFilter('@ID', $builderResult->getSqlExpression());
}
$dbResult = $query->exec();
while ($fields = $dbResult->fetch())
{
$cache[$cacheKey][] = (int)$fields['ID'];
}
return $cache[$cacheKey];
}