24 $this->iblockLanguage =
null;
28 $this->currentDateTimeFunction = $helper->getCurrentDateTimeFunction();
46 $language = static::getIblockLanguage(
$iblock[
'ID']);
50 $this->iblockLanguage = $language;
56 $arIBlockFilter = Array();
57 $arSqlSearch = Array();
61 $res = CIBlock::MkOperationFilter(
$key);
63 $cOperationType =
$res[
"OPERATION"];
70 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.".
$key,
$val,
"string_equal", $cOperationType);
73 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.ACTIVE",
$val,
"string_equal", $cOperationType);
77 $str = CIBlock::FilterCreate(
"BS.SITE_ID",
$val,
"string_equal", $cOperationType);
80 $arIBlockFilter[] =
$str;
85 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.NAME",
$val,
"string", $cOperationType);
87 case "IBLOCK_EXTERNAL_ID":
89 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.XML_ID",
$val,
"string", $cOperationType);
92 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.IBLOCK_TYPE_ID",
$val,
"string", $cOperationType);
96 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.".
$key,
$val,
"date", $cOperationType);
99 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.CODE",
$val,
"string", $cOperationType);
102 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.".
$key,
$val,
"number", $cOperationType);
103 $arIBlockFilter[] = CIBlock::FilterCreate(
"B.ID",
$val,
"number", $cOperationType);
109 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.".
$key,
$val,
"string", $cOperationType);
112 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.XML_ID",
$val,
"string", $cOperationType);
118 case "SOCNET_GROUP_ID":
120 case "DETAIL_PICTURE":
121 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.".
$key,
$val,
"number", $cOperationType);
125 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.IBLOCK_SECTION_ID",
"",
"number", $cOperationType,
false);
127 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.IBLOCK_SECTION_ID",
$val,
"number", $cOperationType);
130 $arSqlSearch[] =
"BS.RIGHT_MARGIN ".($cOperationType==
"N"?
">":
"<=").(
int)
$val;
133 $arSqlSearch[] =
"BS.LEFT_MARGIN ".($cOperationType==
"N"?
"<":
">=").(
int)
$val;
136 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.LEFT_MARGIN",
$val,
"number", $cOperationType);
139 $arSqlSearch[] = CIBlock::FilterCreate(
"BS.RIGHT_MARGIN",
$val,
"number", $cOperationType);
142 $arSqlSearch[] =
"EXISTS (
144 FROM b_iblock_section BS1
145 INNER JOIN b_iblock_section_element BSE1 ON BSE1.IBLOCK_SECTION_ID = BS1.ID
146 AND BSE1.ADDITIONAL_PROPERTY_ID IS NULL
147 INNER JOIN b_iblock_element BE1 ON BE1.ID = BSE1.IBLOCK_ELEMENT_ID
148 WHERE BE1.ID = ".intval(
$val).
"
149 AND BS1.LEFT_MARGIN >= BS.LEFT_MARGIN
150 AND BS1.RIGHT_MARGIN <= BS.RIGHT_MARGIN
156 static $IBlockFilter_cache =
array();
159 if(is_array($arIBlockFilter) &&
count($arIBlockFilter)>0)
162 foreach($arIBlockFilter as
$val)
164 $sIBlockFilter .=
" AND ".$val;
166 if(!array_key_exists($sIBlockFilter, $IBlockFilter_cache))
169 "SELECT DISTINCT B.ID ".
170 "FROM b_iblock B, b_iblock_site BS ".
171 "WHERE B.ID = BS.IBLOCK_ID ".
174 $arIBLOCKFilter =
array();
177 $arIBLOCKFilter[] =
$arRes[
"ID"];
178 $IBlockFilter_cache[$sIBlockFilter] = $arIBLOCKFilter;
182 $arIBLOCKFilter = $IBlockFilter_cache[$sIBlockFilter];
185 if(
count($arIBLOCKFilter) > 0)
186 $arSqlSearch[] =
"B.ID IN (".implode(
", ", $arIBLOCKFilter).
") ";
191 foreach($arIBlockFilter as
$val)
193 $arSqlSearch[] =
$val;
201 return CIBlockSection::GetList(
array(
"left_margin"=>
"asc"),
$arFilter,
false, $arSelect);
208 $arrayResult = ($arrayResult ===
true);
215 "XML_ID" =>
"BS.XML_ID",
216 "EXTERNAL_ID" =>
"BS.XML_ID",
217 "IBLOCK_ID" =>
"BS.IBLOCK_ID",
218 "IBLOCK_SECTION_ID" =>
"BS.IBLOCK_SECTION_ID",
221 "ACTIVE" =>
"BS.ACTIVE",
222 "GLOBAL_ACTIVE" =>
"BS.GLOBAL_ACTIVE",
223 "PICTURE" =>
"BS.PICTURE",
224 "DESCRIPTION" =>
"BS.DESCRIPTION",
225 "DESCRIPTION_TYPE" =>
"BS.DESCRIPTION_TYPE",
226 "LEFT_MARGIN" =>
"BS.LEFT_MARGIN",
227 "RIGHT_MARGIN" =>
"BS.RIGHT_MARGIN",
228 "DEPTH_LEVEL" =>
"BS.DEPTH_LEVEL",
229 "SEARCHABLE_CONTENT" =>
"BS.SEARCHABLE_CONTENT",
230 "MODIFIED_BY" =>
"BS.MODIFIED_BY",
231 "CREATED_BY" =>
"BS.CREATED_BY",
232 "DETAIL_PICTURE" =>
"BS.DETAIL_PICTURE",
233 "TMP_ID" =>
"BS.TMP_ID",
235 "LIST_PAGE_URL" =>
"B.LIST_PAGE_URL",
236 "SECTION_PAGE_URL" =>
"B.SECTION_PAGE_URL",
237 "IBLOCK_TYPE_ID" =>
"B.IBLOCK_TYPE_ID",
238 "IBLOCK_CODE" =>
"B.CODE",
239 "IBLOCK_EXTERNAL_ID" =>
"B.XML_ID",
240 "SOCNET_GROUP_ID" =>
"BS.SOCNET_GROUP_ID",
243 $arSqlSelect =
array();
244 foreach($arSelect as $field)
246 $field = mb_strtoupper($field);
248 $arSqlSelect[$field] =
$arFields[$field].
" AS ".$field;
251 if (isset($arSqlSelect[
"DESCRIPTION"]))
252 $arSqlSelect[
"DESCRIPTION_TYPE"] =
$arFields[
"DESCRIPTION_TYPE"].
" AS DESCRIPTION_TYPE";
254 if (isset($arSqlSelect[
"LIST_PAGE_URL"]) || isset($arSqlSelect[
"SECTION_PAGE_URL"]))
256 $arSqlSelect[
"ID"] =
$arFields[
"ID"].
" AS ID";
257 $arSqlSelect[
"CODE"] =
$arFields[
"CODE"].
" AS CODE";
258 $arSqlSelect[
"EXTERNAL_ID"] =
$arFields[
"EXTERNAL_ID"].
" AS EXTERNAL_ID";
259 $arSqlSelect[
"IBLOCK_TYPE_ID"] =
$arFields[
"IBLOCK_TYPE_ID"].
" AS IBLOCK_TYPE_ID";
260 $arSqlSelect[
"IBLOCK_ID"] =
$arFields[
"IBLOCK_ID"].
" AS IBLOCK_ID";
261 $arSqlSelect[
"IBLOCK_CODE"] =
$arFields[
"IBLOCK_CODE"].
" AS IBLOCK_CODE";
262 $arSqlSelect[
"IBLOCK_EXTERNAL_ID"] =
$arFields[
"IBLOCK_EXTERNAL_ID"].
" AS IBLOCK_EXTERNAL_ID";
263 $arSqlSelect[
"GLOBAL_ACTIVE"] =
$arFields[
"GLOBAL_ACTIVE"].
" AS GLOBAL_ACTIVE";
267 if (!empty($arSelect))
269 $field =
"IBLOCK_SECTION_ID";
270 $arSqlSelect[$field] =
$arFields[$field].
" AS ".$field;
271 $strSelect = implode(
", ", $arSqlSelect);
280 B.CODE as IBLOCK_CODE,
281 B.XML_ID as IBLOCK_EXTERNAL_ID,
282 BS.XML_ID as EXTERNAL_ID
286 $key = md5($strSelect);
287 if (!isset(self::$arSectionNavChainCache[
$key]))
288 self::$arSectionNavChainCache[
$key] =
array();
290 $sectionPath =
array();
293 $SECTION_ID = (int)$SECTION_ID;
295 if (!isset(self::$arSectionNavChainCache[
$key][$SECTION_ID]))
297 $rsSection =
$DB->Query(
"
302 INNER JOIN b_iblock B ON B.ID = BS.IBLOCK_ID
303 WHERE BS.ID=".$SECTION_ID.
"
304 ".(
$IBLOCK_ID > 0 ?
"AND BS.IBLOCK_ID=".$IBLOCK_ID :
"").
"
306 self::$arSectionNavChainCache[
$key][$SECTION_ID] = $rsSection->Fetch();
309 if (self::$arSectionNavChainCache[
$key][$SECTION_ID])
311 $sectionPath[] = self::$arSectionNavChainCache[
$key][$SECTION_ID];
312 $SECTION_ID = self::$arSectionNavChainCache[
$key][$SECTION_ID][
"IBLOCK_SECTION_ID"];
319 while ($SECTION_ID > 0);
321 $sectionPath = array_reverse($sectionPath);
326 $res->InitFromArray($sectionPath);
328 $res->bIBlockSection =
true;
337 return CIBlockSection::GetList(Array(), Array(
"ID"=>(
int)
$ID));
343 public function Add(
$arFields, $bResort=
true, $bUpdateSearch=
true, $bResizePictures=
false)
347 if (array_key_exists(
'EXTERNAL_ID',
$arFields))
359 if ($this->iblock !==
null && $this->iblock[
'ID'] === (
int)
$arFields[
"IBLOCK_ID"])
368 if($bResizePictures && is_array(
$arIBlock))
370 $arDef =
$arIBlock[
"FIELDS"][
"SECTION_PICTURE"][
"DEFAULT_VALUE"];
373 $arDef[
"FROM_DETAIL"] ===
"Y"
375 &&
$arFields[
"DETAIL_PICTURE"][
"size"] > 0
377 $arDef[
"UPDATE_WITH_DETAIL"] ===
"Y"
382 $arNewPreview =
$arFields[
"DETAIL_PICTURE"];
383 $arNewPreview[
"COPY_FILE"] =
"Y";
384 $arNewPreview[
"description"] =
$arFields[
"PICTURE"][
"description"];
391 && $arDef[
"SCALE"] ===
"Y"
394 $arNewPicture = CIBlock::ResizePicture(
$arFields[
"PICTURE"], $arDef);
395 if(is_array($arNewPicture))
397 $arNewPicture[
"description"] =
$arFields[
"PICTURE"][
"description"];
400 elseif($arDef[
"IGNORE_ERRORS"] !==
"Y")
410 && $arDef[
"USE_WATERMARK_FILE"] ===
"Y"
421 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"PICTURE"][
"tmp_name"]));
423 copy(
$arFields[
"PICTURE"][
"tmp_name"], $tmp_name);
425 $arFields[
"PICTURE"][
"tmp_name"] = $tmp_name;
429 "name" =>
"watermark",
430 "position" => $arDef[
"WATERMARK_FILE_POSITION"],
433 "alpha_level" => 100 - min(max($arDef[
"WATERMARK_FILE_ALPHA"], 0), 100),
434 "file" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_FILE"]),
441 && $arDef[
"USE_WATERMARK_TEXT"] ===
"Y"
452 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"PICTURE"][
"tmp_name"]));
454 copy(
$arFields[
"PICTURE"][
"tmp_name"], $tmp_name);
456 $arFields[
"PICTURE"][
"tmp_name"] = $tmp_name;
460 "name" =>
"watermark",
461 "position" => $arDef[
"WATERMARK_TEXT_POSITION"],
463 "coefficient" => $arDef[
"WATERMARK_TEXT_SIZE"],
464 "text" => $arDef[
"WATERMARK_TEXT"],
465 "font" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_TEXT_FONT"]),
466 "color" => $arDef[
"WATERMARK_TEXT_COLOR"],
470 $arDef =
$arIBlock[
"FIELDS"][
"SECTION_DETAIL_PICTURE"][
"DEFAULT_VALUE"];
473 array_key_exists(
"DETAIL_PICTURE",
$arFields)
475 && $arDef[
"SCALE"] ===
"Y"
478 $arNewPicture = CIBlock::ResizePicture(
$arFields[
"DETAIL_PICTURE"], $arDef);
479 if(is_array($arNewPicture))
481 $arNewPicture[
"description"] =
$arFields[
"DETAIL_PICTURE"][
"description"];
482 $arFields[
"DETAIL_PICTURE"] = $arNewPicture;
484 elseif($arDef[
"IGNORE_ERRORS"] !==
"Y")
492 array_key_exists(
"DETAIL_PICTURE",
$arFields)
494 && $arDef[
"USE_WATERMARK_FILE"] ===
"Y"
498 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] <>
''
501 || (
$arFields[
"DETAIL_PICTURE"][
"COPY_FILE"] ==
"Y" && !
$arFields[
"DETAIL_PICTURE"][
"copy"])
505 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"]));
507 copy(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"], $tmp_name);
508 $arFields[
"DETAIL_PICTURE"][
"copy"] =
true;
509 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] = $tmp_name;
512 CIBlock::FilterPicture(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"],
array(
513 "name" =>
"watermark",
514 "position" => $arDef[
"WATERMARK_FILE_POSITION"],
517 "alpha_level" => 100 - min(max($arDef[
"WATERMARK_FILE_ALPHA"], 0), 100),
518 "file" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_FILE"]),
523 array_key_exists(
"DETAIL_PICTURE",
$arFields)
525 && $arDef[
"USE_WATERMARK_TEXT"] ===
"Y"
529 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] <>
''
532 || (
$arFields[
"DETAIL_PICTURE"][
"COPY_FILE"] ==
"Y" && !
$arFields[
"DETAIL_PICTURE"][
"copy"])
536 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"]));
538 copy(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"], $tmp_name);
539 $arFields[
"DETAIL_PICTURE"][
"copy"] =
true;
540 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] = $tmp_name;
543 CIBlock::FilterPicture(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"],
array(
544 "name" =>
"watermark",
545 "position" => $arDef[
"WATERMARK_TEXT_POSITION"],
547 "coefficient" => $arDef[
"WATERMARK_TEXT_SIZE"],
548 "text" => $arDef[
"WATERMARK_TEXT"],
549 "font" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_TEXT_FONT"]),
550 "color" => $arDef[
"WATERMARK_TEXT_COLOR"],
555 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates(
$arFields[
"IBLOCK_ID"], 0);
556 if (array_key_exists(
"PICTURE",
$arFields))
563 (
$arFields[
"PICTURE"][
"name"] ??
'') ===
''
564 && (
$arFields[
"PICTURE"][
"del"] ??
'') ===
''
571 $arFields[
"PICTURE"][
"MODULE_ID"] =
"iblock";
576 ,
"SECTION_PICTURE_FILE_NAME"
584 if (array_key_exists(
"DETAIL_PICTURE",
$arFields))
586 if (!is_array(
$arFields[
"DETAIL_PICTURE"]))
591 (
$arFields[
"DETAIL_PICTURE"][
"name"] ??
'') ===
''
592 && (
$arFields[
"DETAIL_PICTURE"][
"del"] ??
'') ===
''
599 $arFields[
"DETAIL_PICTURE"][
"MODULE_ID"] =
"iblock";
600 if (isset(
$arFields[
"DETAIL_PICTURE"][
"name"]))
604 ,
"SECTION_DETAIL_PICTURE_FILE_NAME"
621 if(!array_key_exists(
"DESCRIPTION_TYPE",
$arFields) ||
$arFields[
"DESCRIPTION_TYPE"]!=
"html")
640 $user_id = intval(
$USER->GetID());
659 $this->LAST_ERROR .= str_replace(
"<br><br>",
"<br>", $err->GetString().
"<br>");
669 if(array_key_exists(
"PICTURE",
$arFields))
672 CFile::SaveForDB(
$arFields,
"PICTURE",
"iblock");
675 if(array_key_exists(
"DETAIL_PICTURE",
$arFields))
677 $SAVED_DETAIL_PICTURE =
$arFields[
"DETAIL_PICTURE"];
678 CFile::SaveForDB(
$arFields,
"DETAIL_PICTURE",
"iblock");
686 $ID = intval(
$DB->Add(
"b_iblock_section",
$arFields, Array(
"DESCRIPTION",
"SEARCHABLE_CONTENT"),
"iblock"));
690 if(array_key_exists(
"PICTURE",
$arFields))
692 if(array_key_exists(
"DETAIL_PICTURE",
$arFields))
693 $arFields[
"DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE;
706 CIBlock::GetArrayByID(
$IBLOCK_ID,
"SECTION_PROPERTY") ===
"Y"
708 && is_array(
$arFields[
"SECTION_PROPERTY"])
711 foreach(
$arFields[
"SECTION_PROPERTY"] as $PROPERTY_ID => $arLink)
713 $arLink[
'INVALIDATE'] =
'N';
714 CIBlockSectionPropertyLink::Add(
$ID, $PROPERTY_ID, $arLink);
720 if(
$arIBlock[
"FIELDS"][
"LOG_SECTION_ADD"][
"IS_REQUIRED"] ==
"Y")
722 $USER_ID = is_object(
$USER)? intval(
$USER->GetID()) : 0;
726 $rsSection = CIBlockSection::GetList(
array(),
array(
"=ID"=>
$ID),
false,
array(
"LIST_PAGE_URL",
"NAME",
"CODE"));
727 $arSection = $rsSection->GetNext();
730 "CODE" => $arSection[
"CODE"],
731 "NAME" => $arSection[
"NAME"],
732 "SECTION_NAME" =>
$arIBlock[
"SECTION_NAME"],
733 "USER_ID" => $USER_ID,
734 "IBLOCK_PAGE_URL" => $arSection[
"LIST_PAGE_URL"],
738 "IBLOCK_SECTION_ADD",
752 $obSectionRights->SetRights(
$arFields[
"RIGHTS"]);
755 if (array_key_exists(
"IPROPERTY_TEMPLATES",
$arFields))
757 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates(
$arIBlock[
"ID"],
$ID);
758 $ipropTemplates->set(
$arFields[
"IPROPERTY_TEMPLATES"]);
770 foreach (
GetModuleEvents(
"iblock",
"OnAfterIBlockSectionAdd",
true) as $arEvent)
773 CIBlock::clearIblockTagCache(
$arIBlock[
'ID']);
787 $iterator = CIBlockSection::GetList(Array(), Array(
"ID"=>
$ID,
"CHECK_PERMISSIONS"=>
"N"));
790 if (empty($db_record))
795 if (array_key_exists(
'EXTERNAL_ID',
$arFields))
811 if ($this->iblock !==
null && $this->iblock[
'ID'] === (
int)$db_record[
"IBLOCK_ID"])
817 $arIBlock = CIBlock::GetArrayByID($db_record[
"IBLOCK_ID"]);
822 $arDef =
$arIBlock[
"FIELDS"][
"SECTION_PICTURE"][
"DEFAULT_VALUE"];
825 $arDef[
"DELETE_WITH_DETAIL"] ===
"Y"
826 &&
$arFields[
"DETAIL_PICTURE"][
"del"] ===
"Y"
833 $arDef[
"FROM_DETAIL"] ===
"Y"
836 || $arDef[
"UPDATE_WITH_DETAIL"] ===
"Y"
839 &&
$arFields[
"DETAIL_PICTURE"][
"size"] > 0
844 && $arDef[
"UPDATE_WITH_DETAIL"] !==
"Y"
847 $arOldSection = $db_record;
851 $arOldSection =
false;
854 if(!$arOldSection || !$arOldSection[
"PICTURE"])
856 $arNewPreview =
$arFields[
"DETAIL_PICTURE"];
857 $arNewPreview[
"COPY_FILE"] =
"Y";
858 $arNewPreview[
"description"] =
$arFields[
"PICTURE"][
"description"];
867 && $arDef[
"SCALE"] ===
"Y"
870 $arNewPicture = CIBlock::ResizePicture(
$arFields[
"PICTURE"], $arDef);
871 if(is_array($arNewPicture))
873 $arNewPicture[
"description"] =
$arFields[
"PICTURE"][
"description"];
876 elseif($arDef[
"IGNORE_ERRORS"] !==
"Y")
886 && $arDef[
"USE_WATERMARK_FILE"] ===
"Y"
897 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"PICTURE"][
"tmp_name"]));
899 copy(
$arFields[
"PICTURE"][
"tmp_name"], $tmp_name);
901 $arFields[
"PICTURE"][
"tmp_name"] = $tmp_name;
905 "name" =>
"watermark",
906 "position" => $arDef[
"WATERMARK_FILE_POSITION"],
909 "alpha_level" => 100 - min(max($arDef[
"WATERMARK_FILE_ALPHA"], 0), 100),
910 "file" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_FILE"]),
917 && $arDef[
"USE_WATERMARK_TEXT"] ===
"Y"
928 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"PICTURE"][
"tmp_name"]));
930 copy(
$arFields[
"PICTURE"][
"tmp_name"], $tmp_name);
932 $arFields[
"PICTURE"][
"tmp_name"] = $tmp_name;
936 "name" =>
"watermark",
937 "position" => $arDef[
"WATERMARK_TEXT_POSITION"],
939 "coefficient" => $arDef[
"WATERMARK_TEXT_SIZE"],
940 "text" => $arDef[
"WATERMARK_TEXT"],
941 "font" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_TEXT_FONT"]),
942 "color" => $arDef[
"WATERMARK_TEXT_COLOR"],
946 $arDef =
$arIBlock[
"FIELDS"][
"SECTION_DETAIL_PICTURE"][
"DEFAULT_VALUE"];
949 array_key_exists(
"DETAIL_PICTURE",
$arFields)
951 && $arDef[
"SCALE"] ===
"Y"
954 $arNewPicture = CIBlock::ResizePicture(
$arFields[
"DETAIL_PICTURE"], $arDef);
955 if(is_array($arNewPicture))
957 $arNewPicture[
"description"] =
$arFields[
"DETAIL_PICTURE"][
"description"];
958 $arFields[
"DETAIL_PICTURE"] = $arNewPicture;
960 elseif($arDef[
"IGNORE_ERRORS"] !==
"Y")
968 array_key_exists(
"DETAIL_PICTURE",
$arFields)
970 && $arDef[
"USE_WATERMARK_FILE"] ===
"Y"
974 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] <>
''
977 || (
$arFields[
"DETAIL_PICTURE"][
"COPY_FILE"] ==
"Y" && !
$arFields[
"DETAIL_PICTURE"][
"copy"])
981 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"]));
983 copy(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"], $tmp_name);
984 $arFields[
"DETAIL_PICTURE"][
"copy"] =
true;
985 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] = $tmp_name;
988 CIBlock::FilterPicture(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"],
array(
989 "name" =>
"watermark",
990 "position" => $arDef[
"WATERMARK_FILE_POSITION"],
993 "alpha_level" => 100 - min(max($arDef[
"WATERMARK_FILE_ALPHA"], 0), 100),
994 "file" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_FILE"]),
1000 array_key_exists(
"DETAIL_PICTURE",
$arFields)
1001 && is_array(
$arFields[
"DETAIL_PICTURE"])
1002 && $arDef[
"USE_WATERMARK_TEXT"] ===
"Y"
1006 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] <>
''
1009 || (
$arFields[
"DETAIL_PICTURE"][
"COPY_FILE"] ==
"Y" && !
$arFields[
"DETAIL_PICTURE"][
"copy"])
1013 $tmp_name = CTempFile::GetFileName(basename(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"]));
1015 copy(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"], $tmp_name);
1016 $arFields[
"DETAIL_PICTURE"][
"copy"] =
true;
1017 $arFields[
"DETAIL_PICTURE"][
"tmp_name"] = $tmp_name;
1020 CIBlock::FilterPicture(
$arFields[
"DETAIL_PICTURE"][
"tmp_name"],
array(
1021 "name" =>
"watermark",
1022 "position" => $arDef[
"WATERMARK_TEXT_POSITION"],
1024 "coefficient" => $arDef[
"WATERMARK_TEXT_SIZE"],
1025 "text" => $arDef[
"WATERMARK_TEXT"],
1026 "font" =>
$_SERVER[
"DOCUMENT_ROOT"].
Rel2Abs(
"/", $arDef[
"WATERMARK_TEXT_FONT"]),
1027 "color" => $arDef[
"WATERMARK_TEXT_COLOR"],
1032 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($db_record[
"IBLOCK_ID"], $db_record[
"ID"]);
1033 if (array_key_exists(
"PICTURE",
$arFields))
1040 (
$arFields[
"PICTURE"][
"name"] ??
'') ===
''
1041 && (
$arFields[
"PICTURE"][
"del"] ??
'') ===
''
1042 && !array_key_exists(
"description",
$arFields[
"PICTURE"])
1049 $arFields[
"PICTURE"][
"old_file"] = $db_record[
"PICTURE"];
1050 $arFields[
"PICTURE"][
"MODULE_ID"] =
"iblock";
1053 ,
"SECTION_PICTURE_FILE_NAME"
1060 if (array_key_exists(
"DETAIL_PICTURE",
$arFields))
1062 if (!is_array(
$arFields[
"DETAIL_PICTURE"]))
1067 (
$arFields[
"DETAIL_PICTURE"][
"name"] ??
'') ===
''
1068 && (
$arFields[
"DETAIL_PICTURE"][
"del"] ??
'') ===
''
1069 && !array_key_exists(
"description",
$arFields[
"DETAIL_PICTURE"])
1076 $arFields[
"DETAIL_PICTURE"][
"old_file"] = $db_record[
"DETAIL_PICTURE"];
1077 $arFields[
"DETAIL_PICTURE"][
"MODULE_ID"] =
"iblock";
1080 ,
"SECTION_DETAIL_PICTURE_FILE_NAME"
1093 if(isset(
$arFields[
"IBLOCK_SECTION_ID"]))
1101 $DESC_TYPE_tmp =
is_set(
$arFields,
"DESCRIPTION_TYPE")?
$arFields[
"DESCRIPTION_TYPE"]: $db_record[
"DESCRIPTION_TYPE"];
1103 $arFields[
"SEARCHABLE_CONTENT"] = mb_strtoupper(
1105 ($DESC_TYPE_tmp==
"html"?
HTMLToTxt($DESC_tmp): $DESC_tmp)
1108 if(is_object(
$USER))
1124 $this->LAST_ERROR .= str_replace(
"<br><br>",
"<br>", $err->GetString().
"<br>");
1129 if(array_key_exists(
"PICTURE",
$arFields))
1132 CFile::SaveForDB(
$arFields,
"PICTURE",
"iblock");
1135 if(array_key_exists(
"DETAIL_PICTURE",
$arFields))
1137 $SAVED_DETAIL_PICTURE =
$arFields[
"DETAIL_PICTURE"];
1138 CFile::SaveForDB(
$arFields,
"DETAIL_PICTURE",
"iblock");
1147 $strUpdate =
$DB->PrepareUpdate(
"b_iblock_section",
$arFields,
"iblock");
1151 if(array_key_exists(
"PICTURE",
$arFields))
1153 if(array_key_exists(
"DETAIL_PICTURE",
$arFields))
1154 $arFields[
"DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE;
1156 CIBlock::_transaction_lock($db_record[
"IBLOCK_ID"]);
1158 if($strUpdate <>
'')
1160 $strSql =
"UPDATE b_iblock_section SET ".$strUpdate.
" WHERE ID = ".
$ID;
1162 if(array_key_exists(
"DESCRIPTION",
$arFields))
1163 $arBinds[
"DESCRIPTION"] =
$arFields[
"DESCRIPTION"];
1164 if(array_key_exists(
"SEARCHABLE_CONTENT",
$arFields))
1165 $arBinds[
"SEARCHABLE_CONTENT"] =
$arFields[
"SEARCHABLE_CONTENT"];
1166 $DB->QueryBind($strSql, $arBinds);
1174 unset(self::$arSectionCodeCache[
$ID]);
1175 self::$arSectionPathCache =
array();
1176 self::$arSectionNavChainCache =
array();
1184 &&
$arFields[
"IBLOCK_SECTION_ID"] != $db_record[
"IBLOCK_SECTION_ID"]
1187 $obSectionRights->ChangeParents(
array($db_record[
"IBLOCK_SECTION_ID"]),
array(
$arFields[
"IBLOCK_SECTION_ID"]));
1191 $obSectionRights->SetRights(
$arFields[
"RIGHTS"]);
1194 if (array_key_exists(
"IPROPERTY_TEMPLATES",
$arFields))
1196 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates(
$arIBlock[
"ID"],
$ID);
1197 $ipropTemplates->set(
$arFields[
"IPROPERTY_TEMPLATES"]);
1200 $uf_updated =
$GLOBALS[
"USER_FIELD_MANAGER"]->Update(
"IBLOCK_".$db_record[
"IBLOCK_ID"].
"_SECTION",
$ID,
$arFields);
1203 $DB->Query(
"UPDATE b_iblock_section SET TIMESTAMP_X = ".
$DB->CurrentTimeFunction().
" WHERE ID = ".
$ID);
1207 CIBlock::GetArrayByID($db_record[
"IBLOCK_ID"],
"SECTION_PROPERTY") ===
"Y"
1208 && array_key_exists(
"SECTION_PROPERTY",
$arFields)
1209 && is_array(
$arFields[
"SECTION_PROPERTY"])
1212 CIBlockSectionPropertyLink::DeleteBySection(
$ID, array_keys(
$arFields[
"SECTION_PROPERTY"]));
1213 foreach(
$arFields[
"SECTION_PROPERTY"] as $PROPERTY_ID => $arLink)
1214 CIBlockSectionPropertyLink::Set(
$ID, $PROPERTY_ID, $arLink);
1217 CIBlock::GetArrayByID($db_record[
"IBLOCK_ID"],
"PROPERTY_INDEX") ===
"Y"
1218 && isset(
$arFields[
'IBLOCK_SECTION_ID'])
1219 &&
$arFields[
'IBLOCK_SECTION_ID'] != $db_record[
'IBLOCK_SECTION_ID']
1228 if(
$arIBlock[
"FIELDS"][
"LOG_SECTION_EDIT"][
"IS_REQUIRED"] ==
"Y")
1230 $USER_ID = is_object(
$USER)? intval(
$USER->GetID()) : 0;
1234 $rsSection = CIBlockSection::GetList(
array(),
array(
"=ID"=>
$ID),
false,
array(
"LIST_PAGE_URL",
"NAME",
"CODE"));
1235 $arSection = $rsSection->GetNext();
1238 "CODE" => $arSection[
"CODE"],
1239 "NAME" => $arSection[
"NAME"],
1240 "SECTION_NAME" =>
$arIBlock[
"SECTION_NAME"],
1241 "USER_ID" => $USER_ID,
1242 "IBLOCK_PAGE_URL" => $arSection[
"LIST_PAGE_URL"],
1246 "IBLOCK_SECTION_EDIT",
1262 $arFields[
"IBLOCK_ID"] = $db_record[
"IBLOCK_ID"];
1265 foreach (
GetModuleEvents(
"iblock",
"OnAfterIBlockSectionUpdate",
true) as $arEvent)
1268 CIBlock::clearIblockTagCache(
$arIBlock[
'ID']);
1276 public static function Delete(
$ID, $bCheckPermissions =
true)
1287 foreach (
GetModuleEvents(
"iblock",
"OnBeforeIBlockSectionDelete",
true) as $arEvent)
1291 $err =
GetMessage(
"MAIN_BEFORE_DEL_ERR").
' '.$arEvent[
'TO_NAME'];
1293 $err .=
': '.$ex->GetString();
1299 $s = CIBlockSection::GetList(Array(), Array(
"ID"=>
$ID,
"CHECK_PERMISSIONS"=>($bCheckPermissions?
"Y":
"N")));
1300 if($s = $s->Fetch())
1302 CIBlock::_transaction_lock($s[
"IBLOCK_ID"]);
1304 $iblockelements = CIBlockElement::GetList(
1306 array(
"SECTION_ID" =>
$ID,
"SHOW_HISTORY" =>
"Y",
"IBLOCK_ID" => $s[
"IBLOCK_ID"]),
1309 array(
"ID",
"IBLOCK_ID",
"WF_PARENT_ELEMENT_ID",
"IBLOCK_SECTION_ID")
1311 while($iblockelement = $iblockelements->Fetch())
1313 $elementId = (int)$iblockelement[
"ID"];
1315 SELECT IBLOCK_SECTION_ID
1316 FROM b_iblock_section_element
1318 IBLOCK_ELEMENT_ID = ".$elementId.
"
1319 AND IBLOCK_SECTION_ID<>".
$ID.
"
1320 AND ADDITIONAL_PROPERTY_ID IS NULL
1324 $db_section_element =
$DB->Query($strSql);
1325 if($ar_section_element = $db_section_element->Fetch())
1327 if ((
int)$iblockelement[
"IBLOCK_SECTION_ID"] ==
$ID)
1330 UPDATE b_iblock_element
1331 SET IBLOCK_SECTION_ID=".$ar_section_element[
"IBLOCK_SECTION_ID"].
"
1332 WHERE ID=".$elementId.
"
1336 elseif((
int)$iblockelement[
"WF_PARENT_ELEMENT_ID"]<=0)
1338 if(!CIBlockElement::Delete($iblockelement[
"ID"]))
1344 UPDATE b_iblock_element
1345 SET IBLOCK_SECTION_ID=NULL, IN_SECTIONS='N'
1346 WHERE ID=".$elementId.
"
1352 $iblocksections = CIBlockSection::GetList(
1354 array(
"SECTION_ID"=>
$ID,
"CHECK_PERMISSIONS"=>($bCheckPermissions?
"Y":
"N")),
1358 while($iblocksection = $iblocksections->Fetch())
1364 CFile::Delete($s[
"PICTURE"]);
1365 CFile::Delete($s[
"DETAIL_PICTURE"]);
1368 if(!is_array($arDelCache))
1369 $arDelCache = Array();
1370 if (!isset($arDelCache[$s[
"IBLOCK_ID"]]))
1372 $arDelCache[$s[
"IBLOCK_ID"]] = [];
1373 $db_ps =
$DB->Query(
"SELECT ID,IBLOCK_ID,VERSION,MULTIPLE FROM b_iblock_property WHERE PROPERTY_TYPE='G' AND (LINK_IBLOCK_ID=".$s[
"IBLOCK_ID"].
" OR LINK_IBLOCK_ID=0 OR LINK_IBLOCK_ID IS NULL)");
1374 while($ar_ps = $db_ps->Fetch())
1376 if($ar_ps[
"VERSION"]==2)
1378 if($ar_ps[
"MULTIPLE"]==
"Y")
1379 $strTable =
"b_iblock_element_prop_m".$ar_ps[
"IBLOCK_ID"];
1381 $strTable =
"b_iblock_element_prop_s".$ar_ps[
"IBLOCK_ID"];
1385 $strTable =
"b_iblock_element_property";
1387 if (!isset($arDelCache[$s[
"IBLOCK_ID"]][$strTable]))
1389 $arDelCache[$s[
"IBLOCK_ID"]][$strTable] = [];
1391 $arDelCache[$s[
"IBLOCK_ID"]][$strTable][] = $ar_ps[
"ID"];
1395 if (!empty($arDelCache[$s[
"IBLOCK_ID"]]))
1397 foreach($arDelCache[$s[
"IBLOCK_ID"]] as $strTable=>$arProps)
1399 if(strncmp(
"b_iblock_element_prop_s", $strTable, 23)==0)
1401 $tableFields =
$DB->GetTableFields($strTable);
1402 foreach($arProps as $prop_id)
1404 $strSql =
"UPDATE ".$strTable.
" SET PROPERTY_".$prop_id.
"=null";
1405 if (isset($tableFields[
"DESCRIPTION_".$prop_id]))
1406 $strSql .=
",DESCRIPTION_".$prop_id.
"=null";
1407 $strSql .=
" WHERE PROPERTY_".$prop_id.
"=".$s[
"ID"];
1408 if(!
$DB->Query($strSql))
1412 elseif(strncmp(
"b_iblock_element_prop_m", $strTable, 23)==0)
1414 $tableFields =
$DB->GetTableFields(str_replace(
"prop_m",
"prop_s", $strTable));
1415 $strSql =
"SELECT IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID FROM ".$strTable.
" WHERE IBLOCK_PROPERTY_ID IN (".implode(
", ", $arProps).
") AND VALUE_NUM=".$s[
"ID"];
1416 $rs =
$DB->Query($strSql);
1417 while(
$ar =
$rs->Fetch())
1420 UPDATE ".str_replace(
"prop_m",
"prop_s", $strTable).
"
1421 SET PROPERTY_".
$ar[
"IBLOCK_PROPERTY_ID"].
"=null
1422 ".(isset($tableFields[
"DESCRIPTION_".
$ar[
"IBLOCK_PROPERTY_ID"]])?
",DESCRIPTION_".$ar[
"IBLOCK_PROPERTY_ID"].
"=null":
"").
"
1423 WHERE IBLOCK_ELEMENT_ID = ".
$ar[
"IBLOCK_ELEMENT_ID"].
"
1425 if(!
$DB->Query($strSql))
1428 $strSql =
"DELETE FROM ".$strTable.
" WHERE IBLOCK_PROPERTY_ID IN (".implode(
", ", $arProps).
") AND VALUE_NUM=".$s[
"ID"];
1429 if(!
$DB->Query($strSql))
1434 $strSql =
"DELETE FROM ".$strTable.
" WHERE IBLOCK_PROPERTY_ID IN (".implode(
", ", $arProps).
") AND VALUE_NUM=".$s[
"ID"];
1435 if(!
$DB->Query($strSql))
1441 CIBlockSectionPropertyLink::DeleteBySection(
$ID);
1442 $DB->Query(
"DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID=".
$ID);
1444 if(CModule::IncludeModule(
"search"))
1447 $GLOBALS[
"USER_FIELD_MANAGER"]->Delete(
"IBLOCK_".$s[
"IBLOCK_ID"].
"_SECTION",
$ID);
1453 $obSectionRights->DeleteAllRights();
1455 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($s[
"IBLOCK_ID"],
$ID);
1456 $ipropTemplates->delete();
1462 $arIBlockFields = CIBlock::GetArrayByID($s[
"IBLOCK_ID"],
"FIELDS");
1463 if($arIBlockFields[
"LOG_SECTION_DELETE"][
"IS_REQUIRED"] ==
"Y")
1465 $USER_ID = is_object(
$USER)? intval(
$USER->GetID()) : 0;
1469 $rsSection = CIBlockSection::GetList(
1471 array(
"=ID"=>
$ID,
"CHECK_PERMISSIONS"=>($bCheckPermissions?
"Y":
"N")),
1473 array(
"LIST_PAGE_URL",
"NAME",
"CODE")
1475 $arSection = $rsSection->GetNext();
1478 "CODE" => $arSection[
"CODE"],
1479 "NAME" => $arSection[
"NAME"],
1480 "SECTION_NAME" => CIBlock::GetArrayByID($s[
"IBLOCK_ID"],
"SECTION_NAME"),
1481 "USER_ID" => $USER_ID,
1482 "IBLOCK_PAGE_URL" => $arSection[
"LIST_PAGE_URL"],
1486 "IBLOCK_SECTION_DELETE",
1494 $res =
$DB->Query(
"DELETE FROM b_iblock_section WHERE ID=".
$ID);
1498 foreach (
GetModuleEvents(
"iblock",
"OnAfterIBlockSectionDelete",
true) as $arEvent)
1501 CIBlock::clearIblockTagCache($s[
'IBLOCK_ID']);
1516 $this->LAST_ERROR =
"";
1519 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION").
"<br>";
1524 && array_key_exists(
"bucket",
$arFields[
"PICTURE"])
1525 && is_object(
$arFields[
"PICTURE"][
"bucket"])
1537 $this->LAST_ERROR .=
$error.
"<br>";
1540 $detailPictureIsArray = isset(
$arFields[
"DETAIL_PICTURE"]) && is_array(
$arFields[
"DETAIL_PICTURE"]);
1542 $detailPictureIsArray
1543 && array_key_exists(
"bucket",
$arFields[
"DETAIL_PICTURE"])
1544 && is_object(
$arFields[
"DETAIL_PICTURE"][
"bucket"])
1550 $detailPictureIsArray
1551 && isset(
$arFields[
"DETAIL_PICTURE"][
"name"])
1556 $this->LAST_ERROR .=
$error.
"<br>";
1564 if(!array_key_exists(
"IBLOCK_ID",
$arFields))
1566 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_BLOCK_ID").
"<br>";
1572 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_BLOCK_ID").
"<br>";
1577 $rsThis =
$DB->Query(
"SELECT ID, IBLOCK_ID, DETAIL_PICTURE, PICTURE FROM b_iblock_section WHERE ID = ".intval(
$ID));
1578 $arThis = $rsThis->Fetch();
1581 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_ID",
array(
"#ID#" => intval(
$ID))).
"<br>";
1585 $arIBlock = CIBlock::GetArrayByID($arThis[
"IBLOCK_ID"]);
1587 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_BLOCK_ID").
"<br>";
1592 $IBLOCK_SECTION_ID = (int)(
$arFields[
'IBLOCK_SECTION_ID'] ?? 0);
1594 if ($IBLOCK_SECTION_ID > 0 &&
$ID !==
false && $this->LAST_ERROR ===
'')
1596 if ($IBLOCK_SECTION_ID === (
int)
$ID)
1598 $this->LAST_ERROR .=
GetMessage(
'IBLOCK_BAD_BLOCK_SECTION_RECURSE') .
'<br>';
1602 if ($IBLOCK_SECTION_ID > 0 && $this->LAST_ERROR ===
'')
1604 $sqlCheck =
'select ID, IBLOCK_ID from b_iblock_section where ID = ' . $IBLOCK_SECTION_ID;
1605 $rsParent =
$DB->Query($sqlCheck);
1606 $arParent = $rsParent->Fetch();
1609 $this->LAST_ERROR =
GetMessage(
'IBLOCK_BAD_BLOCK_SECTION_PARENT') .
'<br>';
1615 if($arParent[
"IBLOCK_ID"] !=
$arIBlock[
"ID"])
1616 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_BLOCK_SECTION_ID_PARENT").
"<br>";
1619 if($arParent && ($this->LAST_ERROR ==
''))
1624 b_iblock_section bsto
1625 ,b_iblock_section bsfrom
1627 bsto.ID = ".$arParent[
"ID"].
"
1628 AND bsfrom.ID = ".intval(
$ID).
"
1629 AND bsto.LEFT_MARGIN >= bsfrom.LEFT_MARGIN
1630 AND bsto.LEFT_MARGIN <= bsfrom.RIGHT_MARGIN
1633 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_BLOCK_SECTION_RECURSE").
"<br>";
1641 && is_array(
$arIBlock[
"FIELDS"][
"SECTION_CODE"][
"DEFAULT_VALUE"])
1642 &&
$arIBlock[
"FIELDS"][
"SECTION_CODE"][
"DEFAULT_VALUE"][
"UNIQUE"] ==
"Y"
1647 FROM b_iblock_section
1649 AND CODE = '".
$DB->ForSQL((
string)
$arFields[
'CODE']).
"'
1650 AND ID <> ".(
int)
$ID
1653 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_DUP_SECTION_CODE").
"<br>";
1656 foreach(
$arIBlock[
"FIELDS"] as $FIELD_ID => $field)
1658 if(!preg_match(
"/^SECTION_(.+)$/", $FIELD_ID, $match))
1661 $FIELD_ID = $match[1];
1663 if($field[
"IS_REQUIRED"] ===
"Y")
1668 case "DESCRIPTION_TYPE":
1672 $field[
"NAME"] =
GetMessage(
"IBLOCK_FIELD_PICTURE");
1673 case "DETAIL_PICTURE":
1674 if($arThis && $arThis[$FIELD_ID] > 0)
1681 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_FIELD",
array(
"#FIELD_NAME#" => $field[
"NAME"])).
"<br>";
1685 if(!array_key_exists($FIELD_ID,
$arFields))
1687 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_FIELD",
array(
"#FIELD_NAME#" => $field[
"NAME"])).
"<br>";
1693 || (array_key_exists(
"error",
$arFields[$FIELD_ID]) &&
$arFields[$FIELD_ID][
"error"] !== 0)
1696 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_FIELD",
array(
"#FIELD_NAME#" => $field[
"NAME"])).
"<br>";
1701 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_FIELD",
array(
"#FIELD_NAME#" => $field[
"NAME"])).
"<br>";
1706 if(
$ID===
false || array_key_exists($FIELD_ID,
$arFields))
1713 $this->LAST_ERROR .=
GetMessage(
"IBLOCK_BAD_SECTION_FIELD",
array(
"#FIELD_NAME#" => $field[
"NAME"])).
"<br>";
1723 $db_events =
GetModuleEvents(
"iblock",
"OnBeforeIBlockSectionAdd",
true);
1728 $db_events =
GetModuleEvents(
"iblock",
"OnBeforeIBlockSectionUpdate",
true);
1732 if(empty($this->LAST_ERROR) && (COption::GetOptionInt(
"main",
"disk_space") > 0))
1736 $this->LAST_ERROR = $quota->LAST_ERROR;
1740 foreach ($db_events as $arEvent)
1743 if($bEventRes===
false)
1746 $this->LAST_ERROR .= $err->GetString().
"<br>";
1750 $this->LAST_ERROR .=
"Unknown error.<br>";
1756 if($this->LAST_ERROR <>
'')
1778 TIMESTAMP_X=".(
$DB->type==
"ORACLE"?
"NULL":
"TIMESTAMP_X").
"
1779 ,RIGHT_MARGIN=".(
int)$cnt.
"
1780 ,LEFT_MARGIN=".(
int)$cnt.
"
1787 SELECT BS.ID, BS.ACTIVE
1788 FROM b_iblock_section BS
1789 WHERE BS.IBLOCK_ID = ".$IBLOCK_ID.
"
1790 AND ".(
$ID>0?
"BS.IBLOCK_SECTION_ID=".(int)
$ID:
"BS.IBLOCK_SECTION_ID IS NULL").
"
1791 ORDER BY BS.SORT, BS.NAME
1808 TIMESTAMP_X=".(
$DB->type==
"ORACLE"?
"NULL":
"TIMESTAMP_X").
"
1809 ,RIGHT_MARGIN=".(
int)$cnt.
"
1810 ,DEPTH_LEVEL=".(
int)$depth.
"
1811 ,GLOBAL_ACTIVE='".$ACTIVE.
"'
1823 $obIBlockRights->Recalculate();
1830 if(!CModule::IncludeModule(
"search"))
return;
1836 static $arSITE =
array();
1839 SELECT BS.ID, BS.NAME, BS.DESCRIPTION_TYPE, BS.DESCRIPTION, BS.XML_ID as EXTERNAL_ID,
1840 BS.CODE, BS.IBLOCK_ID, B.IBLOCK_TYPE_ID,
1841 ".$DB->DateToCharFunction(
"BS.TIMESTAMP_X").
" as LAST_MODIFIED,
1842 B.CODE as IBLOCK_CODE, B.XML_ID as IBLOCK_EXTERNAL_ID, B.SECTION_PAGE_URL,
1843 B.ACTIVE as ACTIVE1,
1844 BS.GLOBAL_ACTIVE as ACTIVE2,
1845 B.INDEX_SECTION, B.RIGHTS_MODE
1846 FROM b_iblock_section BS, b_iblock B
1847 WHERE BS.IBLOCK_ID=B.ID
1850 $dbrIBlockSection =
$DB->Query($strSql);
1852 if($arIBlockSection = $dbrIBlockSection->Fetch())
1856 "=ID=".$arIBlockSection[
"ID"].
1857 "&EXTERNAL_ID=".$arIBlockSection[
"EXTERNAL_ID"].
1858 "&IBLOCK_TYPE_ID=".$arIBlockSection[
"IBLOCK_TYPE_ID"].
1859 "&IBLOCK_ID=".$arIBlockSection[
"IBLOCK_ID"].
1860 "&IBLOCK_CODE=".$arIBlockSection[
"IBLOCK_CODE"].
1861 "&IBLOCK_EXTERNAL_ID=".$arIBlockSection[
"IBLOCK_EXTERNAL_ID"].
1862 "&CODE=".$arIBlockSection[
"CODE"];
1864 if($arIBlockSection[
"ACTIVE1"]!=
"Y" || $arIBlockSection[
"ACTIVE2"]!=
"Y" || $arIBlockSection[
"INDEX_SECTION"]!=
"Y")
1875 "FROM b_iblock_group ".
1876 "WHERE IBLOCK_ID= ".$IBLOCK_ID.
" ".
1877 " AND PERMISSION>='" . CIBlockRights::PUBLIC_READ .
"' ".
1878 "ORDER BY GROUP_ID";
1880 $dbrIBlockGroup =
$DB->Query($strSql);
1881 while($arIBlockGroup = $dbrIBlockGroup->Fetch())
1884 if($arIBlockGroup[
"GROUP_ID"]==2)
break;
1893 "FROM b_iblock_site ".
1894 "WHERE IBLOCK_ID= ".$IBLOCK_ID;
1896 $dbrIBlockSite =
$DB->Query($strSql);
1897 while($arIBlockSite = $dbrIBlockSite->Fetch())
1898 $arSITE[
$IBLOCK_ID][] = $arIBlockSite[
"SITE_ID"];
1902 ($arIBlockSection[
"DESCRIPTION_TYPE"]==
"html" ?
1905 $arIBlockSection[
"DESCRIPTION"]
1908 $BODY .=
$GLOBALS[
"USER_FIELD_MANAGER"]->OnSearchIndex(
"IBLOCK_".$arIBlockSection[
"IBLOCK_ID"].
"_SECTION", $arIBlockSection[
"ID"]);
1910 if($arIBlockSection[
"RIGHTS_MODE"] !==
"E")
1915 $arPermissions = $obSectionRights->GetGroups(
array(
"section_read"));
1919 "LAST_MODIFIED" => $arIBlockSection[
"LAST_MODIFIED"],
1920 "TITLE" => $arIBlockSection[
"NAME"],
1921 "PARAM1" => $arIBlockSection[
"IBLOCK_TYPE_ID"],
1924 "PERMISSIONS" => $arPermissions,
1925 "URL" => $SECTION_URL,
1942 if (!is_array($arOrder))
1944 $arOrder = [
'SORT' =>
'ASC'];
1947 if (!is_array($arSelectedFields))
1949 $arSelectedFields = [];
1951 $emptySelect = empty($arSelectedFields) || in_array(
'*', $arSelectedFields);
1960 if (static::checkLoadSections(
$arFilter))
1968 'EXTERNAL_ID' =>
true,
1969 'IBLOCK_ID' =>
true,
1970 'IBLOCK_SECTION_ID' =>
true,
1971 'TIMESTAMP_X' =>
true,
1972 'TIMESTAMP_X_UNIX' =>
true,
1976 'GLOBAL_ACTIVE' =>
true,
1978 'DESCRIPTION' =>
true,
1979 'DESCRIPTION_TYPE' =>
true,
1980 'LEFT_MARGIN' =>
true,
1981 'RIGHT_MARGIN' =>
true,
1982 'DEPTH_LEVEL' =>
true,
1983 'SEARCHABLE_CONTENT' =>
true,
1984 'MODIFIED_BY' =>
true,
1985 'DATE_CREATE' =>
true,
1986 'DATE_CREATE_UNIX' =>
true,
1987 'CREATED_BY' =>
true,
1988 'DETAIL_PICTURE' =>
true,
1991 'LIST_PAGE_URL' =>
true,
1992 'SECTION_PAGE_URL' =>
true,
1993 'IBLOCK_TYPE_ID' =>
true,
1994 'IBLOCK_CODE' =>
true,
1995 'IBLOCK_EXTERNAL_ID' =>
true,
1996 'SOCNET_GROUP_ID' =>
true,
2005 $sectionSelect = [];
2006 foreach ($arSelectedFields as $field)
2012 $sectionSelect[$field] = $field;
2015 if (!empty($sectionSelect))
2017 $sectionSelect = array_values($sectionSelect);
2022 $rsSection = $obSection->
GetList($arOrder, $arSectionFilter, $bIncCnt, $sectionSelect);
2023 while ($arSection = $rsSection->Fetch())
2033 if (static::checkLoadElements(
$arFilter))
2036 $arElementFilter[
'SHOW_NEW'] = (
$arFilter[
'SHOW_NEW'] ??
'Y') ===
'N' ?
'N' :
'Y';
2040 $arSelectedFields = [
"*"];
2045 $rsElement = $obElement->
GetList($arOrder, $arElementFilter,
false,
false, $arSelectedFields);
2046 while ($arElement = $rsElement->Fetch())
2070 $arJoinProps =
array();
2071 $bJoinFlatProp =
false;
2072 $arSqlSearch =
array();
2074 if(array_key_exists(
"PROPERTY",
$arFilter))
2077 foreach(
$val as $propID=>$propVAL)
2079 $res = CIBlock::MkOperationFilter($propID);
2080 $propID =
$res[
"FIELD"];
2081 $cOperationType =
$res[
"OPERATION"];
2082 if($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays(
$arFilter[
"IBLOCK_ID"],
$arFilter[
"IBLOCK_CODE"])))
2086 if(array_key_exists($db_prop[
"ID"], $arJoinProps))
2087 $iPropCnt = $arJoinProps[$db_prop[
"ID"]];
2088 elseif($db_prop[
"VERSION"]!=2 || $db_prop[
"MULTIPLE"]==
"Y")
2091 $iPropCnt=
count($arJoinProps);
2094 if(!is_array($propVAL))
2095 $propVAL = Array($propVAL);
2097 if($db_prop[
"PROPERTY_TYPE"]==
"N" || $db_prop[
"PROPERTY_TYPE"]==
"G" || $db_prop[
"PROPERTY_TYPE"]==
"E")
2099 if($db_prop[
"VERSION"]==2 && $db_prop[
"MULTIPLE"]==
"N")
2101 $r = CIBlock::FilterCreate(
"FPS.PROPERTY_".$db_prop[
"ORIG_ID"], $propVAL,
"number", $cOperationType);
2102 $bJoinFlatProp = $db_prop[
"IBLOCK_ID"];
2105 $r = CIBlock::FilterCreate(
"FPV".$iPropCnt.
".VALUE_NUM", $propVAL,
"number", $cOperationType);
2109 if($db_prop[
"VERSION"]==2 && $db_prop[
"MULTIPLE"]==
"N")
2111 $r = CIBlock::FilterCreate(
"FPS.PROPERTY_".$db_prop[
"ORIG_ID"], $propVAL,
"string", $cOperationType);
2112 $bJoinFlatProp = $db_prop[
"IBLOCK_ID"];
2115 $r = CIBlock::FilterCreate(
"FPV".$iPropCnt.
".VALUE", $propVAL,
"string", $cOperationType);
2122 $db_prop[
"iPropCnt"] = $iPropCnt;
2123 $arJoinProps[$db_prop[
"ID"]] = $db_prop;
2125 $arSqlSearch[] = $r;
2132 foreach($arSqlSearch as $r)
2134 $strSqlSearch .=
"\n\t\t\t\tAND (".$r.
") ";
2136 $strSqlSearchProp =
"";
2137 foreach($arJoinProps as $propID=>$db_prop)
2139 if($db_prop[
"VERSION"]==2)
2140 $strTable =
"b_iblock_element_prop_m".$db_prop[
"IBLOCK_ID"];
2142 $strTable =
"b_iblock_element_property";
2143 $i = $db_prop[
"iPropCnt"];
2144 $strSqlSearchProp .=
"
2145 INNER JOIN b_iblock_property FP".$i.
" ON FP".
$i.
".IBLOCK_ID=BS.IBLOCK_ID AND
2146 ".(intval($propID)>0?
" FP".$i.
".ID=".intval($propID).
" ":
" FP".$i.
".CODE='".
$DB->ForSQL($propID, 200).
"' ").
"
2147 INNER JOIN ".$strTable.
" FPV".
$i.
" ON FP".
$i.
".ID=FPV".
$i.
".IBLOCK_PROPERTY_ID AND FPV".
$i.
".IBLOCK_ELEMENT_ID=BE.ID
2151 $strSqlSearchProp .=
"
2152 INNER JOIN b_iblock_element_prop_s".$bJoinFlatProp.
" FPS ON FPS.IBLOCK_ELEMENT_ID = BE.ID
2156 $activeElements = (isset(
$arFilter[
'CNT_ACTIVE']) &&
$arFilter[
'CNT_ACTIVE'] ==
'Y');
2158 $strHint =
$DB->type==
"MYSQL"?
"STRAIGHT_JOIN":
"";
2160 SELECT ".$strHint.
" COUNT(DISTINCT BE.ID) as CNT
2161 FROM b_iblock_section BS
2162 INNER JOIN b_iblock_section BSTEMP ON (BSTEMP.IBLOCK_ID=BS.IBLOCK_ID
2163 AND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN
2164 AND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN)
2165 INNER JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID
2166 INNER JOIN b_iblock_element BE ON BE.ID=BSE.IBLOCK_ELEMENT_ID AND BE.IBLOCK_ID=BS.IBLOCK_ID
2167 ".$strSqlSearchProp.
"
2168 WHERE BS.ID=".intval(
$ID).
"
2169 AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )
2170 ".($allElements ?
" OR BE.WF_NEW='Y' ":
"").
")
2171 ".($activeElements ?
2173 AND (BE.ACTIVE_TO >= ".
$DB->CurrentTimeFunction().
" OR BE.ACTIVE_TO IS NULL)
2174 AND (BE.ACTIVE_FROM <= ".
$DB->CurrentTimeFunction().
" OR BE.ACTIVE_FROM IS NULL)"
2181 return (
int)(
$res[
'CNT'] ?? 0);
2187 $min_permission = (mb_strlen($min_permission) == 1) ? $min_permission : CIBlockRights::PUBLIC_READ;
2189 if ($permissionsBy !==
null)
2190 $permissionsBy = (int)$permissionsBy;
2191 if ($permissionsBy < 0)
2192 $permissionsBy =
null;
2194 if ($permissionsBy !==
null)
2196 $iUserID = $permissionsBy;
2197 $strGroups = implode(
',', CUser::GetUserGroup($permissionsBy));
2198 $bAuthorized =
false;
2202 if (is_object(
$USER))
2204 $iUserID = (int)
$USER->GetID();
2205 $strGroups =
$USER->GetGroups();
2206 $bAuthorized =
$USER->IsAuthorized();
2212 $bAuthorized =
false;
2218 FROM b_iblock_group IBG
2219 WHERE IBG.GROUP_ID IN (".$strGroups.
")
2220 AND IBG.PERMISSION >= '".
$DB->ForSQL($min_permission).
"'
2222 if(!defined(
"ADMIN_SECTION"))
2223 $stdPermissions .=
"
2224 AND (IBG.PERMISSION='" . CIBlockRights::FULL_ACCESS .
"' OR B.ACTIVE='Y')
2227 if($min_permission >= CIBlockRights::FULL_ACCESS)
2228 $operation =
'section_rights_edit';
2229 elseif($min_permission >= CIBlockRights::EDIT_ACCESS)
2230 $operation =
'section_edit';
2231 elseif($min_permission >= CIBlockRights::PUBLIC_READ)
2232 $operation =
'section_read';
2239 $acc->UpdateCodes($permissionsBy !==
null ?
array(
'USER_ID' => $permissionsBy) :
false);
2242 if($operation ==
"section_read")
2245 SELECT SR.SECTION_ID
2246 FROM b_iblock_section_right SR
2247 INNER JOIN b_iblock_right IBR ON IBR.ID = SR.RIGHT_ID
2248 ".($iUserID > 0?
"LEFT":
"INNER").
" JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = ".$iUserID.
"
2249 WHERE SR.SECTION_ID = BS.ID
2250 AND IBR.OP_SREAD = 'Y'
2251 ".($bAuthorized || $iUserID > 0?
"
2252 AND (UA.USER_ID IS NOT NULL
2253 ".($bAuthorized?
"OR IBR.GROUP_CODE = 'AU'":
"").
"
2254 ".($iUserID > 0?
"OR (IBR.GROUP_CODE = 'CR' AND BS.CREATED_BY = ".$iUserID.
")":
"").
"
2259 B.ID IN ($stdPermissions)
2260 OR (B.RIGHTS_MODE = 'E' AND EXISTS ($extPermissions))
2266 SELECT SR.SECTION_ID
2267 FROM b_iblock_section_right SR
2268 INNER JOIN b_iblock_right IBR ON IBR.ID = SR.RIGHT_ID
2269 INNER JOIN b_task_operation T ON T.TASK_ID = IBR.TASK_ID
2270 INNER JOIN b_operation O ON O.ID = T.OPERATION_ID
2271 ".($iUserID > 0?
"LEFT":
"INNER").
" JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = ".$iUserID.
"
2272 WHERE SR.SECTION_ID = BS.ID
2273 AND O.NAME = '".$operation.
"'
2274 ".($bAuthorized || $iUserID > 0?
"
2275 AND (UA.USER_ID IS NOT NULL
2276 ".($bAuthorized?
"OR IBR.GROUP_CODE = 'AU'":
"").
"
2277 ".($iUserID > 0?
"OR (IBR.GROUP_CODE = 'CR' AND BS.CREATED_BY = ".$iUserID.
")":
"").
"
2282 B.ID IN ($stdPermissions)
2283 OR (B.RIGHTS_MODE = 'E' AND EXISTS ($extPermissions))
2289 B.ID IN ($stdPermissions)
2302 $bCheckPermissions = !array_key_exists(
"CHECK_PERMISSIONS",
$arFilter) ||
$arFilter[
"CHECK_PERMISSIONS"]!==
"N";
2303 $bIsAdmin = is_object(
$USER) &&
$USER->IsAdmin();
2304 $permissionsBy =
null;
2305 if ($bCheckPermissions && isset(
$arFilter[
'PERMISSIONS_BY']))
2307 $permissionsBy = (int)
$arFilter[
'PERMISSIONS_BY'];
2308 if ($permissionsBy < 0)
2309 $permissionsBy =
null;
2311 if ($bCheckPermissions && ($permissionsBy !==
null || !$bIsAdmin))
2314 $arFilter[
'MIN_PERMISSION'] ?? CIBlockRights::PUBLIC_READ,
2318 unset($permissionsBy);
2321 foreach($arSqlSearch as
$i=>$strSearch)
2322 if($strSearch <>
'')
2323 $strSqlSearch .=
"\n\t\t\tAND (".$strSearch.
") ";
2326 SELECT COUNT(DISTINCT BS.ID) as C
2327 FROM b_iblock_section BS
2328 INNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID
2334 $res_cnt =
$res->Fetch();
2336 return (
int)($res_cnt[
"C"] ?? 0);
2341 if(preg_match(
"/^IBLOCK_(\d+)_SECTION$/", $entity_id, $match))
2343 return CIBlock::GetPermission($match[1]);
2353 $distance = (int)$distance;
2354 $arSection[
'LEFT_MARGIN'] += $distance;
2355 $arSection[
'RIGHT_MARGIN'] += $distance;
2359 UPDATE b_iblock_section SET
2360 TIMESTAMP_X=".(
$DB->type==
"ORACLE"?
"NULL":
"TIMESTAMP_X").
"
2361 ,GLOBAL_ACTIVE = 'Y'
2363 IBLOCK_ID = ".$arSection[
"IBLOCK_ID"].
"
2364 AND LEFT_MARGIN >= ".intval($arSection[
"LEFT_MARGIN"]).
"
2365 AND RIGHT_MARGIN <= ".intval($arSection[
"RIGHT_MARGIN"]).
"
2369 SELECT ID, LEFT_MARGIN, RIGHT_MARGIN
2370 FROM b_iblock_section
2371 WHERE IBLOCK_ID = ".$arSection[
"IBLOCK_ID"].
"
2372 AND LEFT_MARGIN >= ".intval($arSection[
"LEFT_MARGIN"]).
"
2373 AND RIGHT_MARGIN <= ".intval($arSection[
"RIGHT_MARGIN"]).
"
2375 ORDER BY LEFT_MARGIN
2377 $arUpdate =
array();
2379 $rsChildren =
$DB->Query($strSql);
2380 while($arChild = $rsChildren->Fetch())
2382 if($arChild[
"RIGHT_MARGIN"] > $prev_right)
2384 $prev_right = $arChild[
"RIGHT_MARGIN"];
2385 $arUpdate[] =
"(LEFT_MARGIN >= ".$arChild[
"LEFT_MARGIN"].
" AND RIGHT_MARGIN <= ".$arChild[
"RIGHT_MARGIN"].
")\n";
2388 if(
count($arUpdate) > 0)
2391 UPDATE b_iblock_section SET
2392 TIMESTAMP_X=".(
$DB->type==
"ORACLE"?
"NULL":
"TIMESTAMP_X").
"
2393 ,GLOBAL_ACTIVE = 'N'
2395 IBLOCK_ID = ".$arSection[
"IBLOCK_ID"].
"
2396 AND (".implode(
" OR ", $arUpdate).
")
2403 if (!isset(self::$arSectionPathCache[$sectionId]))
2405 self::$arSectionPathCache[$sectionId] =
'';
2409 $a[
'CODE'] = (string)
$a[
'CODE'];
2410 self::$arSectionCodeCache[
$a[
'ID']] = rawurlencode(
$a[
'CODE']);
2411 self::$arSectionPathCache[$sectionId] .= rawurlencode(
$a[
'CODE']) .
'/';
2414 self::$arSectionPathCache[$sectionId] = rtrim(self::$arSectionPathCache[$sectionId],
'/');
2416 return self::$arSectionPathCache[$sectionId];
2423 $sectionId = (int)$sectionId;
2424 if (!isset(self::$arSectionCodeCache[$sectionId]))
2426 self::$arSectionCodeCache[$sectionId] =
'';
2427 $res =
$DB->Query(
"SELECT IBLOCK_ID, CODE FROM b_iblock_section WHERE ID = ".$sectionId);
2432 self::$arSectionCodeCache[$sectionId] = rawurlencode((
string)
$a[
'CODE']);
2436 return self::$arSectionCodeCache[$sectionId];
2446 'TIMESTAMP_X_1' =>
'>=TIMESTAMP_X',
2447 'TIMESTAMP_X_2' =>
'<=TIMESTAMP_X',
2448 'DATE_CREATE_1' =>
'>=DATE_CREATE',
2449 'DATE_CREATE_2' =>
'<=DATE_CREATE',
2451 'EXTERNAL_ID' =>
'XML_ID',
2452 'MODIFIED_USER_ID' =>
'MODIFIED_BY',
2453 'CREATED_USER_ID' =>
'CREATED_BY',
2454 'DESCRIPTION' =>
'?SEARCHABLE_CONTENT',
2460 'DATE_ACTIVE_FROM_1' =>
'>=DATE_ACTIVE_FROM',
2461 'DATE_ACTIVE_FROM_2' =>
'<=DATE_ACTIVE_FROM',
2462 'DATE_ACTIVE_TO_1' =>
'>=DATE_ACTIVE_TO',
2463 'DATE_ACTIVE_TO_2' =>
'<=DATE_ACTIVE_TO',
2467 foreach (
$filter as $field => $value)
2469 $newField = $modifyList[$field] ?? $field;
2473 if (isset(
$result[
'CHECK_PERMISSIONS']))
2475 $result[
'MIN_PERMISSION'] =
$result[
'MIN_PERMISSION'] ?? CIBlockRights::PUBLIC_READ;
2477 if (isset(
$result[
'SECTION_ID']))
2479 if ((
string)
$result[
'SECTION_ID'] ===
'')
2486 if (
$result[
'SECTION_ID'] < 0)
2508 $prepared =
array();
2509 foreach (
$filter as $index => $value)
2511 if ($index ==
'ID' && (is_int($value) || is_string($value)))
2517 preg_match(
'/^(>=|<=|>|<|=|!=|)ID$/', $index, $prepared)
2525 elseif (($index ===
'SUBQUERY' || $index ===
'=SUBQUERY') && is_array($value))
2530 unset($index, $value);
2532 foreach(
$filter as $index => $value)
2534 $op = CIBlock::MkOperationFilter($index);
2536 strncmp($op[
'FIELD'],
'PROPERTY_', 9) == 0
2559 'SHOW_COUNTER' =>
true,
2560 'IBLOCK_SECTION_ID' =>
true,
2561 'SHOW_COUNTER_START' =>
true,
2562 'CHECK_BP_PERMISSIONS' =>
true,
2563 'CHECK_BP_VIRTUAL_PERMISSIONS' =>
true,
2564 'ACTIVE_FROM' =>
true,
2565 'ACTIVE_TO' =>
true,
2566 'DATE_ACTIVE_FROM' =>
true,
2567 'DATE_ACTIVE_TO' =>
true,
2568 'ACTIVE_DATE' =>
true,
2569 'RATING_USER_ID' =>
true,
2570 'WF_STATUS_ID' =>
true,
2571 'WF_LOCK_STATUS' =>
true,
2572 'WF_LAST_STATUS_ID' =>
true,
2573 'WF_PARENT_ELEMENT_ID' =>
true,
2574 'WF_COMMENTS' =>
true,
2575 'SEARCHABLE_CONTENT' =>
true,
2576 'INCLUDE_SUBSECTIONS' =>
true,
2579 foreach(
$filter as $index => $value)
2582 ($index ===
'=ID' && (is_int($value) || is_string($value)))
2589 $op = CIBlock::MkOperationFilter($index);
2590 $field = $op[
'FIELD'];
2591 if ($field ===
'SUBQUERY' && is_array($value))
2597 strncmp($field,
'PROPERTY_', 9) === 0
2598 || isset($blackList[$field])
2617 'GLOBAL_ACTIVE' =>
true,
2618 'DEPTH_LEVEL' =>
true,
2619 'SOCNET_GROUP_ID' =>
true,
2620 'RIGHT_MARGIN' =>
true,
2621 'LEFT_MARGIN' =>
true,
2622 'LEFT_BORDER' =>
true,
2623 'RIGHT_BORDER' =>
true,
2624 'HAS_ELEMENT' =>
true,
2626 foreach(
$filter as $index => $value)
2628 $op = CIBlock::MkOperationFilter($index);
2629 if (isset($blackList[$op[
'FIELD']]))
2657 $prepared =
array();
2658 foreach (array_keys(
$filter) as $index)
2662 if (preg_match(
'/^(>=|<=|>|<|=|!=)ID$/', $index, $prepared))
2677 return $value !==
null;
2695 if (
$arFields[
"IBLOCK_SECTION_ID"] !==
false)
2698 SELECT BS.ID, BS.ACTIVE, BS.GLOBAL_ACTIVE, BS.DEPTH_LEVEL, BS.LEFT_MARGIN, BS.RIGHT_MARGIN
2699 FROM b_iblock_section BS
2700 WHERE BS.IBLOCK_ID = ".$IBLOCK_ID.
"
2701 AND BS.ID = ".
$arFields[
"IBLOCK_SECTION_ID"].
"
2703 $rsParent =
$DB->Query($strSql);
2704 $arParent = $rsParent->Fetch();
2712 SELECT BS.ID, BS.RIGHT_MARGIN, BS.GLOBAL_ACTIVE, BS.DEPTH_LEVEL
2713 FROM b_iblock_section BS
2714 WHERE BS.IBLOCK_ID = ".$IBLOCK_ID.
"
2715 AND ".(
$arFields[
"IBLOCK_SECTION_ID"] !==
false ?
"BS.IBLOCK_SECTION_ID=".$arFields[
"IBLOCK_SECTION_ID"] :
"BS.IBLOCK_SECTION_ID IS NULL").
"
2717 (BS.SORT < ".$SORT.
")
2718 OR (BS.SORT = ".$SORT.
" AND BS.NAME < '".
$DB->ForSQL($NAME).
"')
2720 AND BS.ID <> ".
$ID.
"
2721 ORDER BY BS.SORT DESC, BS.NAME DESC
2723 $rsChild =
$DB->Query($strSql);
2725 if ($arChild = $rsChild->Fetch())
2729 "LEFT_MARGIN" => (
int)$arChild[
"RIGHT_MARGIN"] + 1,
2730 "RIGHT_MARGIN" => (
int)$arChild[
"RIGHT_MARGIN"] + 2,
2731 "DEPTH_LEVEL" => (
int)$arChild[
"DEPTH_LEVEL"],
2741 $arUpdate[
"GLOBAL_ACTIVE"] = $arParent[
"GLOBAL_ACTIVE"] ==
"Y" ?
"Y" :
"N";
2745 $arUpdate[
"GLOBAL_ACTIVE"] =
"Y";
2750 $arUpdate[
"GLOBAL_ACTIVE"] =
"N";
2759 "LEFT_MARGIN" => (
int)$arParent[
"LEFT_MARGIN"] + 1,
2760 "RIGHT_MARGIN" => (
int)$arParent[
"LEFT_MARGIN"] + 2,
2761 "GLOBAL_ACTIVE" => ($arParent[
"GLOBAL_ACTIVE"] ==
"Y") && (
$arFields[
"ACTIVE"] !=
"N") ?
"Y" :
"N",
2762 "DEPTH_LEVEL" => (
int)$arParent[
"DEPTH_LEVEL"] + 1,
2770 "RIGHT_MARGIN" => 2,
2771 "GLOBAL_ACTIVE" =>
$arFields[
"ACTIVE"] !=
"N" ?
"Y" :
"N",
2778 UPDATE b_iblock_section SET
2779 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2780 ,LEFT_MARGIN = ".$arUpdate[
"LEFT_MARGIN"].
"
2781 ,RIGHT_MARGIN = ".$arUpdate[
"RIGHT_MARGIN"].
"
2782 ,DEPTH_LEVEL = ".$arUpdate[
"DEPTH_LEVEL"].
"
2783 ,GLOBAL_ACTIVE = '".$arUpdate[
"GLOBAL_ACTIVE"].
"'
2789 UPDATE b_iblock_section SET
2790 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2791 ,LEFT_MARGIN = LEFT_MARGIN + 2
2792 ,RIGHT_MARGIN = RIGHT_MARGIN + 2
2795 AND LEFT_MARGIN >= ".$arUpdate[
"LEFT_MARGIN"].
"
2802 UPDATE b_iblock_section SET
2803 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2804 ,RIGHT_MARGIN = RIGHT_MARGIN + 2
2807 AND LEFT_MARGIN <= ".$arParent[
"LEFT_MARGIN"].
"
2808 AND RIGHT_MARGIN >= ".$arParent[
"RIGHT_MARGIN"].
"
2821 if (empty(
$arFields) || empty($db_record))
2833 || (isset(
$arFields[
"IBLOCK_SECTION_ID"]) &&
$arFields[
"IBLOCK_SECTION_ID"] != $db_record[
"IBLOCK_SECTION_ID"]))
2836 $distance = (int)$db_record[
"RIGHT_MARGIN"] - (
int)$db_record[
"LEFT_MARGIN"] + 1;
2838 UPDATE b_iblock_section SET
2839 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2840 ,LEFT_MARGIN = -LEFT_MARGIN
2841 ,RIGHT_MARGIN = -RIGHT_MARGIN
2843 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2844 AND LEFT_MARGIN >= ".(
int)$db_record[
"LEFT_MARGIN"].
"
2845 AND LEFT_MARGIN <= ".(
int)$db_record[
"RIGHT_MARGIN"].
"
2849 UPDATE b_iblock_section SET
2850 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2851 ,RIGHT_MARGIN = RIGHT_MARGIN - ".$distance.
"
2853 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2854 AND RIGHT_MARGIN > ".$db_record[
"RIGHT_MARGIN"].
"
2858 UPDATE b_iblock_section SET
2859 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2860 ,LEFT_MARGIN = LEFT_MARGIN - ".$distance.
"
2862 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2863 AND LEFT_MARGIN > ".$db_record[
"LEFT_MARGIN"].
"
2868 $PARENT_ID = (int)(
$arFields[
"IBLOCK_SECTION_ID"] ?? $db_record[
"IBLOCK_SECTION_ID"]);
2869 $NAME =
$arFields[
"NAME"] ?? $db_record[
"NAME"];
2870 $SORT = (int)(
$arFields[
"SORT"] ?? $db_record[
"SORT"]);
2872 $arParents =
array();
2874 SELECT BS.ID, BS.ACTIVE, BS.GLOBAL_ACTIVE, BS.DEPTH_LEVEL, BS.LEFT_MARGIN, BS.RIGHT_MARGIN
2875 FROM b_iblock_section BS
2876 WHERE BS.IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2877 AND BS.ID in (".(int)$db_record[
"IBLOCK_SECTION_ID"].
", ".$PARENT_ID.
")
2879 $rsParents =
$DB->Query($strSql);
2880 while ($arParent = $rsParents->Fetch())
2882 $arParents[$arParent[
"ID"]] = $arParent;
2887 SELECT BS.ID, BS.RIGHT_MARGIN, BS.DEPTH_LEVEL
2888 FROM b_iblock_section BS
2889 WHERE BS.IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2890 AND ".($PARENT_ID > 0 ?
"BS.IBLOCK_SECTION_ID=".$PARENT_ID :
"BS.IBLOCK_SECTION_ID IS NULL").
"
2892 (BS.SORT < ".$SORT.
")
2893 OR (BS.SORT = ".$SORT.
" AND BS.NAME < '".
$DB->ForSQL($NAME).
"')
2895 AND BS.ID <> ".
$ID.
"
2896 ORDER BY BS.SORT DESC, BS.NAME DESC
2898 $rsChild =
$DB->Query($strSql);
2899 if ($arChild = $rsChild->Fetch())
2903 "LEFT_MARGIN" => (
int)$arChild[
"RIGHT_MARGIN"] + 1,
2904 "DEPTH_LEVEL" => (
int)$arChild[
"DEPTH_LEVEL"],
2910 if (isset($arParents[$PARENT_ID]) && $arParents[$PARENT_ID])
2913 "LEFT_MARGIN" => (
int)$arParents[$PARENT_ID][
"LEFT_MARGIN"] + 1,
2914 "DEPTH_LEVEL" => (
int)$arParents[$PARENT_ID][
"DEPTH_LEVEL"] + 1,
2927 $move_distance = (int)$db_record[
"LEFT_MARGIN"] - $arUpdate[
"LEFT_MARGIN"];
2930 UPDATE b_iblock_section SET
2931 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2932 ,LEFT_MARGIN = LEFT_MARGIN + ".$distance.
"
2933 ,RIGHT_MARGIN = RIGHT_MARGIN + ".$distance.
"
2935 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2936 AND LEFT_MARGIN >= ".$arUpdate[
"LEFT_MARGIN"].
"
2940 UPDATE b_iblock_section SET
2941 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2942 ,LEFT_MARGIN = -LEFT_MARGIN - ".$move_distance.
"
2943 ,RIGHT_MARGIN = -RIGHT_MARGIN - ".$move_distance.
"
2944 ".($arUpdate[
"DEPTH_LEVEL"] != (
int)$db_record[
"DEPTH_LEVEL"] ?
",DEPTH_LEVEL = DEPTH_LEVEL - ".($db_record[
"DEPTH_LEVEL"] - $arUpdate[
"DEPTH_LEVEL"]) :
"").
"
2946 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2947 AND LEFT_MARGIN <= ".(-(
int)$db_record[
"LEFT_MARGIN"]).
"
2948 AND LEFT_MARGIN >= ".(-(
int)$db_record[
"RIGHT_MARGIN"]).
"
2951 if (isset($arParents[$PARENT_ID]))
2954 UPDATE b_iblock_section SET
2955 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
2956 ,RIGHT_MARGIN = RIGHT_MARGIN + ".$distance.
"
2958 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
2959 AND LEFT_MARGIN <= ".$arParents[$PARENT_ID][
"LEFT_MARGIN"].
"
2960 AND RIGHT_MARGIN >= ".$arParents[$PARENT_ID][
"RIGHT_MARGIN"].
"
2966 if (isset(
$arFields[
"IBLOCK_SECTION_ID"]) &&
$arFields[
"IBLOCK_SECTION_ID"] != $db_record[
"IBLOCK_SECTION_ID"])
2968 $rsSection = CIBlockSection::GetList(
2970 array(
"ID" =>
$ID,
"CHECK_PERMISSIONS" =>
"N"),
2973 "ID",
"IBLOCK_ID",
"IBLOCK_SECTION_ID",
2974 "LEFT_MARGIN",
"RIGHT_MARGIN",
2975 "ACTIVE",
"GLOBAL_ACTIVE"
2979 $arSection = $rsSection->Fetch();
2983 SELECT ID, GLOBAL_ACTIVE
2984 FROM b_iblock_section
2985 WHERE IBLOCK_ID = ".$arSection[
"IBLOCK_ID"].
"
2986 AND ID = ".(int)
$arFields[
"IBLOCK_SECTION_ID"].
"
2988 $rsParent =
$DB->Query($strSql);
2989 $arParent = $rsParent->Fetch();
2996 ($arParent && $arParent[
'GLOBAL_ACTIVE'] ===
'N')
3001 UPDATE b_iblock_section SET
3002 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
3003 ,GLOBAL_ACTIVE = 'N'
3005 IBLOCK_ID = ".$arSection[
"IBLOCK_ID"].
"
3006 AND LEFT_MARGIN >= ".(
int)$arSection[
"LEFT_MARGIN"].
"
3007 AND RIGHT_MARGIN <= ".(
int)$arSection[
"RIGHT_MARGIN"].
"
3014 $arSection[
'ACTIVE'] ===
'N'
3018 static::RecalcGlobalActiveFlag($arSection);
3024 (!$arParent || $arParent[
'GLOBAL_ACTIVE'] ===
'Y')
3025 && $arSection[
'GLOBAL_ACTIVE'] ===
'N'
3027 $arSection[
'ACTIVE'] ===
'Y'
3032 static::RecalcGlobalActiveFlag($arSection);
3044 UPDATE b_iblock_section SET
3045 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
3046 ,GLOBAL_ACTIVE = 'N'
3048 IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
3049 AND LEFT_MARGIN >= ".(
int)$db_record[
"LEFT_MARGIN"].
"
3050 AND RIGHT_MARGIN <= ".(
int)$db_record[
"RIGHT_MARGIN"].
"
3057 SELECT ID, GLOBAL_ACTIVE
3058 FROM b_iblock_section
3059 WHERE IBLOCK_ID = ".$db_record[
"IBLOCK_ID"].
"
3060 AND ID = ".(int)$db_record[
"IBLOCK_SECTION_ID"].
"
3062 $rsParent =
$DB->Query($strSql);
3063 $arParent = $rsParent->Fetch();
3068 if (!$arParent || $arParent[
"GLOBAL_ACTIVE"] ==
"Y")
3070 static::RecalcGlobalActiveFlag($db_record, -$move_distance);
3104 if (($ss[
"RIGHT_MARGIN"] > 0) && ($ss[
"LEFT_MARGIN"] > 0))
3107 UPDATE b_iblock_section SET
3108 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
3109 ,RIGHT_MARGIN = RIGHT_MARGIN - 2
3111 IBLOCK_ID = ".$ss[
"IBLOCK_ID"].
"
3112 AND RIGHT_MARGIN > ".$ss[
"RIGHT_MARGIN"].
"
3116 UPDATE b_iblock_section SET
3117 TIMESTAMP_X=".(
$DB->type ==
"ORACLE" ?
"NULL" :
"TIMESTAMP_X").
"
3118 ,LEFT_MARGIN = LEFT_MARGIN - 2
3120 IBLOCK_ID = ".$ss[
"IBLOCK_ID"].
"
3121 AND LEFT_MARGIN > ".$ss[
"LEFT_MARGIN"].
"
3133 if ($this->iblock !==
null && $this->iblock[
'ID'] ===
$iblockId)
3149 $language = static::getIblockLanguage(
$iblock[
'ID']);
3159 if (isset(
$iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
3161 if (
$iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION'] ===
'Y'
3162 &&
$iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'USE_GOOGLE'] ===
'N'
3166 $config[
'LANGUAGE_ID'] = $language;
3169 if (
$config[
'LANGUAGE_ID'] !==
null)
3172 'max_len' =>
$config[
'TRANS_LEN'],
3173 'change_case' =>
$config[
'TRANS_CASE'],
3174 'replace_space' =>
$config[
'TRANS_SPACE'],
3175 'replace_other' =>
$config[
'TRANS_OTHER'],
3176 'delete_repeat_replace' => (
$config[
'TRANS_EAT'] ==
'Y'),
3197 if ($sectionId !==
null)
3208 return !empty($row);
3213 if (!isset($section[
'NAME']) || $section[
'NAME'] ===
'')
3227 if ($this->iblock !==
null && $this->iblock[
'ID'] ===
$iblockId)
3242 if (isset(
$iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE']))
3250 if (
$iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'TRANSLITERATION'] ===
'Y'
3252 $iblock[
'FIELDS'][
'SECTION_CODE'][
'DEFAULT_VALUE'][
'UNIQUE'] ===
'Y'
3253 || (
$options[
'CHECK_UNIQUE'] ??
'N') ===
'Y'
3257 $id = (int)($section[
'ID'] ??
null);
3267 $checkSimilar = (
$options[
'CHECK_SIMILAR'] ??
'N') ===
'Y';
3271 'select' => [
'ID',
'CODE'],
3274 '%=CODE' =>
$code .
'%',
3279 if ($checkSimilar && $id === (
int)$row[
'ID'])
3283 $list[$row[
'CODE']] =
true;
3287 if (isset($list[
$code]))
3291 while (isset($list[
$code .
$i]))
3308 $iterator = Iblock\IblockSiteTable::getList([
3309 'select' => [
'LANGUAGE_ID' =>
'SITE.LANGUAGE_ID'],
3314 $result[$row[
'LANGUAGE_ID']] =
true;
if($strVal !='') $sectionFields
if($canUseYandexMarket) $strWarning
static markAsInvalid($iblockId)
static makeFileName(\Bitrix\Iblock\InheritedProperty\BaseTemplate $ipropTemplates, string $templateName, array $fields, array $file)
static getConnection($name="")
static includeModule($moduleName)
static getList(array $parameters=array())
static GetTreeList($arFilter=array(), $arSelect=array())
static $arSectionCodeCache
setIblock(?int $iblockId)
createMnemonicCode(array $section, array $options=[])
isExistsMnemonicCode(string $code, ?int $sectionId, int $iblockId)
static UserTypeRightsCheck($entity_id)
static getSectionCodePath($sectionId)
static TreeReSort($IBLOCK_ID, $ID=0, $cnt=0, $depth=0, $ACTIVE="Y")
static getIblockLanguage(int $iblockId)
static GetNavChain($IBLOCK_ID, $SECTION_ID, $arSelect=array(), $arrayResult=false)
CheckFields(&$arFields, $ID=false)
static recountTreeAfterAdd(array $arFields)
static GetFilter($arFilter=Array())
static GetCount($arFilter=[])
static $arSectionPathCache
static getSectionCode($sectionId)
string $currentDateTimeFunction
static recountTreeOnDelete(array $arFields)
static getElementInherentFilter(array $filter)
static recountTreeAfterUpdate(array $arFields, array $db_record)
static GetSectionElementsCount($ID, $arFilter=Array())
static GetMixedList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $bIncCnt=false, $arSelectedFields=false)
static ReSort($IBLOCK_ID, $ID=0, $cnt=0, $depth=0, $ACTIVE="Y")
static normalizeMixedFilter(array $filter)
static Delete($ID, $bCheckPermissions=true)
Update($ID, $arFields, $bResort=true, $bUpdateSearch=true, $bResizePictures=false)
static getPreparedFilterById(array $filter)
Add($arFields, $bResort=true, $bUpdateSearch=true, $bResizePictures=false)
static $arSectionNavChainCache
static checkLoadSections(array $filter)
static RecalcGlobalActiveFlag($arSection, $distance=0)
generateMnemonicCode(string $name, int $iblockId, array $options=[])
static checkLoadElements(array $filter)
static _check_rights_sql($min_permission, $permissionsBy=null)
UpdateSearch($ID, $bOverWrite=false)
static DeleteIndex($MODULE_ID, $ITEM_ID=false, $PARAM1=false, $PARAM2=false, $SITE_ID=false)
static Index($MODULE_ID, $ITEM_ID, $arFields, $bOverWrite=false, $SEARCH_SESS_ID='')
static recalculateDb(bool $mode=true)
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
static GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $bIncCnt=false, $arSelect=array(), $arNavStartParams=false)
static isValidField(string $field)
static isRealFilterField(string $field)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
ExecuteModuleEventEx($arEvent, $arParams=[])
HTMLToTxt($str, $strSiteUrl="", $aDelete=[], $maxlen=70)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Rel2Abs($curdir, $relpath)
GetMessage($name, $aReplace=null)
$GLOBALS['____1690880296']
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"