/** * SQL-запрос, соответствующий кастомной логике для фильтров * * @return string */ public function getSQL_customFilters() { $sSQL = <<<SQL \t\t\tSELECT `coc`.`obj_id` \t\t\tFROM `{$this->sContentTable}` AS `coc` \t\t\tWHERE 1 SQL; $arCustomFilters = $this->customLogic->filters(); if (empty($arCustomFilters)) { return ""; } $oType = umiObjectTypesCollection::getInstance()->getType($this->objectsTypeId); if (!$oType) { return ""; } foreach ($arCustomFilters as $i => $arCustomFilter) { $iFieldId = $oType->getFieldId($arCustomFilter[0]); $sCustomOperator = $arCustomFilter[1]; $sOperator = ""; $sValue = $arCustomFilter[2]; switch ($sCustomOperator) { case "eq": $sOperator = "IN"; $sValue = is_array($sValue) ? join("','", $sValue) : $sValue; $sValue = "('" . $sValue . "')"; break; case "noteq": $sOperator = "NOT IN"; $sValue = is_array($sValue) ? join("','", $sValue) : $sValue; $sValue = "('" . $sValue . "')"; break; case "null": $sOperator = "IS"; $sValue = "NULL"; break; case "notnull": $sOperator = "IS NOT"; $sValue = "NULL"; break; case "gt": $sOperator = ">="; $sValue = trim($sValue); break; case "lt": $sOperator = "<="; $sValue = trim($sValue); break; case "like": $sOperator = "LIKE"; break; } $oField = umiFieldsCollection::getField($iFieldId); if (!$oField) { continue; } $sColumn = umiFieldType::getDataTypeDB($oField->getFieldType()->getDataType()); if (!$sColumn) { continue; } $sCustomExpression = "{$sColumn} {$sOperator} {$sValue}"; if (in_array($sColumn, array("int_val", "float_val", "rel_val", "tree_val")) && $sValue == 0) { $sCustomExpression = "({$sCustomExpression} OR {$sColumn} IS NULL)"; } $sSQL .= " AND `coc`.`obj_id` IN (SELECT `coc{$i}`.`obj_id` FROM `{$this->sContentTable}` AS `coc{$i}` WHERE `coc{$i}`.`field_id` = {$iFieldId} AND {$sCustomExpression})"; } return $sSQL; }