Esempio n. 1
0
 /**
  * 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;
 }