예제 #1
0
    /**
     * 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;
    }