- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_deal.php
- Класс: \CAllCrmDeal
- Вызов: CAllCrmDeal::getClientUFSqlData
static function getClientUFSqlData( array $order, array $filter, int $entityTypeId ): array { $entities = [ CCrmOwnerType::Contact => [ 'FIELD_PREFIX' => 'CONTACT_UF_', 'DEAL_FIELD_NAME' => 'CONTACT_ID', 'TABLE' => CCrmContact::TABLE_NAME, 'TABLE_ALIAS' => 'C', 'UF_ENTITY_ID' => CCrmContact::GetUserFieldEntityID(), ], CCrmOwnerType::Company => [ 'FIELD_PREFIX' => 'COMPANY_UF_', 'DEAL_FIELD_NAME' => 'COMPANY_ID', 'TABLE' => CCrmCompany::TABLE_NAME, 'TABLE_ALIAS' => 'CO', 'UF_ENTITY_ID' => CCrmCompany::GetUserFieldEntityID(), ], ]; if (!isset($entities[$entityTypeId])) { throw new \Bitrix\Main\NotSupportedException(); } $entity = $entities[$entityTypeId]; $fieldPrefix = $entity['FIELD_PREFIX']; $dealTableFieldName = self::TABLE_ALIAS . '.' .$entity['DEAL_FIELD_NAME']; $clientTableName = $entity['TABLE']; $clientTableAlias = $entity['TABLE_ALIAS']; $clientUFEntityId = $entity['UF_ENTITY_ID']; $ufFilterSql = null; $ufFilter = []; $sqlWhere = new CSQLWhere(); foreach ($filter as $filterKey => $filterValue) { $filterFieldName = $sqlWhere->MakeOperation($filterKey)['FIELD']; if (mb_strpos($filterFieldName, $fieldPrefix) !== 0) { continue; } $filterFieldNamePos = mb_strpos($filterKey, $fieldPrefix); $filterKey = ($filterFieldNamePos > 0 ? mb_substr($filterKey, 0, $filterFieldNamePos) : '') . 'UF_' . mb_substr($filterKey, $filterFieldNamePos + mb_strlen($fieldPrefix)); //Adapt nested filters for UserTypeSQL if (mb_strpos($filterKey, '__INNER_FILTER') === 0) { $ufFilter[] = $filterValue; } else { $ufFilter[$filterKey] = $filterValue; } } if (!empty($ufFilter)) { $userType = new CCrmUserType($GLOBALS['USER_FIELD_MANAGER'], $clientUFEntityId); $userType->ListPrepareFilter($ufFilter); $ufFilterSql = new CUserTypeSQL(); $ufFilterSql->SetEntity($clientUFEntityId, $clientTableAlias . '.ID'); $ufFilterSql->SetFilter($ufFilter); } $ufOrderSql = null; $ufOrder = []; foreach ($order as $orderField => $orderDirection) { if (mb_strpos($orderField, $fieldPrefix) !== 0) { continue; } $orderField = 'UF_' . mb_substr($orderField, mb_strlen($fieldPrefix)); $ufOrder[$orderField] = $orderDirection; } if (!empty($ufOrder)) { $ufOrderSql = new CUserTypeSQL(); $ufOrderSql->SetEntity($clientUFEntityId, $clientTableAlias . '.ID'); $ufOrderSql->SetOrder($ufOrder); $ufOrderSql->table_alias .= $clientTableAlias; } $result = []; if ($ufFilterSql) { // Adding user fields to WHERE $ufWhere = $ufFilterSql->GetFilter(); if ($ufWhere !== '') { $ufSql = $dealTableFieldName . ' IN (SELECT ' . $clientTableAlias . '.ID FROM ' . $clientTableName . ' ' . $clientTableAlias . ' ' . $ufFilterSql->GetJoin($clientTableAlias . '.ID') . ' WHERE ' . $ufWhere . ')'; // Adding user fields to joins $result['WHERE'][] = $ufSql; } } if ($ufOrderSql) { $ufOrderFound = false; foreach ($ufOrder as $orderField => $orderDirection) { $orderDirection = mb_strtoupper($orderDirection); if (!in_array($orderDirection, ['ASC', 'DESC'], true)) { $orderDirection = 'ASC'; } $ufOrderField = $ufOrderSql->GetOrder($orderField); if ($ufOrderField !== '') { $result['ORDERBY'][] = $ufOrderSql->GetOrder($orderField) . ' ' . $orderDirection; $ufOrderFound =- true; } } if ($ufOrderFound) { $result['FROM'][] = $ufOrderSql->GetJoin($dealTableFieldName); } } return $result; }