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