- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/integration/crm/connectors/client.php
- Класс: Bitrix\Sender\Integration\Crm\Connectors\Client
- Вызов: Client::addCrmEntityReferences
protected function addCrmEntityReferences(Entity\Query $query) { $docTypes = array(); $docType = $this->getFieldValue('DOC_TYPE'); if ($docType) { $docTypes[] = $docType; } else { foreach (array_keys(self::getCrmDocumentTypes()) as $entityTypeName) { $filter = $this->getCrmReferencedEntityFilter($entityTypeName); if (count($filter) === 0) { continue; } $docTypes[] = $entityTypeName; } } foreach ($docTypes as $docType) { $refClassName = "\\Bitrix\\Crm\\" . ucfirst(mb_strtolower($docType)) . "Table"; if (!class_exists($refClassName)) { continue; } if ($query->getEntity()->getName() === 'Contact') { $ref = array('=this.ID' => 'ref.CONTACT_ID'); } elseif ($query->getEntity()->getName() === 'Company') { $ref = array('=this.ID' => 'ref.COMPANY_ID'); } else { continue; } $runtimeFieldName = "SGT_$docType"; $filter = $this->getCrmReferencedEntityFilter($docType); $joinType = $filter[$docType]['JOIN_TYPE']??'INNER'; unset($filter[$docType]['JOIN_TYPE']); $query->registerRuntimeField(null, new Entity\ReferenceField( $runtimeFieldName, $refClassName, $ref, array('join_type' => $joinType) )); foreach ($filter as $key => $value) { $pattern = "/^[\W]{0,2}$docType\./"; if (preg_match($pattern, $key)) { $key = str_replace("$docType.", "$runtimeFieldName.", $key); } $query->addFilter($key, $value); } $runtime = Helper::getRuntimeByEntity($docType); foreach ($runtime as $item) { $item = new Entity\ExpressionField( $item['name'], str_replace("$docType.", "$runtimeFieldName.", $item['expression']), array_map( function ($from) use ($docType, $runtimeFieldName) { return str_replace("$docType.", "$runtimeFieldName.", $from); }, $item['buildFrom'] ) ); $query->registerRuntimeField($item); } } $entityTypeName = mb_strtoupper($query->getEntity()->getName()); $runtime = Helper::getRuntimeByEntity($entityTypeName); foreach ($runtime as $item) { $item = new Entity\ExpressionField( $item['name'], $item['expression'], array_map( function ($from) use ($entityTypeName) { return str_replace("$entityTypeName.", "", $from); }, $item['buildFrom'] ) ); $query->registerRuntimeField($item); } $filterFields = $query->getFilter(); if (array_key_exists('NO_PURCHASES', $filterFields)) { $noPurchasesFilter = $filterFields['NO_PURCHASES']; $productSource = $filterFields['PRODUCT_SOURCE']; unset($filterFields['NO_PURCHASES']); $query->setFilter($filterFields); $this->addNoPurchasesFilter($query, $noPurchasesFilter, $productSource); } if (array_key_exists('DEAL', $filterFields)) { $query->where(\Bitrix\Main\Entity\Query::filter() ->logic('or') ->where($filterFields['DEAL']) ); unset($filterFields['DEAL']); $query->setFilter($filterFields); } }