public static function GetList($order = array(), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array()) { $filter = array("LOGIC" => "AND"); if (is_array($arFilter)) { foreach ($arFilter as $dkey => $val) { $key = CSqlUtil::GetFilterOperation($dkey); if ($key["FIELD"] == "ID" && is_array($val)) { $res = array("LOGIC" => "OR"); foreach ($val as $v) { if ($v == self::SUBSCRIBE_ALL) { $res[] = array("=SUBSCRIBE_TYPE" => \Bitrix\Idea\NotifyEmailTable::SUBSCRIBE_TYPE_ALL); } else { if (strpos($v, self::SUBSCRIBE_IDEA_COMMENT) === 0) { $res[] = array("=ENTITY_TYPE" => \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_IDEA, "=ENTITY_CODE" => str_replace(self::SUBSCRIBE_IDEA_COMMENT, "", $v)); } } } $filter[] = $res; } else { if ($key["FIELD"] == "USER_ID" || $key["FIELD"] == "USER_EMAIL") { $filter[] = array($dkey => $val); } } } } $select = array(); $runtime = array(); if (is_array($arSelectFields)) { $select = array_intersect($arSelectFields, array_keys(\Bitrix\Idea\NotifyEmailTable::getMap())); if (in_array("USER_EMAIL", $arSelectFields)) { $select["USER_EMAIL"] = "USER.EMAIL"; } if (in_array("ID", $arSelectFields)) { $select["ID"] = 'RUNTIME_ID'; $runtime[] = new ExpressionField('RUNTIME_ID', Application::getConnection()->getSqlHelper()->getConcatFunction("CASE " . "WHEN %s='" . \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_IDEA . "' AND %s='' THEN '" . self::SUBSCRIBE_ALL . "' " . "WHEN %s='" . \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_IDEA . "' THEN '" . self::SUBSCRIBE_IDEA_COMMENT . "' " . "WHEN %s='" . \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_CATEGORY . "' AND %s='' THEN '" . self::SUBSCRIBE_ALL_IDEA . "' " . "WHEN %s='" . \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_CATEGORY . "' THEN '" . \Bitrix\Idea\NotifyEmailTable::ENTITY_TYPE_CATEGORY . "' " . "ELSE 'UNK' END", "%s"), array("ENTITY_TYPE", "ENTITY_CODE", "ENTITY_TYPE", "ENTITY_TYPE", "ENTITY_CODE", "ENTITY_TYPE", "ENTITY_CODE")); } } $db_res = \Bitrix\Idea\NotifyEmailTable::getList(array('filter' => $filter, 'select' => $select, 'order' => $order, 'runtime' => $runtime)); return new CDBResult($db_res); }
private 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) && strlen($val) <= 0 || $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': $arSqlSearch[] = GetFilterQuery('CFM.ENTITY_ID', $val, $isLikeOperation); 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 '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; } } }
if ($nTopCount > 0) { $arNavParams['nTopCount'] = $nTopCount; } //$arEntityList = Array(); $arResult['EVENT'] = array(); $event = new CCrmInvoiceEvent(); if (!array_key_exists('TYPE', $arFilter)) { $arFilter['TYPE'] = array_keys($arResult['EVENT_TYPES']); } $obRes = $event->GetList($arResult['SORT'], $arFilter, false, $arNavParams, array(), array()); $arResult['DB_LIST'] = $obRes; $arResult['ROWS_COUNT'] = $obRes->NavRecordCount; // Prepare raw filter ('=CREATED_BY' => 'CREATED_BY') $arResult['DB_FILTER'] = array(); foreach ($arFilter as $filterKey => &$filterItem) { $info = CSqlUtil::GetFilterOperation($filterKey); $arResult['DB_FILTER'][$info['FIELD']] = $filterItem; } unset($filterItem); $arUserDistinct = array(); $arUserInfo = array(); $arEventDescr = array(); while ($arEvent = $obRes->Fetch()) { $arEvent['PATH_TO_EVENT_DELETE'] = CHTTP::urlAddParams($arParams['PATH_TO_EVENT_LIST'], array('action_' . $arResult['GRID_ID'] => 'delete', 'ID' => $arEvent['ID'], 'sessid' => bitrix_sessid())); $arEvent['~FILES'] = $arEvent['FILES']; //$arEvent['~EVENT_NAME'] = $arEvent['EVENT_NAME']; $arUserDistinct[intval($arEvent['USER_ID'])] = true; $arEvent['DATE_CREATE'] = $arEvent['DATE_CREATE']; //$arEvent['EVENT_NAME'] = htmlspecialcharsbx($arEvent['~EVENT_NAME']); if (!empty($arEvent['FILES'])) { $i = 1;
protected function internalizeFilterFields(&$filter, &$fieldsInfo) { if (!is_array($filter)) { return; } foreach ($filter as $k => $v) { $operationInfo = CSqlUtil::GetFilterOperation($k); $fieldName = $operationInfo['FIELD']; $info = isset($fieldsInfo[$fieldName]) ? $fieldsInfo[$fieldName] : null; if (!$info) { unset($filter[$k]); continue; } $fieldType = isset($info['TYPE']) ? $info['TYPE'] : ''; if ($fieldType === 'datetime') { $filter[$k] = CRestUtil::unConvertDateTime($v); } } CCrmEntityHelper::PrepareMultiFieldFilter($filter); }
public static function GetList($arSort = array(), $arFilter = array(), $arSelect = array()) { if (!CModule::IncludeModule('sale')) { return array(); } $arStatus = array(); self::ensureLanguageDefined(); $fieldsInfo = self::GetFieldsInfo(); $filterOperations = array(); foreach ($arFilter as $k => $v) { $operationInfo = CSqlUtil::GetFilterOperation($k); $operationInfo['FILTER_VALUE'] = $v; $fieldName = $operationInfo['FIELD']; $info = isset($fieldsInfo[$fieldName]) ? $fieldsInfo[$fieldName] : null; if ($info) { $operationInfo['FIELD_TYPE'] = $info['TYPE']; $filterOperations[] = $operationInfo; } } $res = CSaleStatus::GetList(array(), array('LID' => self::$languageID), false, false, array('ID', 'SORT', 'NAME')); while ($row = $res->Fetch()) { if ($row['ID'] === 'F') { continue; } $arStatus[$row['ID']] = array('ID' => strval(ord($row['ID'])), 'ENTITY_ID' => 'INVOICE_STATUS', 'STATUS_ID' => $row['ID'], 'NAME' => $row['NAME'], 'NAME_INIT' => '', 'SORT' => $row['SORT'], 'SYSTEM' => 'N'); if (in_array($row['ID'], array('N', 'P', 'F', 'D'))) { if ($row['ID'] === 'F') { $arStatus[$row['ID']]['NAME_INIT'] = GetMessage('CRM_INVOICE_STATUS_F'); } elseif ($row['ID'] === 'D') { $arStatus[$row['ID']]['NAME_INIT'] = GetMessage('CRM_INVOICE_STATUS_D'); } elseif ($row['ID'] === 'N') { $arStatus[$row['ID']]['NAME_INIT'] = GetMessage('CRM_INVOICE_STATUS_N'); } elseif ($row['ID'] === 'P') { $arStatus[$row['ID']]['NAME_INIT'] = GetMessage('CRM_INVOICE_STATUS_P'); } $arStatus[$row['ID']]['SYSTEM'] = 'Y'; } } // filter $arResult = array(); foreach ($arStatus as $row) { $bRowSelected = true; foreach ($filterOperations as $filterInfo) { if (!self::CheckFilter($filterInfo, $row)) { $bRowSelected = false; break; } } if ($bRowSelected) { $arResult[] = $row; } } // sort if (count($arSort) > 0 && count($arResult) > 0) { $arSortKeys = array_keys($arSort); $arSortBy = $arSortDir = $arSortType = array(); $origFieldsNames = array_keys($fieldsInfo); $numSorts = 0; foreach ($arSortKeys as $sortKey) { if (in_array($sortKey, $origFieldsNames, true)) { $arSortBy[] = ToUpper($sortKey); $arSortDir[] = ToUpper($arSort[$sortKey]) === 'DESC' ? SORT_DESC : SORT_ASC; $sortType = SORT_REGULAR; switch ($fieldsInfo[$sortKey]['TYPE']) { case 'integer': $sortType = SORT_NUMERIC; break; case 'string': case 'char': $sortType = SORT_STRING; break; } $arSortType[] = $sortType; $numSorts++; } } if ($numSorts > 0) { $fieldsNames = array(); foreach ($origFieldsNames as $fieldName) { if (!in_array($fieldName, $arSortBy, true)) { $fieldsNames[] = $fieldName; } } $fieldsNames = array_merge($arSortBy, $fieldsNames); $fieldsIndex = $columns = array(); $index = 0; foreach ($fieldsNames as $fieldName) { $columns[$index] = array(); $fieldsIndex[$fieldName] = $index++; } foreach ($arResult as $row) { foreach ($row as $fieldName => $fieldValue) { if (isset($fieldsIndex[$fieldName])) { $columns[$fieldsIndex[$fieldName]][] = $fieldValue; } } } $args = array(); $index = 0; foreach ($columns as &$column) { $args[] =& $column; if ($index < $numSorts) { $args[] =& $arSortDir[$index]; $args[] =& $arSortType[$index]; } $index++; } unset($column); call_user_func_array('array_multisort', $args); $numRows = count($arResult); $arResult = array(); for ($index = 0; $index < $numRows; $index++) { $row = array(); foreach ($origFieldsNames as $fieldName) { $row[$fieldName] = $columns[$fieldsIndex[$fieldName]][$index]; } $arResult[] = $row; } } } // select if (count($arResult) > 0 && is_array($arSelect) && count($arSelect) > 0) { $selectedFields = array_intersect($arSelect, array_keys($fieldsInfo)); if (count($selectedFields) > 0) { $arStatus = $arResult; $arResult = array(); foreach ($arStatus as $row) { $newRow = array(); foreach ($selectedFields as $fieldName) { $newRow[$fieldName] = $row[$fieldName]; } $arResult[] = $newRow; } } } return $arResult; }
protected function internalizeFilterFields(&$filter, &$fieldsInfo) { if (!is_array($filter)) { return; } foreach ($filter as $k => $v) { $operationInfo = CSqlUtil::GetFilterOperation($k); $fieldName = $operationInfo['FIELD']; $info = isset($fieldsInfo[$fieldName]) ? $fieldsInfo[$fieldName] : null; if (!$info) { unset($filter[$k]); continue; } $operation = substr($k, 0, strlen($k) - strlen($fieldName)); if (isset($info['FORBIDDEN_FILTERS']) && is_array($info['FORBIDDEN_FILTERS']) && in_array($operation, $info['FORBIDDEN_FILTERS'], true)) { unset($filter[$k]); continue; } $fieldType = isset($info['TYPE']) ? $info['TYPE'] : ''; if (($fieldType === 'crm_status' || $fieldType === 'crm_company' || $fieldType === 'crm_contact') && ($operation === '%' || $operation === '%=' || $operation === '=%')) { //Prevent filtration by LIKE due to performance considerations $filter["={$fieldName}"] = $v; unset($filter[$k]); continue; } if ($fieldType === 'datetime') { $filter[$k] = CRestUtil::unConvertDateTime($v); } elseif ($fieldType === 'date') { $filter[$k] = CRestUtil::unConvertDate($v); } } CCrmEntityHelper::PrepareMultiFieldFilter($filter, array(), '=%', true); }