• Модуль: 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); }