1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
iblockproperty.php
См. документацию.
1<?php
2
5
9
11{
12 public string $LAST_ERROR = '';
13
14 public static function GetList($arOrder=Array(), $arFilter=Array())
15 {
16 global $DB;
17
18 $strSql = "
19 SELECT BP.*
20 FROM b_iblock_property BP
21 ";
22
23 $bJoinIBlock = false;
24 $arSqlSearch = array();
25 foreach($arFilter as $key => $val)
26 {
27 $val = $DB->ForSql($val);
28 $key = mb_strtoupper($key);
29
30 switch($key)
31 {
32 case "ACTIVE":
33 case "SEARCHABLE":
34 case "FILTRABLE":
35 case "IS_REQUIRED":
36 case "MULTIPLE":
37 if($val=="Y" || $val=="N")
38 $arSqlSearch[] = "BP.".$key." = '".$val."'";
39 break;
40 case "?CODE":
41 case "?NAME":
42 $arSqlSearch[] = CIBlock::FilterCreate("BP.".mb_substr($key, 1), $val, "string", "E");
43 break;
44 case "CODE":
45 case "NAME":
46 $arSqlSearch[] = "UPPER(BP.".$key.") LIKE UPPER('".$val."')";
47 break;
48 case "XML_ID":
49 case "EXTERNAL_ID":
50 $arSqlSearch[] = "BP.XML_ID LIKE '".$val."'";
51 break;
52 case "!XML_ID":
53 case "!EXTERNAL_ID":
54 $arSqlSearch[] = "(BP.XML_ID IS NULL OR NOT (BP.XML_ID LIKE '".$val."'))";
55 break;
56 case "TMP_ID":
57 $arSqlSearch[] = "BP.TMP_ID LIKE '".$val."'";
58 break;
59 case "!TMP_ID":
60 $arSqlSearch[] = "(BP.TMP_ID IS NULL OR NOT (BP.TMP_ID LIKE '".$val."'))";
61 break;
62 case "PROPERTY_TYPE":
63 $ar = explode(":", $val);
64 if (count($ar) == 2)
65 {
66 $val = $ar[0];
67 $arSqlSearch[] = "BP.USER_TYPE = '".$ar[1]."'";
68 }
69 $arSqlSearch[] = "BP.".$key." = '".$val."'";
70 break;
71 case "USER_TYPE":
72 $arSqlSearch[] = "BP.".$key." = '".$val."'";
73 break;
74 case "ID":
75 case "IBLOCK_ID":
76 case "LINK_IBLOCK_ID":
77 case "VERSION":
78 $arSqlSearch[] = "BP.".$key." = ".(int)$val;
79 break;
80 case "IBLOCK_CODE":
81 $arSqlSearch[] = "UPPER(B.CODE) = UPPER('".$val."')";
82 $bJoinIBlock = true;
83 break;
84 }
85 }
86
87 if($bJoinIBlock)
88 $strSql .= "
89 INNER JOIN b_iblock B ON B.ID = BP.IBLOCK_ID
90 ";
91
92 if(!empty($arSqlSearch))
93 $strSql .= "
94 WHERE ".implode("\n\t\t\t\tAND ", $arSqlSearch)."
95 ";
96
97 $allowKeys = array(
98 "ID" => true,
99 "IBLOCK_ID" => true,
100 "NAME" => true,
101 "ACTIVE" => true,
102 "SORT" => true,
103 "FILTRABLE" => true,
104 "SEARCHABLE" => true
105 );
106 $orderKeys = array();
107 $arSqlOrder = array();
108 foreach($arOrder as $by => $order)
109 {
110 $by = mb_strtoupper($by);
111 if (!isset($allowKeys[$by]))
112 $by = "TIMESTAMP_X";
113 if (isset($orderKeys[$by]))
114 continue;
115 $orderKeys[$by] = true;
116 $order = mb_strtoupper($order) == "ASC"? "ASC": "DESC";
117
118 $arSqlOrder[] = "BP.".$by." ".$order;
119 }
120
121 if(!empty($arSqlOrder))
122 $strSql .= "
123 ORDER BY ".implode(", ", $arSqlOrder)."
124 ";
125
126 $res = $DB->Query($strSql);
127
128 return new CIBlockPropertyResult($res);
129 }
130
132 // Delete by property ID
134 public static function Delete($ID)
135 {
136 global $DB, $APPLICATION;
137 $ID = (int)$ID;
138 if ($ID <= 0)
139 {
140 return false;
141 }
142
143 $APPLICATION->ResetException();
144 foreach (GetModuleEvents("iblock", "OnBeforeIBlockPropertyDelete", true) as $arEvent)
145 {
146 if(ExecuteModuleEventEx($arEvent, array($ID))===false)
147 {
148 if($ex = $APPLICATION->GetException())
149 {
150 $APPLICATION->ThrowException($ex->GetString());
151 }
152 else
153 {
154 $APPLICATION->ThrowException(GetMessage("MAIN_BEFORE_DEL_ERR1"));
155 }
156
157 return false;
158 }
159 }
160
161 foreach (GetModuleEvents("iblock", "OnIBlockPropertyDelete", true) as $arEvent)
162 ExecuteModuleEventEx($arEvent, array($ID));
163
165 return false;
166
167 CIBlockSectionPropertyLink::DeleteByProperty($ID);
169
170 $rsProperty = CIBlockProperty::GetByID($ID);
171 $arProperty = $rsProperty->Fetch();
172 if($arProperty["VERSION"] == 2)
173 {
174 if($arProperty["PROPERTY_TYPE"]=="F")
175 {
176 if($arProperty["MULTIPLE"]=="Y")
177 {
178 $strSql = "
179 SELECT VALUE
180 FROM b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
181 WHERE IBLOCK_PROPERTY_ID=".$ID."
182 ";
183 }
184 else
185 {
186 $strSql = "
187 SELECT PROPERTY_".$ID." VALUE
188 FROM b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
189 WHERE PROPERTY_".$ID." is not null
190 ";
191 }
192 $res = $DB->Query($strSql);
193 while($arr = $res->Fetch())
194 CFile::Delete($arr["VALUE"]);
195 }
196 if(!$DB->Query("DELETE FROM b_iblock_section_element WHERE ADDITIONAL_PROPERTY_ID=".$ID, true))
197 return false;
198 $strSql = "
199 DELETE
200 FROM b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
201 WHERE IBLOCK_PROPERTY_ID=".$ID."
202 ";
203 if(!$DB->Query($strSql))
204 return false;
205 $arSql = CIBlockProperty::DropColumnSQL("b_iblock_element_prop_s".$arProperty["IBLOCK_ID"], array("PROPERTY_".$ID,"DESCRIPTION_".$ID));
206 foreach($arSql as $strSql)
207 {
208 if(!$DB->DDL($strSql))
209 return false;
210 }
211 }
212 else
213 {
214 $res = $DB->Query("SELECT EP.VALUE FROM b_iblock_property P, b_iblock_element_property EP WHERE P.ID=".$ID." AND P.ID=EP.IBLOCK_PROPERTY_ID AND P.PROPERTY_TYPE='F'");
215 while($arr = $res->Fetch())
216 CFile::Delete($arr["VALUE"]);
217 if(!$DB->Query("DELETE FROM b_iblock_section_element WHERE ADDITIONAL_PROPERTY_ID=".$ID, true))
218 return false;
219 if(!$DB->Query("DELETE FROM b_iblock_element_property WHERE IBLOCK_PROPERTY_ID=".$ID, true))
220 return false;
221 }
222
223 $seq = new CIBlockSequence($arProperty["IBLOCK_ID"], $ID);
224 $seq->Drop();
225
226 CIBlock::clearIblockTagCache($arProperty["IBLOCK_ID"]);
227
229
230 $res = $DB->Query("DELETE FROM b_iblock_property WHERE ID=".$ID, true);
231
232 foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyDelete", true) as $arEvent)
233 ExecuteModuleEventEx($arEvent, array($arProperty));
234
235 return $res;
236 }
237
238 // Add
240 public function Add($arFields)
241 {
242 global $DB;
243
244 if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
245 $arFields["ACTIVE"]="N";
246 if(!isset($arFields["SEARCHABLE"]) || $arFields["SEARCHABLE"] != "Y")
247 $arFields["SEARCHABLE"]="N";
248 if(!isset($arFields["FILTRABLE"]) || $arFields["FILTRABLE"] != "Y")
249 $arFields["FILTRABLE"]="N";
250 if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!="Y")
251 $arFields["MULTIPLE"]="N";
252 if(is_set($arFields, "LIST_TYPE") && $arFields["LIST_TYPE"]!="C")
253 $arFields["LIST_TYPE"]="L";
254 $arFields['IS_REQUIRED'] = ($arFields['IS_REQUIRED'] ?? 'N') === 'Y' ? 'Y' : 'N';
255
256 if(!$this->CheckFields($arFields))
257 {
258 $Result = false;
259 $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
260 }
261 else
262 {
263 $arFields["VERSION"] = CIBlockElement::GetIBVersion($arFields["IBLOCK_ID"]);
264 unset($arFields["ID"]);
265 if (isset($arFields['USER_TYPE']))
266 {
267 $arUserType = [];
268 $userTypeId = (string)$arFields['USER_TYPE'];
269 if ($userTypeId !== '')
270 {
271 $arUserType = CIBlockProperty::GetUserType($userTypeId);
272 }
273 if (isset($arUserType['ConvertToDB']))
274 {
275 $arValue = [
276 'VALUE' => $arFields['DEFAULT_VALUE'],
277 'DEFAULT_VALUE' => true,
278 ];
279 $arValue = call_user_func_array(
280 $arUserType['ConvertToDB'],
281 [$arFields, $arValue]
282 );
283 $arFields['DEFAULT_VALUE'] = $this->prepareDefaultValue($arValue);
284 unset($arValue);
285 }
286 if (isset($arUserType['PrepareSettings']))
287 {
288 $arFieldsResult = call_user_func_array(
289 $arUserType['PrepareSettings'],
290 [$arFields]
291 );
292 if (is_array($arFieldsResult) && array_key_exists('USER_TYPE_SETTINGS', $arFieldsResult))
293 {
294 $arFields = array_merge($arFields, $arFieldsResult);
295 $arFields['USER_TYPE_SETTINGS'] = serialize($arFields['USER_TYPE_SETTINGS']);
296 }
297 else
298 {
299 $arFields['USER_TYPE_SETTINGS'] = serialize($arFieldsResult);
300 }
301 }
302 else
303 {
304 $arFields['USER_TYPE_SETTINGS'] = false;
305 }
306 }
307 else
308 {
309 $arFields['USER_TYPE_SETTINGS'] = false;
310 }
311
312 unset($arFields['TIMESTAMP_X']);
314 $helper = $connection->getSqlHelper();
315 $arFields['~TIMESTAMP_X'] = $helper->getCurrentDateTimeFunction();
316 unset($helper, $connection);
317
318 $ID = $DB->Add("b_iblock_property", $arFields, array('USER_TYPE_SETTINGS'), "iblock");
319
320 if($arFields["VERSION"]==2)
321 {
322 if($this->_Add($ID, $arFields))
323 {
324 $Result = $ID;
325 $arFields["ID"] = &$ID;
326 }
327 else
328 {
329 $DB->Query("DELETE FROM b_iblock_property WHERE ID = ".(int)$ID);
330 $this->LAST_ERROR = GetMessage("IBLOCK_PROPERTY_ADD_ERROR",array(
331 "#ID#"=>$ID,
332 "#CODE#"=>"[14]".$DB->GetErrorSQL(),
333 ));
334 $Result = false;
335 $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
336 }
337 }
338 else
339 {
340 $Result = $ID;
341 $arFields["ID"] = &$ID;
342 }
343
344 if($Result)
345 {
346 if(array_key_exists("VALUES", $arFields))
347 $this->UpdateEnum($ID, $arFields["VALUES"]);
348
349 if(CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y")
350 {
351 if(
352 !array_key_exists("SECTION_PROPERTY", $arFields)
353 || $arFields["SECTION_PROPERTY"] !== "N"
354 )
355 {
356 $arLink = array(
357 "SMART_FILTER" => $arFields["SMART_FILTER"] ?? null,
358 );
359 if (array_key_exists("DISPLAY_TYPE", $arFields))
360 $arLink["DISPLAY_TYPE"] = $arFields["DISPLAY_TYPE"];
361 if (array_key_exists("DISPLAY_EXPANDED", $arFields))
362 $arLink["DISPLAY_EXPANDED"] = $arFields["DISPLAY_EXPANDED"];
363 if (array_key_exists("FILTER_HINT", $arFields))
364 $arLink["FILTER_HINT"] = $arFields["FILTER_HINT"];
365 CIBlockSectionPropertyLink::Add(0, $ID, $arLink);
366 }
367 }
368
369 if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
370 {
372 $ID,
373 $arFields['FEATURES']
374 );
375 //TODO: add error handling
376 unset($featureResult);
377 }
378
380 }
381 }
382
384 if (isset($arFields["IBLOCK_ID"]))
385 {
386 unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]);
387 CIBlock::clearIblockTagCache($arFields["IBLOCK_ID"]);
388 }
389
390 $arFields["RESULT"] = &$Result;
391
392 foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyAdd", true) as $arEvent)
394
395 return $Result;
396 }
397
398 // This one called before any Update or Add
400 public function CheckFields(&$arFields, $ID=false, $bFormValidate=false)
401 {
402 global $APPLICATION;
403 $this->LAST_ERROR = "";
404 if ($ID===false || array_key_exists("NAME", $arFields))
405 {
406 if ($arFields["NAME"] == '')
407 $this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_BAD_NAME")."<br>";
408 }
409
410 if(array_key_exists("CODE", $arFields) && mb_strlen($arFields["CODE"]))
411 {
412 if(mb_strpos("0123456789", mb_substr($arFields["CODE"], 0, 1)) !== false)
413 $this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_CODE_FIRST_LETTER").": ".htmlspecialcharsbx($arFields["CODE"])."<br>";
414 if(preg_match("/[^A-Za-z0-9_]/", $arFields["CODE"]))
415 $this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_WRONG_CODE").": ".htmlspecialcharsbx($arFields["CODE"])."<br>";
416 }
417
418 if(!$bFormValidate)
419 {
420 if($ID===false && !is_set($arFields, "IBLOCK_ID"))
421 $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."<br>";
422
423 if(is_set($arFields, "IBLOCK_ID"))
424 {
425 $arFields["IBLOCK_ID"] = (int)$arFields["IBLOCK_ID"];
426 $r = CIBlock::GetList(array(), array("ID"=>$arFields["IBLOCK_ID"], "CHECK_PERMISSIONS" => "N"));
427 if(!$r->Fetch())
428 $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."<br>";
429 }
430 }
431
432 if (isset($arFields['USER_TYPE']))
433 {
434 if ($ID === false)
435 {
436 $arFields['DEFAULT_VALUE'] ??= false;
437 }
438 $arUserType = CIBlockProperty::GetUserType($arFields['USER_TYPE']);
439 if (
440 isset($arUserType['CheckFields'])
441 && ($ID === false || array_key_exists('DEFAULT_VALUE', $arFields))
442 )
443 {
444 $value = [
445 'VALUE' => $arFields['DEFAULT_VALUE'],
446 ];
447 $arError = call_user_func_array(
448 $arUserType['CheckFields'],
449 [
450 $arFields,
451 $value
452 ]
453 );
454 if (!empty($arError) && is_array($arError))
455 {
456 $this->LAST_ERROR .= implode('<br>', $arError) . '<br>';
457 }
458 }
459 }
460
461 if (
462 $ID === false
463 )
464 {
465 $simpleType = true;
466 $userTypeId = (string)($arFields['USER_TYPE'] ?? '');
467 if ($userTypeId !== '')
468 {
469 $userType = CIBlockProperty::GetUserType($userTypeId);
470 $simpleType = empty($userType);
471 }
472 if ($simpleType && isset($arFields['DEFAULT_VALUE']) && !is_scalar($arFields['DEFAULT_VALUE']))
473 {
474 $this->LAST_ERROR .= GetMessage('IBLOCK_PROPERTY_BAD_DEFAULT_VALUE') . '<br>';
475 }
476 }
477
478 if(!$bFormValidate)
479 {
480 $APPLICATION->ResetException();
481 if($ID===false)
482 {
483 $db_events = GetModuleEvents("iblock", "OnBeforeIBlockPropertyAdd", true);
484 }
485 else
486 {
487 $arFields["ID"] = $ID;
488 $db_events = GetModuleEvents("iblock", "OnBeforeIBlockPropertyUpdate", true);
489 }
490
491 foreach($db_events as $arEvent)
492 {
493 $bEventRes = ExecuteModuleEventEx($arEvent, array(&$arFields));
494 if($bEventRes===false)
495 {
496 if($err = $APPLICATION->GetException())
497 {
498 $this->LAST_ERROR .= $err->GetString()."<br>";
499 }
500 else
501 {
502 $APPLICATION->ThrowException("Unknown error");
503 $this->LAST_ERROR .= "Unknown error.<br>";
504 }
505 break;
506 }
507 }
508 }
509
510 return $this->LAST_ERROR === '';
511 }
512
514 // Update method
516 public function Update($ID, $arFields, $bCheckDescription = false)
517 {
518 global $DB;
519 $ID = (int)$ID;
520
521 if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
522 $arFields["ACTIVE"]="N";
523 if(is_set($arFields, "SEARCHABLE") && $arFields["SEARCHABLE"]!="Y")
524 $arFields["SEARCHABLE"]="N";
525 if(is_set($arFields, "FILTRABLE") && $arFields["FILTRABLE"]!="Y")
526 $arFields["FILTRABLE"]="N";
527 if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!="Y")
528 $arFields["MULTIPLE"]="N";
529 if(is_set($arFields, "LIST_TYPE") && $arFields["LIST_TYPE"]!="C")
530 $arFields["LIST_TYPE"]="L";
531
532 if(!$this->CheckFields($arFields, $ID))
533 {
534 $Result = false;
535 $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
536 }
537 elseif(!$this->_Update($ID, $arFields, $bCheckDescription))
538 {
539 $Result = false;
540 $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
541 }
542 else
543 {
544 $arUserType = [];
545 $userTypeId = (string)($arFields['USER_TYPE'] ?? '');
546 if ($userTypeId !== '')
547 {
548 $arUserType = CIBlockProperty::GetUserType($userTypeId);
549 }
550 if (!empty($arUserType))
551 {
552 if (array_key_exists('DEFAULT_VALUE', $arFields))
553 {
554 if (isset($arUserType['ConvertToDB']))
555 {
556 $arValue = [
557 'VALUE' => $arFields['DEFAULT_VALUE'],
558 'DEFAULT_VALUE' => true,
559 ];
560 $arValue = call_user_func_array(
561 $arUserType['ConvertToDB'],
562 [$arFields, $arValue]
563 );
564 $arFields['DEFAULT_VALUE'] = $this->prepareDefaultValue($arValue);
565 unset($arValue);
566 }
567 else
568 {
569 if (!is_scalar($arFields['DEFAULT_VALUE']))
570 {
571 $arFields['DEFAULT_VALUE'] = false;
572 }
573 }
574 }
575
576 if (isset($arUserType['PrepareSettings']))
577 {
578 if (!isset($arFields["USER_TYPE_SETTINGS"]))
579 {
581 'select' => [
582 'ID',
583 'PROPERTY_TYPE',
584 'USER_TYPE',
585 'USER_TYPE_SETTINGS',
586 ],
587 'filter' => [
588 '=ID' => $ID,
589 ],
590 ]);
591 if (!empty($oldData))
592 {
593 if ($arFields["USER_TYPE"] == $oldData["USER_TYPE"] && !empty($oldData["USER_TYPE_SETTINGS"]))
594 {
595 $arFields["USER_TYPE_SETTINGS"] = (
596 is_array($oldData["USER_TYPE_SETTINGS"])
597 ? $oldData["USER_TYPE_SETTINGS"]
598 : unserialize($oldData["USER_TYPE_SETTINGS"], ['allowed_classes' => false])
599 );
600 }
601 }
602 unset($oldData);
603 }
604 $arFieldsResult = call_user_func_array($arUserType["PrepareSettings"], array($arFields));
605 if (is_array($arFieldsResult) && array_key_exists('USER_TYPE_SETTINGS', $arFieldsResult))
606 {
607 $arFields = array_merge($arFields, $arFieldsResult);
608 $arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
609 }
610 else
611 {
612 $arFields["USER_TYPE_SETTINGS"] = serialize($arFieldsResult);
613 }
614 unset($arFieldsResult);
615 }
616 else
617 {
618 $arFields["USER_TYPE_SETTINGS"] = false;
619 }
620 }
621 else
622 {
623 if (isset($arFields['DEFAULT_VALUE']) && !is_scalar($arFields['DEFAULT_VALUE']))
624 {
625 $arFields['DEFAULT_VALUE'] = false;
626 }
627 if (isset($arFields["USER_TYPE_SETTINGS"]))
628 {
629 if (is_array($arFields["USER_TYPE_SETTINGS"]))
630 {
631 $arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
632 }
633 if (!is_scalar($arFields["USER_TYPE_SETTINGS"]))
634 {
635 $arFields["USER_TYPE_SETTINGS"] = false;
636 }
637 }
638 }
639 unset($arUserType);
640
641 unset($arFields["ID"]);
642 unset($arFields["VERSION"]);
643 unset($arFields["TIMESTAMP_X"]);
645 $helper = $connection->getSqlHelper();
646 $arFields['~TIMESTAMP_X'] = $helper->getCurrentDateTimeFunction();
647 unset($helper, $connection);
648
649 $strUpdate = $DB->PrepareUpdate("b_iblock_property", $arFields);
650 if($strUpdate <> '')
651 {
652 $strSql = "UPDATE b_iblock_property SET ".$strUpdate." WHERE ID=".$ID;
653 $bindList = [];
654 if (isset($arFields['USER_TYPE_SETTINGS']))
655 {
656 $bindList['USER_TYPE_SETTINGS'] = $arFields['USER_TYPE_SETTINGS'];
657 }
658 $DB->QueryBind($strSql, $bindList);
659 }
660
661 if(is_set($arFields, "VALUES"))
662 $this->UpdateEnum($ID, $arFields["VALUES"]);
663
664 if(
665 array_key_exists("IBLOCK_ID", $arFields)
666 && CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y"
667 )
668 {
669 if(
670 !array_key_exists("SECTION_PROPERTY", $arFields)
671 || $arFields["SECTION_PROPERTY"] !== "N"
672 )
673 {
674 $arLink = [];
675 if (array_key_exists("SMART_FILTER", $arFields))
676 {
677 $arLink["SMART_FILTER"] = $arFields["SMART_FILTER"];
678 }
679 if (array_key_exists("DISPLAY_TYPE", $arFields))
680 $arLink["DISPLAY_TYPE"] = $arFields["DISPLAY_TYPE"];
681 if (array_key_exists("DISPLAY_EXPANDED", $arFields))
682 $arLink["DISPLAY_EXPANDED"] = $arFields["DISPLAY_EXPANDED"];
683 if (array_key_exists("FILTER_HINT", $arFields))
684 $arLink["FILTER_HINT"] = $arFields["FILTER_HINT"];
685 CIBlockSectionPropertyLink::Set(0, $ID, $arLink);
686 }
687 else
688 {
689 CIBlockSectionPropertyLink::Delete(0, $ID);
690 }
691 }
692
693 if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
694 {
696 $ID,
697 $arFields['FEATURES']
698 );
699 //TODO: add error handling
700 unset($featureResult);
701 }
702
704
706 if (isset($arFields["IBLOCK_ID"]))
707 {
708 unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]);
709 CIBlock::clearIblockTagCache($arFields["IBLOCK_ID"]);
710 }
711
712 $Result = true;
713 }
714
715 $arFields["ID"] = $ID;
716 $arFields["RESULT"] = &$Result;
717
718 foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyUpdate", true) as $arEvent)
720
721 return $Result;
722 }
723
725 // Get property information by ID
727 public static function GetByID($ID, $IBLOCK_ID=false, $IBLOCK_CODE=false)
728 {
729 $iblockId = null;
730 $iblockCode = null;
731 if (is_numeric($IBLOCK_ID))
732 {
733 $IBLOCK_ID = (int)$IBLOCK_ID;
734 if ($IBLOCK_ID > 0)
735 {
737 }
738 }
739 if (is_string($IBLOCK_CODE))
740 {
741 $IBLOCK_CODE = trim($IBLOCK_CODE);
742 if ($IBLOCK_CODE !== '')
743 {
744 $iblockCode = $IBLOCK_CODE;
745 }
746 }
747
748 $runtime = [];
749 $filter = [];
750 if ($iblockCode && $iblockId)
751 {
752 $filter[] = [
753 'LOGIC' => 'OR',
754 '=IBLOCK.ID' => $iblockId,
755 '=IBLOCK.CODE' => $iblockCode,
756 ];
757 }
758 elseif ($iblockCode)
759 {
760 $filter['=IBLOCK.CODE'] = $iblockCode;
761 }
763 {
764 $filter['=IBLOCK.ID'] = $iblockId;
765 }
766 if (!is_int($ID))
767 {
768 $ID = (string)$ID;
769 if (is_numeric($ID))
770 {
771 $ID = (int)$ID;
772 }
773 }
774 if (is_int($ID))
775 {
776 $filter['=ID'] = $ID;
777 }
778 else
779 {
780 $ID = mb_strtoupper($ID);
782 if ($connection instanceof Main\DB\MysqlCommonConnection)
783 {
784 $filter['=CODE'] = $ID;
785 }
786 else
787 {
788 $filter['=UPPER_PROPERTY_CODE'] = $ID;
789 $runtime[] = self::getUpperExpressionFields();
790 }
791 unset($connection);
792 }
793
794 $params = [
795 'select' => ['*'],
796 'filter' => $filter,
797 'limit' => 1,
798 ];
799 if (!empty($runtime))
800 {
801 $params['runtime'] = $runtime;
802 }
803
805 }
806
807 public static function GetPropertyArray($ID, $IBLOCK_ID, $bCached=true)
808 {
809 if (!is_int($ID) && !is_string($ID))
810 {
811 return false;
812 }
813
814 $iblockIdList = [];
815 $iblockCodeList = [];
816
817 if (is_array($IBLOCK_ID))
818 {
819 foreach ($IBLOCK_ID as $value)
820 {
821 if (is_numeric($value))
822 {
823 $value = (int)$value;
824 if ($value > 0)
825 {
826 $iblockIdList[$value] = $value;
827 }
828 }
829 elseif (is_string($value))
830 {
831 $value = trim($value);
832 if ($value !== '')
833 {
834 $iblockCodeList[$value] = $value;
835 }
836 }
837 }
838 }
839 elseif (is_numeric($IBLOCK_ID))
840 {
841 $iblockId = (int)$IBLOCK_ID;
842 if ($iblockId > 0)
843 {
844 $iblockIdList[$iblockId] = $iblockId;
845 }
846 unset($iblockId);
847 }
848 elseif (is_string($IBLOCK_ID))
849 {
850 $iblockCode = trim($IBLOCK_ID);
851 if ($iblockCode !== '')
852 {
853 $iblockCodeList[$iblockCode] = $iblockCode;
854 }
855 unset($iblockCode);
856 }
857 $iblockIdList = array_values($iblockIdList);
858 $iblockCodeList = array_values($iblockCodeList);
859
860 $cacheId = $ID . '|' . implode(', ', $iblockIdList) . '|' . implode(', ', $iblockCodeList);
861
863 if ($bCached && isset($IBLOCK_CACHE_PROPERTY[$cacheId]))
864 {
865 return $IBLOCK_CACHE_PROPERTY[$cacheId];
866 }
867
868 $runtime = [];
869 $filter = [];
870
871 $iblockFilter = [];
872 if (!empty($iblockIdList) && !empty($iblockCode))
873 {
874 $iblockFilter[] = [
875 'LOGIC' => 'OR',
876 '@ID' => $iblockIdList,
877 '@CODE' => $iblockCodeList
878 ];
879 }
880 elseif (!empty($iblockIdList))
881 {
882 $iblockFilter['@ID'] = $iblockIdList;
883 }
884 elseif (!empty($iblockCodeList))
885 {
886 $iblockFilter['@CODE'] = $iblockCodeList;
887 }
888 if (!empty($iblockFilter))
889 {
890 $iblockIds = [];
892 'select' => [
893 'ID',
894 ],
895 'filter' => $iblockFilter,
896 'cache' => [
897 'ttl' => 86400,
898 ],
899 ]);
900 while ($row = $iterator->fetch())
901 {
902 $iblockId = (int)$row['ID'];
903 $iblockIds[$iblockId] = $iblockId;
904 }
905 unset(
906 $iblockId,
907 $row,
908 $iterator,
909 );
910 if (empty($iblockIds))
911 {
912 return false;
913 }
914 $filter['@IBLOCK_ID'] = $iblockIds;
915 unset($iblockIds);
916 }
917 unset($iblockFilter);
918
919 $propertyId = null;
920 $propertyCode = null;
921 $propertyFullCode = null;
922 $existsValuePostfix = false;
923 if (is_int($ID))
924 {
925 $propertyId = $ID;
926 }
927 else
928 {
929 $upperId = mb_strtoupper($ID);
930 $preparedId = [];
931 if (preg_match('/^([A-Za-z0-9_]+)(_VALUE)$/', $upperId, $preparedId))
932 {
933 $existsValuePostfix = true;
934 $value = (int)$preparedId[1];
935 if ($value > 0)
936 {
937 $propertyId = $value;
938 }
939 else
940 {
941 $propertyCode = $preparedId[1];
942 $propertyFullCode = $preparedId[0];
943 }
944 }
945 else
946 {
947 $value = (int)$upperId;
948 if ($value > 0)
949 {
950 $propertyId = $value;
951 }
952 else
953 {
954 $propertyCode = $upperId;
955 }
956 }
957 unset(
958 $value,
959 $preparedId,
960 $upperId,
961 );
962 }
963
964 if ($propertyId !== null)
965 {
966 $filter['=ID'] = $propertyId;
967 }
968 else
969 {
971 if ($connection instanceof Main\DB\MysqlCommonConnection)
972 {
973 $fieldName = '=CODE';
974 }
975 else
976 {
977 $fieldName = '=UPPER_PROPERTY_CODE';
978 $runtime[] = self::getUpperExpressionFields();
979 }
980 unset($connection);
981 if ($existsValuePostfix)
982 {
983 $filter[] = [
984 'LOGIC' => 'OR',
985 [
986 $fieldName => $propertyFullCode,
987 '!=PROPERTY_TYPE' => Iblock\PropertyTable::TYPE_LIST,
988 ],
989 [
990 $fieldName => $propertyCode,
991 '=PROPERTY_TYPE' => Iblock\PropertyTable::TYPE_LIST,
992 ]
993 ];
994 }
995 else
996 {
997 $filter[$fieldName] = $propertyCode;
998 }
999 }
1000
1001 $params = [
1002 'select' => ['*'],
1003 'filter' => $filter,
1004 'cache' => [
1005 'ttl' => 86400,
1006 ],
1007 ];
1008 if (!empty($runtime))
1009 {
1010 $params['runtime'] = $runtime;
1011 }
1012
1014 $propertyRow = $iterator->fetch();
1015 if (!empty($propertyRow))
1016 {
1017 unset($propertyRow['USER_TYPE_SETTINGS_LIST']);
1018 if ($propertyRow['TIMESTAMP_X'] instanceof Main\Type\DateTime)
1019 {
1020 $propertyRow['TIMESTAMP_X'] = $propertyRow['TIMESTAMP_X']->format('Y-m-d H:i:s');
1021 }
1022 $propertyRow['ORIG_ID'] = $propertyRow['ID']; //it saves original (digital) id
1023 $propertyRow['IS_CODE_UNIQUE'] = true; //boolean check for global code uniquess
1024 $propertyRow['IS_VERSION_MIXED'] = false; //boolean check if varios versions of ibformation block properties
1025
1026 while ($row = $iterator->fetch())
1027 {
1028 $propertyRow['IS_CODE_UNIQUE'] = false;
1029 if ($propertyRow['VERSION'] !== $row['VERSION'])
1030 {
1031 $propertyRow['IS_VERSION_MIXED'] = true;
1032 }
1033 }
1034 unset($row);
1035
1036 if (
1037 $existsValuePostfix
1038 && $propertyRow['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_LIST
1039 && mb_strtoupper((string)$propertyRow['CODE']) === $propertyCode
1040 )
1041 {
1042 $propertyRow['ID'] = mb_substr($ID, 0, -6);
1043 }
1044 else
1045 {
1046 $propertyRow['ID'] = $ID;
1047 }
1048 }
1049 unset($iterator);
1050
1051 $IBLOCK_CACHE_PROPERTY[$cacheId] = $propertyRow;
1052
1053 return $propertyRow;
1054 }
1055
1056 private static function getUpperExpressionFields(): Main\ORM\Fields\ExpressionField
1057 {
1059 'UPPER_PROPERTY_CODE',
1060 'UPPER(%s)',
1061 'CODE'
1062 );
1063 }
1064
1065 public static function GetPropertyEnum($PROP_ID, $arOrder = array("SORT"=>"asc"), $arFilter = array())
1066 {
1067 global $DB;
1068
1069 $strSqlSearch = "";
1070 if(is_array($arFilter))
1071 {
1072 foreach($arFilter as $key => $val)
1073 {
1074 $key = mb_strtoupper($key);
1075 switch($key)
1076 {
1077 case "ID":
1078 $strSqlSearch .= "AND (BPE.ID=".intval($val).")\n";
1079 break;
1080 case "IBLOCK_ID":
1081 $strSqlSearch .= "AND (BP.IBLOCK_ID=".intval($val).")\n";
1082 break;
1083 case "VALUE":
1084 $strSqlSearch .= "AND (BPE.VALUE LIKE '".$DB->ForSql($val)."')\n";
1085 break;
1086 case "EXTERNAL_ID":
1087 case "XML_ID":
1088 $strSqlSearch .= "AND (BPE.XML_ID LIKE '".$DB->ForSql($val)."')\n";
1089 break;
1090 }
1091 }
1092 }
1093
1094 $arSqlOrder = array();
1095 if(is_array($arOrder))
1096 {
1097 foreach($arOrder as $by => $order)
1098 {
1099 $by = mb_strtolower($by);
1100 $order = mb_strtolower($order);
1101 if ($order!="asc")
1102 $order = "desc";
1103
1104 if ($by == "value")
1105 $arSqlOrder["BPE.VALUE"] = "BPE.VALUE ".$order;
1106 elseif ($by == "id")
1107 $arSqlOrder["BPE.ID"] = "BPE.ID ".$order;
1108 elseif ($by == "external_id")
1109 $arSqlOrder["BPE.XML_ID"] = "BPE.XML_ID ".$order;
1110 elseif ($by == "xml_id")
1111 $arSqlOrder["BPE.XML_ID"] = "BPE.XML_ID ".$order;
1112 else
1113 $arSqlOrder["BPE.SORT"] = "BPE.SORT ".$order;
1114 }
1115 }
1116
1117 if(empty($arSqlOrder))
1118 $strSqlOrder = "";
1119 else
1120 $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
1121
1122 return $DB->Query("
1123 SELECT BPE.*, BPE.XML_ID as EXTERNAL_ID
1124 FROM
1125 b_iblock_property_enum BPE
1126 INNER JOIN b_iblock_property BP ON BP.ID = BPE.PROPERTY_ID
1127 WHERE
1128 ".(
1129 is_numeric(mb_substr($PROP_ID, 0, 1))?
1130 "BP.ID = ".(int)$PROP_ID:
1131 "BP.CODE = '".$DB->ForSql($PROP_ID)."'"
1132 )."
1133 ".$strSqlSearch."
1134 ".$strSqlOrder."
1135 ");
1136 }
1137
1138 function UpdateEnum($ID, $arVALUES, $bForceDelete = true)
1139 {
1140 global $DB, $CACHE_MANAGER;
1141 $ID = intval($ID);
1142
1143 if(!is_array($arVALUES) || (empty($arVALUES) && $bForceDelete))
1144 {
1146 return true;
1147 }
1148
1149 $ar_XML_ID = array();
1150 $db_res = $this->GetPropertyEnum($ID);
1151 while($res = $db_res->Fetch())
1152 {
1153 $ar_XML_ID[rtrim($res["XML_ID"], " ")] = $res["ID"];
1154 }
1155
1156 $sqlWhere = "";
1157 if(!$bForceDelete)
1158 {
1159 $rsProp = CIBlockProperty::GetByID($ID);
1160 if($arProp = $rsProp->Fetch())
1161 {
1162 if($arProp["VERSION"] == 1)
1163 $sqlWhere = "AND NOT EXISTS (
1164 SELECT *
1165 FROM b_iblock_element_property
1166 WHERE b_iblock_element_property.IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
1167 AND b_iblock_element_property.VALUE_ENUM = b_iblock_property_enum.ID
1168 )";
1169 elseif($arProp["MULTIPLE"] == "N")
1170 $sqlWhere = "AND NOT EXISTS (
1171 SELECT *
1172 FROM b_iblock_element_prop_s".$arProp["IBLOCK_ID"]."
1173 WHERE b_iblock_element_prop_s".$arProp["IBLOCK_ID"].".PROPERTY_".$arProp["ID"]." = b_iblock_property_enum.ID
1174 )";
1175 else
1176 $sqlWhere = "AND NOT EXISTS (
1177 SELECT *
1178 FROM b_iblock_element_prop_m".$arProp["IBLOCK_ID"]."
1179 WHERE b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
1180 AND b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".VALUE_ENUM = b_iblock_property_enum.ID
1181 )";
1182 }
1183 }
1184
1185 $db_res = $this->GetPropertyEnum($ID);
1186 while($res = $db_res->Fetch())
1187 {
1188 $VALUE = $arVALUES[$res["ID"]];
1189 $VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
1190 UnSet($arVALUES[$res["ID"]]);
1191
1192 if((string)$VAL == '')
1193 {
1194 unset($ar_XML_ID[rtrim($res["XML_ID"], " ")]);
1195
1196 $strSql = "
1197 DELETE FROM b_iblock_property_enum
1198 WHERE ID=".$res["ID"]."
1199 ".$sqlWhere."
1200 ";
1201
1202 $DB->Query($strSql);
1203 }
1204 else
1205 {
1206 $DEF = "";
1207 $SORT = 0;
1208 $XML_ID = "";
1209 if(is_array($VALUE))
1210 {
1211 if(array_key_exists("DEF", $VALUE))
1212 $DEF = $VALUE["DEF"]=="Y"? "Y": "N";
1213
1214 if(array_key_exists("SORT", $VALUE))
1215 $SORT = intval($VALUE["SORT"]);
1216 if($SORT < 0)
1217 $SORT = 0;
1218
1219 if(array_key_exists("XML_ID", $VALUE) && mb_strlen($VALUE["XML_ID"]))
1220 $XML_ID = mb_substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
1221 elseif(array_key_exists("EXTERNAL_ID", $VALUE) && mb_strlen($VALUE["EXTERNAL_ID"]))
1222 $XML_ID = mb_substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
1223 }
1224
1225 if($XML_ID)
1226 {
1227 unset($ar_XML_ID[mb_strtolower(rtrim($res["XML_ID"], " "))]);
1228 if (isset($ar_XML_ID[mb_strtolower($XML_ID)]))
1229 $XML_ID = md5(uniqid(""));
1230 $ar_XML_ID[mb_strtolower($XML_ID)] = $res["ID"];
1231 }
1232
1233 $strSql = "
1234 UPDATE b_iblock_property_enum
1235 SET
1236 ".($DEF? " DEF = '".$DEF."', ":"")."
1237 ".($SORT? " SORT = ".$SORT.", ":"")."
1238 ".($XML_ID? " XML_ID = '".$DB->ForSQL($XML_ID, 200)."', ":"")."
1239 VALUE = '".$DB->ForSQL($VAL, 255)."'
1240 WHERE
1241 ID = ".$res["ID"]."
1242 ";
1243
1244 $DB->Query($strSql);
1245 }
1246 }
1247
1248 foreach($arVALUES as $id => $VALUE)
1249 {
1250 $VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
1251 if((string)$id <> '' && (string)$VAL <> '')
1252 {
1253 $DEF = "";
1254 $SORT = 0;
1255 $XML_ID = "";
1256 if(is_array($VALUE))
1257 {
1258 if(array_key_exists("DEF", $VALUE))
1259 $DEF = $VALUE["DEF"]=="Y"? "Y": "N";
1260
1261 if(array_key_exists("SORT", $VALUE))
1262 $SORT = intval($VALUE["SORT"]);
1263 if($SORT < 0)
1264 $SORT = 0;
1265
1266 if(array_key_exists("XML_ID", $VALUE) && mb_strlen($VALUE["XML_ID"]))
1267 $XML_ID = mb_substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
1268 elseif(array_key_exists("EXTERNAL_ID", $VALUE) && mb_strlen($VALUE["EXTERNAL_ID"]))
1269 $XML_ID = mb_substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
1270 }
1271
1272 if($XML_ID)
1273 {
1274 if (isset($ar_XML_ID[mb_strtolower($XML_ID)]))
1275 $XML_ID = md5(uniqid("", true));
1276 }
1277 else
1278 {
1279 $XML_ID = md5(uniqid("", true));
1280 }
1281 $ar_XML_ID[mb_strtolower($XML_ID)] = 0;
1282
1283 $strSql = "
1284 INSERT INTO b_iblock_property_enum
1285 (
1286 PROPERTY_ID
1287 ".($DEF? ",DEF": "")."
1288 ".($SORT? ",SORT": "")."
1289 ,VALUE
1290 ,XML_ID
1291 ) VALUES (
1292 ".$ID."
1293 ".($DEF? ",'".$DEF."'": "")."
1294 ".($SORT? ",".$SORT."": "")."
1295 ,'".$DB->ForSQL($VAL, 255)."'
1296 ,'".$DB->ForSQL($XML_ID, 200)."'
1297 )
1298 ";
1299 $DB->Query($strSql);
1300 }
1301 }
1302
1303 if(CACHED_b_iblock_property_enum !== false)
1304 $CACHE_MANAGER->CleanDir("b_iblock_property_enum");
1305
1306 if (defined("BX_COMP_MANAGED_CACHE"))
1307 $CACHE_MANAGER->ClearByTag("iblock_property_enum_".$ID);
1308
1309 Iblock\PropertyEnumerationTable::cleanCache();
1310
1311 return true;
1312 }
1313
1314 public static function GetUserType($USER_TYPE = false)
1315 {
1316 static $CACHE = null;
1317
1318 if(!isset($CACHE))
1319 {
1320 $CACHE = array();
1321 foreach(GetModuleEvents("iblock", "OnIBlockPropertyBuildList", true) as $arEvent)
1322 {
1323 $res = ExecuteModuleEventEx($arEvent);
1324 if (is_array($res) && array_key_exists("USER_TYPE", $res))
1325 {
1326 $CACHE[$res["USER_TYPE"]] = $res;
1327 }
1328 }
1329 }
1330
1331 if($USER_TYPE !== false)
1332 {
1333 if(array_key_exists($USER_TYPE, $CACHE))
1334 return $CACHE[$USER_TYPE];
1335 else
1336 return array();
1337 }
1338 else
1339 {
1340 return $CACHE;
1341 }
1342 }
1343
1344 function FormatUpdateError($ID, $CODE)
1345 {
1346 return GetMessage("IBLOCK_PROPERTY_CHANGE_ERROR",array("#ID#"=>$ID,"#CODE#"=>$CODE));
1347 }
1348
1350 {
1351 return GetMessage("IBLOCK_PROPERTY_NOT_FOUND",array("#ID#"=>$ID));
1352 }
1353
1360 public static function _DateTime_GetUserTypeDescription()
1361 {
1363 }
1364
1371 public static function _Date_GetUserTypeDescription()
1372 {
1374 }
1375
1382 public static function _XmlID_GetUserTypeDescription()
1383 {
1385 }
1386
1393 public static function _FileMan_GetUserTypeDescription()
1394 {
1396 }
1397
1404 public static function _HTML_GetUserTypeDescription()
1405 {
1407 }
1408
1419
1426 public static function _Sequence_GetUserTypeDescription()
1427 {
1429 }
1430
1441
1448 public static function _SKU_GetUserTypeDescription()
1449 {
1451 }
1452
1463
1464 function _Update($ID, $arFields, $bCheckDescription = false)
1465 {
1466 return false;
1467 }
1468
1469 public static function DropColumnSQL($strTable, $arColumns)
1470 {
1471 return array();
1472 }
1473
1474 function _Add($ID, $arFields)
1475 {
1476 return false;
1477 }
1478
1479 public function getLastError(): string
1480 {
1481 return $this->LAST_ERROR;
1482 }
1483
1490 protected function prepareDefaultValue(mixed $value): string|bool|int|float
1491 {
1492 $result = false;
1493 if (
1494 is_array($value)
1495 && isset($value['VALUE'])
1496 )
1497 {
1498 $defaultValue = $value['VALUE'];
1499 if (
1500 (is_string($defaultValue) && $defaultValue !== '')
1501 || is_int($defaultValue)
1502 || is_float($defaultValue)
1503 || ($defaultValue === true)
1504 )
1505 {
1507 }
1508 }
1509
1510 return $result;
1511 }
1512}
$connection
Определения actionsdefinitions.php:38
if($_SERVER $defaultValue['REQUEST_METHOD']==="GET" &&!empty($RestoreDefaults) && $bizprocPerms==="W" &&check_bitrix_sessid())
Определения options.php:32
$db_res
Определения options_user_settings.php:8
global $APPLICATION
Определения include.php:80
static setFeatures($propertyId, array $features)
Определения propertyfeature.php:153
static addFeatures($propertyId, array $features)
Определения propertyfeature.php:24
static deleteByProperty($property)
Определения propertyfeature.php:118
const TYPE_LIST
Определения propertytable.php:70
static getConnection($name="")
Определения application.php:638
static cleanCache()
Определения datamanager.php:1983
static getRow(array $parameters)
Определения datamanager.php:398
static getList(array $parameters=array())
Определения datamanager.php:431
getLastError()
Определения iblockproperty.php:1479
static _Sequence_GetUserTypeDescription()
Определения iblockproperty.php:1426
static _SKU_GetUserTypeDescription()
Определения iblockproperty.php:1448
static _DateTime_GetUserTypeDescription()
Определения iblockproperty.php:1360
prepareDefaultValue(mixed $value)
Определения iblockproperty.php:1490
Update($ID, $arFields, $bCheckDescription=false)
Определения iblockproperty.php:516
static Delete($ID)
Определения iblockproperty.php:134
FormatUpdateError($ID, $CODE)
Определения iblockproperty.php:1344
FormatNotFoundError($ID)
Определения iblockproperty.php:1349
static _SectionAutoComplete_GetUserTypeDescription()
Определения iblockproperty.php:1459
_Update($ID, $arFields, $bCheckDescription=false)
Определения iblockproperty.php:1464
static GetPropertyEnum($PROP_ID, $arOrder=array("SORT"=>"asc"), $arFilter=array())
Определения iblockproperty.php:1065
static GetList($arOrder=Array(), $arFilter=Array())
Определения iblockproperty.php:14
static GetUserType($USER_TYPE=false)
Определения iblockproperty.php:1314
static GetPropertyArray($ID, $IBLOCK_ID, $bCached=true)
Определения iblockproperty.php:807
static DropColumnSQL($strTable, $arColumns)
Определения iblockproperty.php:1469
string $LAST_ERROR
Определения iblockproperty.php:12
static GetByID($ID, $IBLOCK_ID=false, $IBLOCK_CODE=false)
Определения iblockproperty.php:727
UpdateEnum($ID, $arVALUES, $bForceDelete=true)
Определения iblockproperty.php:1138
CheckFields(&$arFields, $ID=false, $bFormValidate=false)
Определения iblockproperty.php:400
static _ElementList_GetUserTypeDescription()
Определения iblockproperty.php:1415
static _FileMan_GetUserTypeDescription()
Определения iblockproperty.php:1393
static _ElementAutoComplete_GetUserTypeDescription()
Определения iblockproperty.php:1437
static _Date_GetUserTypeDescription()
Определения iblockproperty.php:1371
static _XmlID_GetUserTypeDescription()
Определения iblockproperty.php:1382
_Add($ID, $arFields)
Определения iblockproperty.php:1474
Add($arFields)
Определения iblockproperty.php:240
static _HTML_GetUserTypeDescription()
Определения iblockproperty.php:1404
static GetUserTypeDescription()
Определения prop_date.php:14
static GetUserTypeDescription()
Определения prop_datetime.php:17
static GetUserTypeDescription()
Определения prop_element_auto.php:15
static GetUserTypeDescription()
Определения prop_element_list.php:11
static DeleteByPropertyID($PROPERTY_ID, $bIgnoreError=false)
Определения iblockpropertyenum.php:184
static GetUserTypeDescription()
Определения prop_fileman.php:12
static GetUserTypeDescription()
Определения prop_html.php:16
static GetUserTypeDescription()
Определения prop_element_sku.php:11
static GetUserTypeDescription()
Определения prop_section_auto.php:12
static GetUserTypeDescription()
Определения prop_seq.php:11
static GetUserTypeDescription()
Определения prop_xmlid.php:11
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$arFields
Определения dblapprove.php:5
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
global $IBLOCK_CACHE_PROPERTY
Определения iblockproperty.php:6
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
global $BX_IBLOCK_PROP_CACHE
Определения iblockelement.php:17
$iblockId
Определения iblock_catalog_edit.php:30
$filter
Определения iblock_catalog_list.php:54
global $DB
Определения cron_frame.php:29
$IBLOCK_ID
Определения csv_new_run.php:168
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
Определения arrayresult.php:2
Определения collection.php:2
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
</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."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$val
Определения options.php:1793
$arFilter
Определения user_search.php:106
$iterator
Определения yandex_run.php:610