- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
- Класс: CAllIBlockSection
- Вызов: CAllIBlockSection::GetSectionElementsCount
static function GetSectionElementsCount($ID, $arFilter=Array())
{
global $DB;
$arJoinProps = array();
$bJoinFlatProp = false;
$arSqlSearch = array();
if(array_key_exists("PROPERTY", $arFilter))
{
$val = $arFilter["PROPERTY"];
foreach($val as $propID=>$propVAL)
{
$res = CIBlock::MkOperationFilter($propID);
$propID = $res["FIELD"];
$cOperationType = $res["OPERATION"];
if($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"])))
{
$bSave = false;
if(array_key_exists($db_prop["ID"], $arJoinProps))
$iPropCnt = $arJoinProps[$db_prop["ID"]];
elseif($db_prop["VERSION"]!=2 || $db_prop["MULTIPLE"]=="Y")
{
$bSave = true;
$iPropCnt=count($arJoinProps);
}
if(!is_array($propVAL))
$propVAL = Array($propVAL);
if($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::FilterCreate("FPS.PROPERTY_".$db_prop["ORIG_ID"], $propVAL, "number", $cOperationType);
$bJoinFlatProp = $db_prop["IBLOCK_ID"];
}
else
$r = CIBlock::FilterCreate("FPV".$iPropCnt.".VALUE_NUM", $propVAL, "number", $cOperationType);
}
else
{
if($db_prop["VERSION"]==2 && $db_prop["MULTIPLE"]=="N")
{
$r = CIBlock::FilterCreate("FPS.PROPERTY_".$db_prop["ORIG_ID"], $propVAL, "string", $cOperationType);
$bJoinFlatProp = $db_prop["IBLOCK_ID"];
}
else
$r = CIBlock::FilterCreate("FPV".$iPropCnt.".VALUE", $propVAL, "string", $cOperationType);
}
if($r <> '')
{
if($bSave)
{
$db_prop["iPropCnt"] = $iPropCnt;
$arJoinProps[$db_prop["ID"]] = $db_prop;
}
$arSqlSearch[] = $r;
}
}
}
}
$strSqlSearch = "";
foreach($arSqlSearch as $r)
if($r <> '')
$strSqlSearch .= "nttttAND (".$r.") ";
$strSqlSearchProp = "";
foreach($arJoinProps as $propID=>$db_prop)
{
if($db_prop["VERSION"]==2)
$strTable = "b_iblock_element_prop_m".$db_prop["IBLOCK_ID"];
else
$strTable = "b_iblock_element_property";
$i = $db_prop["iPropCnt"];
$strSqlSearchProp .= "
INNER JOIN b_iblock_property FP".$i." ON FP".$i.".IBLOCK_ID=BS.IBLOCK_ID AND
".(intval($propID)>0?" FP".$i.".ID=".intval($propID)." ":" FP".$i.".CODE='".$DB->ForSQL($propID, 200)."' ")."
INNER JOIN ".$strTable." FPV".$i." ON FP".$i.".ID=FPV".$i.".IBLOCK_PROPERTY_ID AND FPV".$i.".IBLOCK_ELEMENT_ID=BE.ID
";
}
if($bJoinFlatProp)
$strSqlSearchProp .= "
INNER JOIN b_iblock_element_prop_s".$bJoinFlatProp." FPS ON FPS.IBLOCK_ELEMENT_ID = BE.ID
";
$allElements = (isset($arFilter['CNT_ALL']) && $arFilter['CNT_ALL'] == 'Y');
$activeElements = (isset($arFilter['CNT_ACTIVE']) && $arFilter['CNT_ACTIVE'] == 'Y');
$strHint = $DB->type=="MYSQL"?"STRAIGHT_JOIN":"";
$strSql = "
SELECT ".$strHint." COUNT(DISTINCT BE.ID) as CNT
FROM b_iblock_section BS
INNER JOIN b_iblock_section BSTEMP ON (BSTEMP.IBLOCK_ID=BS.IBLOCK_ID
AND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN
AND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN)
INNER JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID
INNER JOIN b_iblock_element BE ON BE.ID=BSE.IBLOCK_ELEMENT_ID AND BE.IBLOCK_ID=BS.IBLOCK_ID
".$strSqlSearchProp."
WHERE BS.ID=".intval($ID)."
AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )
".($allElements ?" OR BE.WF_NEW='Y' ":"").")
".($activeElements ?
" AND BE.ACTIVE='Y'
AND (BE.ACTIVE_TO >= ".$DB->CurrentTimeFunction()." OR BE.ACTIVE_TO IS NULL)
AND (BE.ACTIVE_FROM <= ".$DB->CurrentTimeFunction()." OR BE.ACTIVE_FROM IS NULL)"
:"")."
".$strSqlSearch;
//echo "",htmlspecialcharsbx($strSql),"
";
$res = $DB->Query($strSql);
$res = $res->Fetch();
return (int)($res['CNT'] ?? 0);
}