• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/helpers/filter.php
  • Класс: BitrixImOpenLinesHelpersFilter
  • Вызов: Filter::getFilter
static function getFilter(string $filterId, ?array $arResult = null, ?array $filterDefinition = null): array
{
	$request = HttpApplication::getInstance()->getContext()->getRequest();

	$configId = (int)$request->get('CONFIG_ID') ?? 0;

	$ufFieldsList = self::getUfFieldList();

	$filterOptions = new BitrixMainUIFilterOptions($filterId);

	if (!$filterDefinition)
	{
		$filterDefinition = self::getFilterDefinition($ufFieldsList, $configId, $arResult);
	}

	$filter = $filterOptions->getFilter($filterDefinition);

	$userPermissions = SecurityPermissions::createWithCurrentUser();
	$allowedUserIds = SecurityHelper::getAllowedUserIds(
		SecurityHelper::getCurrentUserId(),
		$userPermissions->getPermission(SecurityPermissions::ENTITY_SESSION, SecurityPermissions::ACTION_VIEW)
	);

	$result = [];

	if ($request->get('GUEST_USER_ID'))
	{
		$result['=USER_ID'] = intval($request->get('GUEST_USER_ID'));
	}

	if (!isset($filter['OPERATOR_ID']) && $request->get('OPERATOR_ID') !== null)
	{
		$value = $request->get('OPERATOR_ID');
		$filter['OPERATOR_ID'] = (
		is_string($value) && mb_strtolower($value) === 'empty'
			? 'empty'
			: intval($value)
		);
	}

	if (isset($filter['CLIENT_NAME']))
	{
		$filterUserClient = BitrixMainUserUtils::getUserSearchFilter(Array(
			'FIND' => $filter['CLIENT_NAME']
		));

		$filterUserClient['EXTERNAL_AUTH_ID'] = array('imconnector');

		$userClientRaw = BitrixMainUserTable::getList(Array(
			'select' => Array('ID'),
			'filter' => $filterUserClient
		));

		while ($userClientRow = $userClientRaw->fetch())
		{
			$result['=USER_ID'][] = $userClientRow['ID'];
		}

		if (empty($result['=USER_ID']))
		{
			$result['=USER_ID'] = -1;
		}
	}

	if (isset($filter['OPERATOR_ID']))
	{
		$filter['OPERATOR_ID'] =
			mb_strtolower($filter['OPERATOR_ID']) === 'empty'
				? false
				: (int)$filter['OPERATOR_ID']
		;

		if (is_array($allowedUserIds))
		{
			$result['=OPERATOR_ID'] = array_intersect(array_merge($allowedUserIds, array(false)), array($filter['OPERATOR_ID']));
		}
		else
		{
			$result['=OPERATOR_ID'] = $filter['OPERATOR_ID'];
		}
	}
	elseif (is_array($allowedUserIds))
	{
		$result['=OPERATOR_ID'] = $allowedUserIds;
	}

	$extractDateRange = function($fieldName) use (&$filter, &$result)
	{
		if (!empty($filter["{$fieldName}_from"]))
		{
			try
			{
				$result[">={$fieldName}"] = new BitrixMainTypeDateTime($filter["{$fieldName}_from"]);
			}
			catch (Exception $e)
			{
			}
		}
		if (!empty($filter["{$fieldName}_to"]))
		{
			try
			{
				$result["<={$fieldName}"] = new BitrixMainTypeDateTime($filter["{$fieldName}_to"]);
			}
			catch (Exception $e)
			{
			}
		}
	};

	$extractDateRange('DATE_CREATE');
	$extractDateRange('DATE_CLOSE');

	if (isset($filter['SOURCE']) && is_array($filter['SOURCE']))
	{
		$result['=SOURCE'] = $filter['SOURCE'];
	}

	if (isset($filter['CONFIG_ID']) && is_array($filter['CONFIG_ID']))
	{
		$result['=CONFIG_ID'] = $filter['CONFIG_ID'];
	}
	else if ($configId)
	{
		$result['=CONFIG_ID'] = $configId;
	}

	if (!empty($filter['EXTRA_URL']))
	{
		$result['%EXTRA_URL'] = $filter['EXTRA_URL'];
	}

	if (!empty($filter['EXTRA_TARIFF']))
	{
		if (mb_strpos($filter['EXTRA_TARIFF'],'%') !== false && mb_strpos($filter['EXTRA_TARIFF'],'%') == 0)
		{
			$result['%EXTRA_TARIFF'] = mb_substr($filter['EXTRA_TARIFF'], 1);
		}
		else
		{
			$result['=EXTRA_TARIFF'] = $filter['EXTRA_TARIFF'];
		}
	}

	if (!empty($filter['EXTRA_USER_LEVEL']))
	{
		$result['=EXTRA_USER_LEVEL'] = $filter['EXTRA_USER_LEVEL'];
	}

	if (!empty($filter['EXTRA_PORTAL_TYPE']))
	{
		$result['=EXTRA_PORTAL_TYPE'] = $filter['EXTRA_PORTAL_TYPE'];
	}

	if (isset($filter['STATUS']))
	{
		switch ($filter['STATUS'])
		{
			case 'client':
				$result['=STATUS'] = Session::STATUS_OPERATOR;
				$result['=STATUS'] = Session::STATUS_CLOSE;
				break;
		}
	}

	if (isset($filter['STATUS_DETAIL']) && is_array($filter['STATUS_DETAIL']))
	{
		$result['=STATUS'] = $filter['STATUS_DETAIL'];
	}

	if (isset($filter['CRM']))
	{
		$result['=CRM'] = $filter['CRM'];
	}

	if (isset($filter['CRM_ENTITY']) && $filter['CRM_ENTITY'] != '')
	{
		$crmFilter = array();
		try
		{
			$crmFilter = BitrixMainWebJson::decode($filter['CRM_ENTITY']);
		}
		catch (BitrixMainArgumentException $e)
		{
		}

		if (count($crmFilter) == 1)
		{
			//TODO: improve search
			$entityTypes = array_keys($crmFilter);
			$entityType = $entityTypes[0];
			$entityId = $crmFilter[$entityType][0];
			//$result['=CRM_ENTITY_TYPE'] = $entityType;
			//$result['=CRM_ENTITY_ID'] = $entityId;
		}
	}

	if (isset($filter['SEND_FORM']))
	{
		if ($filter['SEND_FORM'] == 'Y')
		{
			$result['!=SEND_FORM'] = 'none';
		}
		else
		{
			$result['=SEND_FORM'] = 'none';
		}
	}

	$extractBoolean = function($fieldName, $typeCast = 'enum') use (&$filter, &$result)
	{
		if (isset($filter[$fieldName]))
		{
			$trueVal = $typeCast == 'enum' ? 'Y' : 1;
			if ($filter[$fieldName] == 'Y')
			{
				$result["={$fieldName}"] = $trueVal;
			}
			else if ($filter[$fieldName] == 'N')
			{
				$result["!={$fieldName}"] = $trueVal;
			}
		}
	};

	$extractBoolean('SEND_HISTORY', 'enum');
	$extractBoolean('SPAM', 'enum');

	$extractNumberRange = function($fieldName, $typeCast = 'intval') use (&$filter, &$result)
	{
		if (isset($filter["{$fieldName}_numsel"]))
		{
			if ($filter["{$fieldName}_numsel"] == 'range')
			{
				if ($typeCast($filter["{$fieldName}_from"]) > 0 && $typeCast($filter["{$fieldName}_to"]) == 0)
				{
					$filter["{$fieldName}_numsel"] = 'more';
					$filter["{$fieldName}_from"] = $typeCast($filter["{$fieldName}_from"]) - 1;
				}
				elseif ($typeCast($filter["{$fieldName}_from"]) == 0 && $typeCast($filter["{$fieldName}_to"]) > 0)
				{
					$filter["{$fieldName}_numsel"] = 'less';
					$filter["{$fieldName}_to"] = $typeCast($filter["{$fieldName}_to"]) + 1;
				}
				else
				{
					$result[">={$fieldName}"] = $typeCast($filter["{$fieldName}_from"]);
					$result["<={$fieldName}"] = $typeCast($filter["{$fieldName}_to"]);
				}
			}
			if ($filter["{$fieldName}_numsel"] == 'more')
			{
				$result[">{$fieldName}"] = $typeCast($filter["{$fieldName}_from"]);
			}
			elseif ($filter["{$fieldName}_numsel"] == 'less')
			{
				$result["<{$fieldName}"] = $typeCast($filter["{$fieldName}_to"]);
			}
			elseif ($filter["{$fieldName}_numsel"] != 'range')
			{
				$result["={$fieldName}"] = $typeCast($filter["{$fieldName}_from"]);
			}
		}
		elseif (isset($filter["{$fieldName}"]))
		{
			$result["={$fieldName}"] = $typeCast($filter["{$fieldName}"]);
		}
	};

	$extractNumberRange('MESSAGE_COUNT', 'intval');
	$extractNumberRange('EXTRA_REGISTER', 'intval');

	if (isset($filter['TYPE']))
	{
		$result['=MODE'] = $filter['TYPE'];
	}

	if (isset($filter['ID']))
	{
		$result['=ID'] = $filter['ID'];
	}

	if (isset($filter['WORKTIME']))
	{
		$result['=WORKTIME'] = $filter['WORKTIME'];
	}

	if (isset($filter['VOTE']))
	{
		$result['=VOTE'] = intval($filter['VOTE']);
	}

	if (isset($filter['VOTE_HEAD']) && is_array($filter['VOTE_HEAD']))
	{
		foreach ($filter['VOTE_HEAD'] as $key => $value)
		{
			if ($value == 'wo')
			{
				$filter['VOTE_HEAD'][$key] = 0;
			}
		}
		$result['=VOTE_HEAD'] = $filter['VOTE_HEAD'];
	}

	$minSearchToken = BitrixMainConfigOption::get('imopenlines', 'min_search_token');
	if (
		isset($filter['FIND'])
		&& (
			$minSearchToken <= 0
			|| BitrixMainSearchContent::isIntegerToken($filter['FIND'])
			|| mb_strlen($filter['FIND']) >= $minSearchToken
		)
		&& BitrixMainSearchContent::canUseFulltextSearch($filter['FIND'], BitrixMainSearchContent::TYPE_MIXED)
	)
	{
		global $DB;
		if (
			!BitrixImopenlinesModelSessionIndexTable::getEntity()->fullTextIndexEnabled('SEARCH_CONTENT')
			&& $DB->IndexExists('b_imopenlines_session_index', array('SEARCH_CONTENT'), true)
		)
		{
			BitrixImopenlinesModelSessionIndexTable::getEntity()->enableFullTextIndex('SEARCH_CONTENT');
		}
		if (BitrixImopenlinesModelSessionIndexTable::getEntity()->fullTextIndexEnabled('SEARCH_CONTENT'))
		{
			if (BitrixMainSearchContent::isIntegerToken($filter['FIND']))
			{
				$result['*INDEX.SEARCH_CONTENT'] = BitrixMainSearchContent::prepareIntegerToken($filter['FIND']);
			}
			else
			{
				$result['*INDEX.SEARCH_CONTENT'] = BitrixMainSearchContent::prepareStringToken($filter['FIND']);
			}
		}
	}

	// UF
	foreach ($ufFieldsList as $fieldName => $field)
	{
		if (
			$field['SHOW_FILTER'] != 'N'
			&& $field['USER_TYPE']['BASE_TYPE'] !== CUserTypeManager::BASE_TYPE_FILE
		)
		{
			if ($field['USER_TYPE']['BASE_TYPE'] === CUserTypeManager::BASE_TYPE_DATETIME)
			{
				$extractDateRange($fieldName);
			}
			elseif ($field['USER_TYPE']['USER_TYPE_ID'] === BitrixMainUserFieldTypesBooleanType::USER_TYPE_ID)
			{
				$extractBoolean($fieldName, 'intval');
			}
			elseif ($field['USER_TYPE']['BASE_TYPE'] === CUserTypeManager::BASE_TYPE_INT)
			{
				$extractNumberRange($fieldName, 'intval');
			}
			elseif ($field['USER_TYPE']['BASE_TYPE'] === CUserTypeManager::BASE_TYPE_DOUBLE)
			{
				$extractNumberRange($fieldName, 'doubleval');
			}
			elseif (isset($filter[$fieldName]))
			{
				$result["={$fieldName}"] = $filter[$fieldName];
			}
		}
	}

	return $result;
}