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;
}
}