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