/** * This code writed not by me, but I rely on it in good state */ public static function FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType = false, $bSkipEmpty = true) { global $DB; if (!is_array($vals)) { $vals = array($vals); } if (count($vals) < 1) { return ""; } if (is_bool($cOperationType)) { if ($cOperationType === true) { $cOperationType = "N"; } else { $cOperationType = "E"; } } if ($cOperationType == "G") { $strOperation = ">"; } elseif ($cOperationType == "GE") { $strOperation = ">="; } elseif ($cOperationType == "LE") { $strOperation = "<="; } elseif ($cOperationType == "L") { $strOperation = "<"; } else { $strOperation = "="; } $bFullJoin = false; $bWasLeftJoin = false; $res = array(); for ($i = 0; $i < count($vals); $i++) { $val = $vals[$i]; if (!$bSkipEmpty || strlen($val) > 0 || is_bool($val) && $val === false) { switch ($type) { case "string_equal": if (strlen($val) <= 0) { $res[] = ($cOperationType == "N" ? "NOT" : "") . "(" . $fname . " IS NULL OR " . $DB->Length($fname) . "<=0)"; } else { $res[] = "(" . ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT (" : "") . CCourse::_Upper($fname) . $strOperation . CCourse::_Upper("'" . $DB->ForSql($val) . "'") . ($cOperationType == "N" ? ")" : "") . ")"; } break; case "string": if ($cOperationType == "?") { if (strlen($val) > 0) { $res[] = GetFilterQuery($fname, $val, "Y", array(), "N"); } } elseif (strlen($val) <= 0) { $res[] = ($cOperationType == "N" ? "NOT" : "") . "(" . $fname . " IS NULL OR " . $DB->Length($fname) . "<=0)"; } else { if ($strOperation == "=") { $res[] = "(" . ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT (" : "") . (strtoupper($DB->type) == "ORACLE" ? CCourse::_Upper($fname) . " LIKE " . CCourse::_Upper("'" . $DB->ForSqlLike($val) . "'") . " ESCAPE '\\'" : $fname . " " . ($strOperation == "=" ? "LIKE" : $strOperation) . " '" . $DB->ForSqlLike($val) . "'") . ($cOperationType == "N" ? ")" : "") . ")"; } else { $res[] = "(" . ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT (" : "") . (strtoupper($DB->type) == "ORACLE" ? CCourse::_Upper($fname) . " " . $strOperation . " " . CCourse::_Upper("'" . $DB->ForSql($val) . "'") . " " : $fname . " " . $strOperation . " '" . $DB->ForSql($val) . "'") . ($cOperationType == "N" ? ")" : "") . ")"; } } break; case "date": if (strlen($val) <= 0) { $res[] = ($cOperationType == "N" ? "NOT" : "") . "(" . $fname . " IS NULL)"; } else { $res[] = "(" . ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT (" : "") . $fname . " " . $strOperation . " " . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? ")" : "") . ")"; } break; case "number": if (strlen($val) <= 0) { $res[] = ($cOperationType == "N" ? "NOT" : "") . "(" . $fname . " IS NULL)"; } else { $res[] = "(" . ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT (" : "") . $fname . " " . $strOperation . " '" . DoubleVal($val) . ($cOperationType == "N" ? "')" : "'") . ")"; } break; /* case "number_above": if(strlen($val)<=0) $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)"; else $res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".$DB->ForSql($val)."')"; break; */ } // INNER JOIN in this case if (strlen($val) > 0 && $cOperationType != "N") { $bFullJoin = true; } else { $bWasLeftJoin = true; } } } $strResult = ""; for ($i = 0; $i < count($res); $i++) { if ($i > 0) { $strResult .= $cOperationType == "N" ? " AND " : " OR "; } $strResult .= $res[$i]; } if (count($res) > 1) { $strResult = "(" . $strResult . ")"; } if ($bFullJoin && $bWasLeftJoin && $cOperationType != "N") { $bFullJoin = false; } return $strResult; }