• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::MkPropertyFilter
public function MkPropertyFilter($res, $cOperationType, $propVAL, $db_prop, &$arJoinProps, &$arSqlSearch)
{
	global $DB;

	if($res["OPERATION"]!="E")
		$cOperationType = $res["OPERATION"];

	//Tables counters
	if($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"]=="N")
	{
		if(!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"]))
			$iPropCnt = count($arJoinProps["FPS"]);
		else
			$iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]];
	}
	else
	{
		if(!array_key_exists($db_prop["ID"], $arJoinProps["FPV"]))
			$iPropCnt = count($arJoinProps["FPV"]);
		else
			$iPropCnt = $arJoinProps["FPV"][$db_prop["ID"]]["CNT"];
	}

	if(!is_array($res["FIELD"]) && (mb_substr(mb_strtoupper($res["FIELD"]), -6) == '_VALUE'))
		$bValueEnum = true;
	else
		$bValueEnum = false;

	if($db_prop["PROPERTY_TYPE"] == "L" && $bValueEnum)
	{
		if(!array_key_exists($db_prop["ID"], $arJoinProps["FPEN"]))
			$iFpenCnt = count($arJoinProps["FPEN"]);
		else
			$iFpenCnt = $arJoinProps["FPEN"][$db_prop["ID"]]["CNT"];
	}
	else
	{
		$iFpenCnt = false;
	}

	if(is_array($res["FIELD"]))
	{
		if(!array_key_exists($db_prop["ID"], $arJoinProps["BE"]))
			$iElCnt = count($arJoinProps["BE"]);
		else
			$iElCnt = $arJoinProps["BE"][$db_prop["ID"]]["CNT"];
	}
	else
	{
		$iElCnt = false;
	}

	$bFullJoin = false;
	$r = "";

	if(is_array($res["FIELD"]))
	{
		switch($res["FIELD"][2]."")
		{
		case "ACTIVE":
		case "DETAIL_TEXT_TYPE":
		case "PREVIEW_TEXT_TYPE":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".".$res["FIELD"][2], $propVAL, "string_equal", $bFullJoinTmp, $cOperationType);
			break;
		case "EXTERNAL_ID":
			$res["FIELD"][2] = "XML_ID";
		case "NAME":
		case "XML_ID":
		case "TMP_ID":
		case "DETAIL_TEXT":
		case "SEARCHABLE_CONTENT":
		case "PREVIEW_TEXT":
		case "CODE":
		case "TAGS":
		case "WF_COMMENTS":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".".$res["FIELD"][2], $propVAL, "string", $bFullJoinTmp, $cOperationType);
			break;
		case "ID":
		case "SHOW_COUNTER":
		case "WF_PARENT_ELEMENT_ID":
		case "WF_STATUS_ID":
		case "SORT":
		case "CREATED_BY":
		case "MODIFIED_BY":
		case "PREVIEW_PICTURE":
		case "DETAIL_PICTURE":
		case "IBLOCK_ID":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".".$res["FIELD"][2], $propVAL, "number", $bFullJoinTmp, $cOperationType);
			break;
		case "TIMESTAMP_X":
		case "DATE_CREATE":
		case "SHOW_COUNTER_START":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".".$res["FIELD"][2], $propVAL, "date", $bFullJoinTmp, $cOperationType);
			break;
		case "DATE_ACTIVE_FROM":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".ACTIVE_FROM", $propVAL, "date", $bFullJoinTmp, $cOperationType);
			break;
		case "DATE_ACTIVE_TO":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".ACTIVE_TO", $propVAL, "date", $bFullJoinTmp, $cOperationType);
			break;
		case "ACTIVE_FROM":
			if($propVAL <> '')
				$r = "(BE".$iElCnt.".ACTIVE_FROM ".($cOperationType=="N"?"<":">=").$DB->CharToDateFunction($DB->ForSql($propVAL), "FULL").($cOperationType=="N"?"":" OR BE".$iElCnt.".ACTIVE_FROM IS NULL").")";
			break;
		case "ACTIVE_TO":
			if($propVAL <> '')
				$r = "(BE".$iElCnt.".ACTIVE_TO ".($cOperationType=="N"?">":"<=").$DB->CharToDateFunction($DB->ForSql($propVAL), "FULL").($cOperationType=="N"?"":" OR BE".$iElCnt.".ACTIVE_TO IS NULL").")";
			break;
		case "ACTIVE_DATE":
			if($propVAL <> '')
				$r = ($cOperationType=="N"?" NOT":"")."((BE".$iElCnt.".ACTIVE_TO >= ".$DB->GetNowFunction()." OR BE".$iElCnt.".ACTIVE_TO IS NULL) AND (BE".$iElCnt.".ACTIVE_FROM <= ".$DB->GetNowFunction()." OR BE".$iElCnt.".ACTIVE_FROM IS NULL))";
			break;
		case "DATE_MODIFY_FROM":
			if($propVAL <> '')
				$r = "(BE".$iElCnt.".TIMESTAMP_X ".
					( $cOperationType=="N" ? "<" : ">=" ).$DB->CharToDateFunction($DB->ForSql($propVAL), "FULL").
					( $cOperationType=="N" ? ""  : " OR BE".$iElCnt.".TIMESTAMP_X IS NULL").")";
			break;
		case "DATE_MODIFY_TO":
			if($propVAL <> '')
				$r = "(BE".$iElCnt.".TIMESTAMP_X ".
					( $cOperationType=="N" ? ">" : "<=" ).$DB->CharToDateFunction($DB->ForSql($propVAL), "FULL").
					( $cOperationType=="N" ? ""  : " OR BE".$iElCnt.".TIMESTAMP_X IS NULL").")";
			break;
		case "MODIFIED_USER_ID":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".MODIFIED_BY", $propVAL, "number", $bFullJoinTmp, $cOperationType);
			break;
		case "CREATED_USER_ID":
			$r = CIBlock::FilterCreateEx("BE".$iElCnt.".CREATED_BY", $propVAL, "number", $bFullJoinTmp, $cOperationType);
			break;
		}
	}
	else
	{
		if(!is_array($propVAL))
			$propVAL = array($propVAL);

		if($db_prop["PROPERTY_TYPE"]=="L")
		{
			if($bValueEnum)
				$r = CIBlock::FilterCreateEx("FPEN".$iFpenCnt.".VALUE", $propVAL, "string", $bFullJoin, $cOperationType);
			elseif($db_prop["VERSION"]==2 && $db_prop["MULTIPLE"]=="N")
				$r = CIBlock::FilterCreateEx("FPS".$iPropCnt.".PROPERTY_".$db_prop["ORIG_ID"], $propVAL, "number", $bFullJoin, $cOperationType);
			else
				$r = CIBlock::FilterCreateEx("FPV".$iPropCnt.".VALUE_ENUM", $propVAL, "number", $bFullJoin, $cOperationType);
		}
		elseif($db_prop["PROPERTY_TYPE"]=="N" || $db_prop["PROPERTY_TYPE"]=="G" || $db_prop["PROPERTY_TYPE"]=="E")
		{
			if($db_prop["VERSION"]==2 && $db_prop["MULTIPLE"]=="N")
				$r = CIBlock::FilterCreateEx("FPS".$iPropCnt.".PROPERTY_".$db_prop["ORIG_ID"], $propVAL, "number", $bFullJoin, $cOperationType);
			else
				$r = CIBlock::FilterCreateEx("FPV".$iPropCnt.".VALUE_NUM", $propVAL, "number", $bFullJoin, $cOperationType);
		}
		else
		{
			if($db_prop["VERSION"]==2 && $db_prop["MULTIPLE"]=="N")
				$r = CIBlock::FilterCreateEx("FPS".$iPropCnt.".PROPERTY_".$db_prop["ORIG_ID"], $propVAL, "string", $bFullJoin, $cOperationType);
			else
				$r = CIBlock::FilterCreateEx("FPV".$iPropCnt.".VALUE", $propVAL, "string", $bFullJoin, $cOperationType);
		}
	}

	if($r <> '')
	{
		if($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"]=="N")
		{
			if(!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"]))
				$arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = $iPropCnt;
		}
		else
		{
			if(!array_key_exists($db_prop["ID"], $arJoinProps["FP"]))
				$arJoinProps["FP"][$db_prop["ID"]] = array(
					"CNT" => count($arJoinProps["FP"]),
					"bFullJoin" => false,
				);

			if (isset($res["LEFT_JOIN"]) && $res["LEFT_JOIN"])
			{
				$arJoinProps["FP"][$db_prop["ID"]]["bFullJoin"] &= $bFullJoin;
			}
			else
			{
				$arJoinProps["FP"][$db_prop["ID"]]["bFullJoin"] |= $bFullJoin;
			}

			if(!array_key_exists($db_prop["ID"], $arJoinProps["FPV"]))
				$arJoinProps["FPV"][$db_prop["ID"]] = array(
					"CNT" => $iPropCnt,
					"IBLOCK_ID" => $db_prop["IBLOCK_ID"],
					"MULTIPLE" => $db_prop["MULTIPLE"],
					"VERSION" => $db_prop["VERSION"],
					"JOIN" => $arJoinProps["FP"][$db_prop["ID"]]["CNT"],
					"bFullJoin" => false,
				);

			if(isset($res["LEFT_JOIN"]) && $res["LEFT_JOIN"])
			{
				$arJoinProps["FPV"][$db_prop["ID"]]["bFullJoin"] &= $bFullJoin;
			}
			else
			{
				$arJoinProps["FPV"][$db_prop["ID"]]["bFullJoin"] |= $bFullJoin;
			}
		}

		if($db_prop["PROPERTY_TYPE"]=="L" && $bValueEnum)
		{
			if(!array_key_exists($db_prop["ID"], $arJoinProps["FPEN"]))
				$arJoinProps["FPEN"][$db_prop["ID"]] = array(
					"CNT" => $iFpenCnt,
					"MULTIPLE" => $db_prop["MULTIPLE"],
					"VERSION" => $db_prop["VERSION"],
					"ORIG_ID" => $db_prop["ORIG_ID"],
					"JOIN" => $iPropCnt,
					"bFullJoin" => false,
				);

			if(isset($res["LEFT_JOIN"]) && $res["LEFT_JOIN"])
				$arJoinProps["FPEN"][$db_prop["ID"]]["bFullJoin"] &= $bFullJoin;
			else
				$arJoinProps["FPEN"][$db_prop["ID"]]["bFullJoin"] |= $bFullJoin;
		}

		if(is_array($res["FIELD"]))
		{
			if(!array_key_exists($db_prop["ID"], $arJoinProps["BE"]))
				$arJoinProps["BE"][$db_prop["ID"]] = array(
					"CNT" => $iElCnt,
					"MULTIPLE" => $db_prop["MULTIPLE"],
					"VERSION" => $db_prop["VERSION"],
					"ORIG_ID" => $db_prop["ORIG_ID"],
					"JOIN" => $iPropCnt,
					"bJoinIBlock" => false,
					"bJoinSection" => false,
				);
		}

		$arSqlSearch[] = $r;
	}
}