• Модуль: ldap
  • Путь к файлу: ~/bitrix/modules/ldap/classes/general/ldap_util.php
  • Класс: CLdapUtil
  • Вызов: CLdapUtil::FilterCreateEx
static function FilterCreateEx($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, $c=count($vals); $i < $c; $i++)
	{
		$val = $vals[$i];
		if(!$bSkipEmpty || $val <> '' || (is_bool($val) && $val===false))
		{
			switch ($type)
			{
			case "string_equal":
				if($cOperationType=="?")
				{
					if($val <> '')
						$res[] = GetFilterQuery($fname, $val, "N");
				}
				else
				{
					if($val == '')
						$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
					else
						$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".CLdapUtil::_Upper($fname).$strOperation.CLdapUtil::_Upper("'".$DB->ForSql($val)."'").")";
				}
				break;
			case "string":
				if($cOperationType=="?")
				{
					if($val <> '')
					{
						$sr = GetFilterQuery($fname, $val, "Y", array(), "N");
						if($sr != "0")
							$res[] = $sr;
					}
				}
				else
				{
					if($val == '')
						$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
					else
						if($strOperation=="=")
							$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type=="ORACLE"?CLdapUtil::_Upper($fname)." LIKE ".CLdapUtil::_Upper("'".$DB->ForSqlLike($val)."'")." ESCAPE '\'" : $fname." ".($strOperation=="="?"LIKE":$strOperation)." '".$DB->ForSqlLike($val)."'").")";
						else
							$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type=="ORACLE"?CLdapUtil::_Upper($fname)." ".$strOperation." ".CLdapUtil::_Upper("'".$DB->ForSql($val)."'")." " : $fname." ".$strOperation." '".$DB->ForSql($val)."'").")";
				}
				break;
			case "date":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
				break;
			case "number":
				if($cOperationType=="?")
				{
					$res[] = GetFilterQuery($fname, $val);
				}
				else
				{
					if($val == '')
						$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
					else
						$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".DoubleVal($val)."')";
				}
				break;
			case "number_above":
				if($val == '')
					$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
				else
					$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".$DB->ForSql($val)."')";
				break;
			}

			// we need this conditions to do INNER JOIN
			if($val <> '' && $cOperationType!="N")
				$bFullJoin = true;
			else
				$bWasLeftJoin = true;
		}
	}

	$strResult = "";
	for($i=0, $c=count($res); $i < $c; $i++)
	{
		if($i>0)
			$strResult .= ($cOperationType=="N"?" AND ":" OR ");
		$strResult .= "(".$res[$i].")";
	}
	if($strResult!="")
		$strResult = "(".$strResult.")";

	if($bFullJoin && $bWasLeftJoin && $cOperationType!="N")
		$bFullJoin = false;

	return $strResult;
}