• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/mysql/iblocksection.php
  • Класс: CIBlockSection
  • Вызов: CIBlockSection::UpdateList
protected function UpdateList($arFields, $arFilter = array())
{
	global $DB, $USER;

	$strUpdate = $DB->PrepareUpdate("b_iblock_section", $arFields, "iblock", false, "BS");
	if ($strUpdate == "")
		return false;

	if(isset($arFilter["IBLOCK_ID"]) && $arFilter["IBLOCK_ID"] > 0)
	{
		$obUserFieldsSql = new CUserTypeSQL;
		$obUserFieldsSql->SetEntity("IBLOCK_".$arFilter["IBLOCK_ID"]."_SECTION", "BS.ID");
		$obUserFieldsSql->SetFilter($arFilter);
	}
	else
	{
		foreach($arFilter as $key => $val)
		{
			$res = CIBlock::MkOperationFilter($key);
			if(preg_match("/^UF_/", $res["FIELD"]))
			{
				trigger_error("arFilter parameter of the CIBlockSection::GetList contains user fields, but has no IBLOCK_ID field.", E_USER_WARNING);
				break;
			}
		}
	}

	$arJoinProps = array();
	$bJoinFlatProp = false;

	$arSqlSearch = CIBlockSection::GetFilter($arFilter);

	$bCheckPermissions = !array_key_exists("CHECK_PERMISSIONS", $arFilter) || $arFilter["CHECK_PERMISSIONS"]!=="N";
	$bIsAdmin = is_object($USER) && $USER->IsAdmin();
	$permissionsBy = null;
	if ($bCheckPermissions && isset($arFilter['PERMISSIONS_BY']))
	{
		$permissionsBy = (int)$arFilter['PERMISSIONS_BY'];
		if ($permissionsBy < 0)
			$permissionsBy = null;
	}
	if($bCheckPermissions && ($permissionsBy !== null || !$bIsAdmin))
	{
		$arFilter["MIN_PERMISSION"] ??= CIBlockRights::PUBLIC_READ;
		$arSqlSearch[] = self::_check_rights_sql($arFilter["MIN_PERMISSION"], $permissionsBy);
	}
	unset($permissionsBy);

	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.") ";

	if(isset($obUserFieldsSql))
	{
		$r = $obUserFieldsSql->GetFilter();
		if($r <> '')
			$strSqlSearch .= "nttttAND (".$r.") ";
	}

	$strProp1 = "";
	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"];
		$strProp1 .= "
			LEFT JOIN b_iblock_property FP".$i." ON FP".$i.".IBLOCK_ID=B.ID AND
			".((int)$propID>0?" FP".$i.".ID=".(int)$propID." ":" FP".$i.".CODE='".$DB->ForSQL($propID, 200)."' ")."
			LEFT JOIN ".$strTable." FPV".$i." ON FP".$i.".ID=FPV".$i.".IBLOCK_PROPERTY_ID AND FPV".$i.".IBLOCK_ELEMENT_ID=BE.ID ";
	}
	if($bJoinFlatProp)
		$strProp1 .= "
			LEFT JOIN b_iblock_element_prop_s".$bJoinFlatProp." FPS ON FPS.IBLOCK_ELEMENT_ID = BE.ID
		";

	$strSql = "
		UPDATE
		b_iblock_section BS
			INNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID
			".(isset($obUserFieldsSql)? $obUserFieldsSql->GetJoin("BS.ID"): "")."
		".($strProp1 <> ''?
			"	INNER JOIN b_iblock_section BSTEMP ON BSTEMP.IBLOCK_ID = BS.IBLOCK_ID
				LEFT JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID
				LEFT JOIN b_iblock_element BE ON (BSE.IBLOCK_ELEMENT_ID=BE.ID
					AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )
					AND BE.IBLOCK_ID = BS.IBLOCK_ID
			".($arFilter["CNT_ALL"]=="Y"?" OR BE.WF_NEW='Y' ":"").")
			".($arFilter["CNT_ACTIVE"]=="Y"?
				" 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)"
			:"").")
				".$strProp1." "
		:"")."
		SET ".$strUpdate."
		WHERE 1=1
		".($strProp1 <> ''?
			"	AND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN
				AND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN "
		:""
		)."
		".$strSqlSearch."
	";

	return $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__); }