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