CCrmFieldMulti::PrepareSearchQuery

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmFieldMulti
  4. PrepareSearchQuery
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_field_multi.php
  • Класс: \CCrmFieldMulti
  • Вызов: CCrmFieldMulti::PrepareSearchQuery
static function PrepareSearchQuery(&$arFilter, &$arSqlSearch)
{
	global $DB;

	$filter_keys = array_keys($arFilter);
	for ($i=0, $ic=count($filter_keys); $i < $ic; $i++)
	{
		$val = $arFilter[$filter_keys[$i]];

		if (!is_array($val) && ((string)$val == '' || (string)$val == "NOT_REF"))
		{
			continue;
		}

		$key = strtoupper($filter_keys[$i]);
		$operationInfo = CSqlUtil::GetFilterOperation($key);
		$operation = $operationInfo['OPERATION'];
		// Process only like operation
		$isLikeOperation = $operation === 'LIKE' ? 'Y' : 'N';
		$fieldName = $operationInfo['FIELD'];

		switch($fieldName)
		{
			case 'ID':
				$arSqlSearch[] = GetFilterQuery('CFM.ID', $val, 'N');
				break;
			case 'ENTITY_ID':
				if ($operation !== '=' || is_array($val))
				{
					$arSqlSearch[] = GetFilterQuery('CFM.ENTITY_ID', $val, $isLikeOperation);
				}
				else
				{
					$arSqlSearch[] = 'CFM.ENTITY_ID = \'' . $DB->ForSql((string)$val) . '\'';
				}

				break;
			case 'ELEMENT_ID':
				if (is_array($val))
				{
					$ar = array();
					foreach($val as $v)
						$ar[] = intval($v);
					if (!empty($ar))
						$arSqlSearch[] = 'CFM.ELEMENT_ID IN ('.implode(',', $ar).')';
				}
				else
					$arSqlSearch[] = 'CFM.ELEMENT_ID = '.intval($val);
				break;
			case 'TYPE_ID':
				$arSqlSearch[] = GetFilterQuery('CFM.TYPE_ID', $val, $isLikeOperation);
				break;
			case 'VALUE_TYPE':
				if (is_array($val))
				{
					$valueTypeFilter = '';
					foreach($val as $v)
					{
						$v = $DB->ForSql(trim(strval($v)));
						if($v === '')
						{
							continue;
						}

						if($valueTypeFilter !== '')
						{
							$valueTypeFilter .= ', ';
						}

						$valueTypeFilter .= "'{$v}'";
					}

					if ($valueTypeFilter !== '')
					{
						$arSqlSearch[] = "CFM.VALUE_TYPE IN ({$valueTypeFilter})";
					}
				}
				else
					$arSqlSearch[] = GetFilterQuery('CFM.VALUE_TYPE', $val, $isLikeOperation);
				break;
			case 'COMPLEX_ID':
				$arSqlSearch[] = GetFilterQuery('CFM.COMPLEX_ID', $val, $isLikeOperation);
				break;
			case 'VALUE':
				$arSqlSearch[] = GetFilterQuery('CFM.VALUE', $val, $isLikeOperation);
				break;
			case 'RAW_VALUE':
				$arSqlSearch[] = "CFM.VALUE = '".$DB->ForSql($val)."'";
				break;
			case 'FILTER':
			{
				$arSqlFilterSearch = array();
				if(is_array($val))
				{
					// Processing of filter parts
					foreach($val as $v)
					{
						// Prepering filter part - items are joined by 'AND'
						$arSqlInnerSearch = array();
						self::PrepareSearchQuery($v, $arSqlInnerSearch);
						if(!empty($arSqlInnerSearch))
						{
							$arSqlFilterSearch[] = '('.implode(' AND ', $arSqlInnerSearch).')';
						}
					}
				}
				if (!empty($arSqlFilterSearch))
				{
					//$logic = isset($arFilter['LOGIC']) && is_string($arFilter['LOGIC']) ? strtoupper($arFilter['LOGIC']) : '';
					//$logic = '';
					//if($logic === '')
					//{
					//	$logic = 'OR';
					//}

					// Prepering filter - parts are joined by 'OR'
					//$arSqlSearch[] = '('.implode(" {$logic} ", $arSqlFilterSearch).')';
					$arSqlSearch[] = '('.implode(" OR ", $arSqlFilterSearch).')';
				}
			}
			break;
		}
	}
}

Добавить комментарий