1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
usertype.php
См. документацию.
1<?php
2
9
13
14IncludeModuleLangFile(__FILE__);
15
89{
90 protected static $cache = [];
91
92 function CreatePropertyTables($entity_id)
93 {
94 $connection = Application::getConnection();
95
96 if (!$connection->isTableExists("b_utm_" . strtolower($entity_id)))
97 {
98 $connection->createTable("b_utm_" . strtolower($entity_id), [
99 'ID' => new \Bitrix\Main\ORM\Fields\IntegerField('ID'),
100 'VALUE_ID' => new \Bitrix\Main\ORM\Fields\IntegerField('VALUE_ID'),
101 'FIELD_ID' => new \Bitrix\Main\ORM\Fields\IntegerField('FIELD_ID'),
102 'VALUE' => new \Bitrix\Main\ORM\Fields\TextField('VALUE', ['nullable' => true]),
103 'VALUE_INT' => new \Bitrix\Main\ORM\Fields\IntegerField('VALUE_INT', ['nullable' => true]),
104 'VALUE_DOUBLE' => new \Bitrix\Main\ORM\Fields\FloatField('VALUE_DOUBLE', ['nullable' => true]),
105 'VALUE_DATE' => new \Bitrix\Main\ORM\Fields\DatetimeField('VALUE_DATE', ['nullable' => true]),
106 ], ['ID'], ['ID']);
107
108 $connection->createIndex("b_utm_" . strtolower($entity_id), "ix_utm_" . $entity_id . "_2", ["VALUE_ID"]);
109 $connection->createIndex("b_utm_" . strtolower($entity_id), "ix_utm_" . $entity_id . "_4", ["FIELD_ID", "VALUE_ID", "VALUE_INT"]);
110 }
111
112 if (!$connection->isTableExists("b_uts_" . strtolower($entity_id)))
113 {
114 $connection->createTable("b_uts_" . strtolower($entity_id), [
115 'VALUE_ID' => new \Bitrix\Main\ORM\Fields\IntegerField('VALUE_ID'),
116 ], ['VALUE_ID']);
117 }
118
119 return true;
120 }
121
130 public static function GetByID($ID)
131 {
132 global $DB;
133
134 static $arLabels = ["EDIT_FORM_LABEL", "LIST_COLUMN_LABEL", "LIST_FILTER_LABEL", "ERROR_MESSAGE", "HELP_MESSAGE"];
135
136 if (!array_key_exists($ID, static::$cache))
137 {
138 $rsUserField = CUserTypeEntity::GetList([], ["ID" => intval($ID)]);
139 if ($arUserField = $rsUserField->Fetch())
140 {
141 $rs = $DB->Query("SELECT * FROM b_user_field_lang WHERE USER_FIELD_ID = " . intval($ID));
142 while ($ar = $rs->Fetch())
143 {
144 foreach ($arLabels as $label)
145 {
146 $arUserField[$label][$ar["LANGUAGE_ID"]] = $ar[$label];
147 }
148 }
149 static::$cache[$ID] = $arUserField;
150 }
151 else
152 {
153 static::$cache[$ID] = false;
154 }
155 }
156 return static::$cache[$ID];
157 }
158
170 public static function GetList($aSort = [], $aFilter = [])
171 {
172 global $DB, $CACHE_MANAGER;
173
174 if (CACHED_b_user_field !== false)
175 {
176 $cacheId = "b_user_type" . md5(serialize($aSort) . "." . serialize($aFilter));
177 if ($CACHE_MANAGER->Read(CACHED_b_user_field, $cacheId, "b_user_field"))
178 {
179 $arResult = $CACHE_MANAGER->Get($cacheId);
180 $res = new CDBResult;
181 $res->InitFromArray($arResult);
183 return $res;
184 }
185 }
186
187 $bLangJoin = false;
188 $arFilter = [];
189 foreach ($aFilter as $key => $val)
190 {
191 if (is_array($val) || (string)$val == '')
192 {
193 continue;
194 }
195
196 $key = strtoupper($key);
197 $val = $DB->ForSql($val);
198
199 switch ($key)
200 {
201 case "ID":
202 case "ENTITY_ID":
203 case "FIELD_NAME":
204 case "USER_TYPE_ID":
205 case "XML_ID":
206 case "SORT":
207 case "MULTIPLE":
208 case "MANDATORY":
209 case "SHOW_FILTER":
210 case "SHOW_IN_LIST":
211 case "EDIT_IN_LIST":
212 case "IS_SEARCHABLE":
213 $arFilter[] = "UF." . $key . " = '" . $val . "'";
214 break;
215 case "LANG":
216 $bLangJoin = $val;
217 break;
218 }
219 }
220
221 $arOrder = [];
222 foreach ($aSort as $key => $val)
223 {
224 $key = strtoupper($key);
225 $ord = (strtoupper($val) <> "ASC" ? "DESC" : "ASC");
226 switch ($key)
227 {
228 case "ID":
229 case "ENTITY_ID":
230 case "FIELD_NAME":
231 case "USER_TYPE_ID":
232 case "XML_ID":
233 case "SORT":
234 $arOrder[] = "UF." . $key . " " . $ord;
235 break;
236 }
237 }
238 if (empty($arOrder))
239 {
240 $arOrder[] = "UF.SORT asc";
241 $arOrder[] = "UF.ID asc";
242 }
243 DelDuplicateSort($arOrder);
244 $sOrder = "\nORDER BY " . implode(", ", $arOrder);
245
246 if (empty($arFilter))
247 {
248 $sFilter = "";
249 }
250 else
251 {
252 $sFilter = "\nWHERE " . implode("\nAND ", $arFilter);
253 }
254
255 $strSql = "
256 SELECT
257 UF.ID
258 ,UF.ENTITY_ID
259 ,UF.FIELD_NAME
260 ,UF.USER_TYPE_ID
261 ,UF.XML_ID
262 ,UF.SORT
263 ,UF.MULTIPLE
264 ,UF.MANDATORY
265 ,UF.SHOW_FILTER
266 ,UF.SHOW_IN_LIST
267 ,UF.EDIT_IN_LIST
268 ,UF.IS_SEARCHABLE
269 ,UF.SETTINGS
270 " . ($bLangJoin ? "
271 ,UFL.EDIT_FORM_LABEL
272 ,UFL.LIST_COLUMN_LABEL
273 ,UFL.LIST_FILTER_LABEL
274 ,UFL.ERROR_MESSAGE
275 ,UFL.HELP_MESSAGE
276 " : "") . "
277 FROM
278 b_user_field UF
279 " . ($bLangJoin ? "LEFT JOIN b_user_field_lang UFL on UFL.LANGUAGE_ID = '" . $bLangJoin . "' AND UFL.USER_FIELD_ID = UF.ID" : "") . "
280 " . $sFilter . $sOrder;
281
282 if (CACHED_b_user_field === false)
283 {
284 $res = $DB->Query($strSql);
285 }
286 else
287 {
288 $arResult = [];
289 $res = $DB->Query($strSql);
290 while ($ar = $res->Fetch())
291 {
292 $arResult[] = $ar;
293 }
294
296 $CACHE_MANAGER->Set($cacheId, $arResult);
297
298 $res = new CDBResult;
299 $res->InitFromArray($arResult);
300 }
301
302 return new CUserTypeEntity($res);
303 }
304
328 public function CheckFields($ID, $arFields, $bCheckUserType = true)
329 {
332 $aMsg = [];
333 $ID = intval($ID);
334
335 if (($ID <= 0 || array_key_exists("ENTITY_ID", $arFields)) && $arFields["ENTITY_ID"] == '')
336 {
337 $aMsg[] = ["id" => "ENTITY_ID", "text" => GetMessage("USER_TYPE_ENTITY_ID_MISSING")];
338 }
339 if (array_key_exists("ENTITY_ID", $arFields))
340 {
341 if (mb_strlen($arFields["ENTITY_ID"]) > 50)
342 {
343 $aMsg[] = ["id" => "ENTITY_ID", "text" => GetMessage("USER_TYPE_ENTITY_ID_TOO_LONG1")];
344 }
345 if (!preg_match('/^[0-9A-Z_]+$/', $arFields["ENTITY_ID"]))
346 {
347 $aMsg[] = ["id" => "ENTITY_ID", "text" => GetMessage("USER_TYPE_ENTITY_ID_INVALID")];
348 }
349 }
350
351 if (($ID <= 0 || array_key_exists("FIELD_NAME", $arFields)) && $arFields["FIELD_NAME"] == '')
352 {
353 $aMsg[] = ["id" => "FIELD_NAME", "text" => GetMessage("USER_TYPE_FIELD_NAME_MISSING")];
354 }
355 if (array_key_exists("FIELD_NAME", $arFields))
356 {
357 if (mb_strlen($arFields["FIELD_NAME"]) < 4)
358 {
359 $aMsg[] = ["id" => "FIELD_NAME", "text" => GetMessage("USER_TYPE_FIELD_NAME_TOO_SHORT")];
360 }
361 if (mb_strlen($arFields["FIELD_NAME"]) > 50)
362 {
363 $aMsg[] = ["id" => "FIELD_NAME", "text" => GetMessage("USER_TYPE_FIELD_NAME_TOO_LONG1")];
364 }
365 if (strncmp($arFields["FIELD_NAME"], "UF_", 3) !== 0)
366 {
367 $aMsg[] = ["id" => "FIELD_NAME", "text" => GetMessage("USER_TYPE_FIELD_NAME_NOT_UF")];
368 }
369 if (!preg_match('/^[0-9A-Z_]+$/', $arFields["FIELD_NAME"]))
370 {
371 $aMsg[] = ["id" => "FIELD_NAME", "text" => GetMessage("USER_TYPE_FIELD_NAME_INVALID")];
372 }
373 }
374
375 if (($ID <= 0 || array_key_exists("USER_TYPE_ID", $arFields)) && $arFields["USER_TYPE_ID"] == '')
376 {
377 $aMsg[] = ["id" => "USER_TYPE_ID", "text" => GetMessage("USER_TYPE_USER_TYPE_ID_MISSING")];
378 }
379 if (
380 $bCheckUserType
381 && array_key_exists("USER_TYPE_ID", $arFields)
382 && !$USER_FIELD_MANAGER->GetUserType($arFields["USER_TYPE_ID"])
383 )
384 {
385 $aMsg[] = ["id" => "USER_TYPE_ID", "text" => GetMessage("USER_TYPE_USER_TYPE_ID_INVALID")];
386 }
387
388 if (!empty($aMsg))
389 {
390 $e = new CAdminException($aMsg);
391 $APPLICATION->ThrowException($e);
392 return false;
393 }
394 return true;
395 }
396
437 public function Add($arFields, $bCheckUserType = true)
438 {
440
441 if (!$this->CheckFields(0, $arFields, $bCheckUserType))
442 {
443 return false;
444 }
445
447 "ENTITY_ID" => $arFields["ENTITY_ID"],
448 "FIELD_NAME" => $arFields["FIELD_NAME"],
449 ]);
450
451 if ($rs->Fetch())
452 {
453 $aMsg = [];
454 $aMsg[] = [
455 "id" => "FIELD_NAME",
456 "text" => GetMessage("USER_TYPE_ADD_ALREADY_ERROR", [
457 "#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
458 "#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
459 ]),
460 ];
461 $e = new CAdminException($aMsg);
462 $APPLICATION->ThrowException($e);
463 return false;
464 }
465
466 unset($arFields["ID"]);
467 if (!isset($arFields["SORT"]) || intval($arFields["SORT"]) <= 0)
468 {
469 $arFields["SORT"] = 100;
470 }
471 if (!isset($arFields["MULTIPLE"]) || $arFields["MULTIPLE"] !== "Y")
472 {
473 $arFields["MULTIPLE"] = "N";
474 }
475 if (!isset($arFields["MANDATORY"]) || $arFields["MANDATORY"] !== "Y")
476 {
477 $arFields["MANDATORY"] = "N";
478 }
479 $arFields["SHOW_FILTER"] = mb_substr($arFields["SHOW_FILTER"] ?? '', 0, 1);
480 if ($arFields["SHOW_FILTER"] == '' || mb_strpos("NIES", $arFields["SHOW_FILTER"]) === false)
481 {
482 $arFields["SHOW_FILTER"] = "N";
483 }
484 if (!isset($arFields["SHOW_IN_LIST"]) || $arFields["SHOW_IN_LIST"] !== "N")
485 {
486 $arFields["SHOW_IN_LIST"] = "Y";
487 }
488 if (!isset($arFields["EDIT_IN_LIST"]) || $arFields["EDIT_IN_LIST"] !== "N")
489 {
490 $arFields["EDIT_IN_LIST"] = "Y";
491 }
492 if (!isset($arFields["IS_SEARCHABLE"]) || $arFields["IS_SEARCHABLE"] !== "Y")
493 {
494 $arFields["IS_SEARCHABLE"] = "N";
495 }
496
497 if (!array_key_exists("SETTINGS", $arFields))
498 {
499 $arFields["SETTINGS"] = [];
500 }
501 $arFields["SETTINGS"] = serialize($USER_FIELD_MANAGER->PrepareSettings(0, $arFields, $bCheckUserType));
502
507 $commonEventResult = ['PROVIDE_STORAGE' => true];
508
509 foreach (GetModuleEvents("main", "OnBeforeUserTypeAdd", true) as $arEvent)
510 {
511 $eventResult = ExecuteModuleEventEx($arEvent, [&$arFields]);
512
513 if ($eventResult === false)
514 {
515 if ($APPLICATION->GetException())
516 {
517 return false;
518 }
519
520 $aMsg = [];
521 $aMsg[] = [
522 "id" => "FIELD_NAME",
523 "text" => GetMessage("USER_TYPE_ADD_ERROR", [
524 "#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
525 "#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
526 ]),
527 ];
528
529 $e = new CAdminException($aMsg);
530 $APPLICATION->ThrowException($e);
531
532 return false;
533 }
534 elseif (is_array($eventResult))
535 {
536 $commonEventResult = array_merge($commonEventResult, $eventResult);
537 }
538 }
539
540 if (is_object($USER_FIELD_MANAGER))
541 {
542 $USER_FIELD_MANAGER->CleanCache();
543 }
544
545 if ($commonEventResult['PROVIDE_STORAGE'])
546 {
547 if (!$this->CreatePropertyTables($arFields["ENTITY_ID"]))
548 {
549 return false;
550 }
551
552 $strType = $USER_FIELD_MANAGER->getUtsDBColumnType($arFields);
553
554 if (!$strType)
555 {
556 $aMsg = [];
557 $aMsg[] = [
558 "id" => "FIELD_NAME",
559 "text" => GetMessage("USER_TYPE_ADD_ERROR", [
560 "#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
561 "#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
562 ]),
563 ];
564 $e = new CAdminException($aMsg);
565 $APPLICATION->ThrowException($e);
566 return false;
567 }
568
569 $tableName = 'b_uts_' . mb_strtolower($arFields['ENTITY_ID']);
570 $tableFields = $DB->GetTableFields($tableName);
571 if (!array_key_exists($arFields['FIELD_NAME'], $tableFields))
572 {
573 $ddl = 'ALTER TABLE ' . $tableName . ' ADD ' . $arFields['FIELD_NAME'] . ' ' . $strType;
574 if (!$DB->DDL($ddl, true))
575 {
576 $aMsg = [];
577 $aMsg[] = [
578 "id" => "FIELD_NAME",
579 "text" => GetMessage("USER_TYPE_ADD_ERROR", [
580 "#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
581 "#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
582 ]),
583 ];
584 $e = new CAdminException($aMsg);
585 $APPLICATION->ThrowException($e);
586 return false;
587 }
588 }
589 }
590
591 if ($ID = $DB->Add("b_user_field", $arFields, ["SETTINGS"], '', true))
592 {
593 $arLabels = ["EDIT_FORM_LABEL", "LIST_COLUMN_LABEL", "LIST_FILTER_LABEL", "ERROR_MESSAGE", "HELP_MESSAGE"];
594 $arLangs = [];
595 foreach ($arLabels as $label)
596 {
597 if (isset($arFields[$label]) && is_array($arFields[$label]))
598 {
599 foreach ($arFields[$label] as $lang => $value)
600 {
601 $arLangs[$lang][$label] = $value;
602 }
603 }
604 }
605
606 foreach ($arLangs as $lang => $arLangFields)
607 {
608 $arLangFields["USER_FIELD_ID"] = $ID;
609 $arLangFields["LANGUAGE_ID"] = $lang;
610 $arInsert = $DB->PrepareInsert("b_user_field_lang", $arLangFields);
611 $DB->Query("INSERT INTO b_user_field_lang (" . $arInsert[0] . ") VALUES (" . $arInsert[1] . ")");
612 }
613
614 static::cleanCache();
615 }
616 else
617 {
618 return false;
619 }
620
621 // post event
622 $arFields['ID'] = $ID;
623
624 foreach (GetModuleEvents("main", "OnAfterUserTypeAdd", true) as $arEvent)
625 {
626 ExecuteModuleEventEx($arEvent, [$arFields]);
627 }
628
629 return $ID;
630 }
631
659 public function Update($ID, $arFields)
660 {
662 $ID = intval($ID);
663
664 unset($arFields["ENTITY_ID"]);
665 unset($arFields["FIELD_NAME"]);
666 unset($arFields["USER_TYPE_ID"]);
667 unset($arFields["MULTIPLE"]);
668
669 if (!$this->CheckFields($ID, $arFields))
670 {
671 return false;
672 }
673
674 if (array_key_exists("SETTINGS", $arFields))
675 {
676 $arFields["SETTINGS"] = serialize($USER_FIELD_MANAGER->PrepareSettings($ID, $arFields));
677 }
678 if (array_key_exists("MANDATORY", $arFields) && $arFields["MANDATORY"] !== "Y")
679 {
680 $arFields["MANDATORY"] = "N";
681 }
682 if (array_key_exists("SHOW_FILTER", $arFields))
683 {
684 $arFields["SHOW_FILTER"] = mb_substr($arFields["SHOW_FILTER"], 0, 1);
685 if (mb_strpos("NIES", $arFields["SHOW_FILTER"]) === false)
686 {
687 $arFields["SHOW_FILTER"] = "N";
688 }
689 }
690 if (array_key_exists("SHOW_IN_LIST", $arFields) && $arFields["SHOW_IN_LIST"] !== "N")
691 {
692 $arFields["SHOW_IN_LIST"] = "Y";
693 }
694 if (array_key_exists("EDIT_IN_LIST", $arFields) && $arFields["EDIT_IN_LIST"] !== "N")
695 {
696 $arFields["EDIT_IN_LIST"] = "Y";
697 }
698 if (array_key_exists("IS_SEARCHABLE", $arFields) && $arFields["IS_SEARCHABLE"] !== "Y")
699 {
700 $arFields["IS_SEARCHABLE"] = "N";
701 }
702
703 // events
704 foreach (GetModuleEvents("main", "OnBeforeUserTypeUpdate", true) as $arEvent)
705 {
706 if (ExecuteModuleEventEx($arEvent, [&$arFields]) === false)
707 {
708 if ($APPLICATION->GetException())
709 {
710 return false;
711 }
712
713 $aMsg = [];
714 $aMsg[] = [
715 "id" => "FIELD_NAME",
716 "text" => GetMessage("USER_TYPE_UPDATE_ERROR", [
717 "#FIELD_NAME#" => htmlspecialcharsbx($arFields["FIELD_NAME"]),
718 "#ENTITY_ID#" => htmlspecialcharsbx($arFields["ENTITY_ID"]),
719 ]),
720 ];
721
722 $e = new CAdminException($aMsg);
723 $APPLICATION->ThrowException($e);
724
725 return false;
726 }
727 }
728
729 if (is_object($USER_FIELD_MANAGER))
730 {
731 $USER_FIELD_MANAGER->CleanCache();
732 }
733
734 $strUpdate = $DB->PrepareUpdate("b_user_field", $arFields);
735
736 static $arLabels = ["EDIT_FORM_LABEL", "LIST_COLUMN_LABEL", "LIST_FILTER_LABEL", "ERROR_MESSAGE", "HELP_MESSAGE"];
737 $arLangs = [];
738 foreach ($arLabels as $label)
739 {
740 if (isset($arFields[$label]) && is_array($arFields[$label]))
741 {
742 foreach ($arFields[$label] as $lang => $value)
743 {
744 $arLangs[$lang][$label] = $value;
745 }
746 }
747 }
748
749 if ($strUpdate <> "" || !empty($arLangs))
750 {
751 if ($strUpdate <> "")
752 {
753 $strSql = "UPDATE b_user_field SET " . $strUpdate . " WHERE ID = " . $ID;
754 if (array_key_exists("SETTINGS", $arFields))
755 {
756 $arBinds = ["SETTINGS" => $arFields["SETTINGS"]];
757 }
758 else
759 {
760 $arBinds = [];
761 }
762 $DB->QueryBind($strSql, $arBinds);
763 }
764
765 if (!empty($arLangs))
766 {
767 $DB->StartTransaction();
768
769 $DB->Query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = " . $ID);
770
771 foreach ($arLangs as $lang => $arLangFields)
772 {
773 $arLangFields["USER_FIELD_ID"] = $ID;
774 $arLangFields["LANGUAGE_ID"] = $lang;
775 $arInsert = $DB->PrepareInsert("b_user_field_lang", $arLangFields);
776 $DB->Query("INSERT INTO b_user_field_lang (" . $arInsert[0] . ") VALUES (" . $arInsert[1] . ")");
777 }
778
779 $DB->Commit();
780 }
781
782 static::cleanCache();
783
784 foreach (GetModuleEvents("main", "OnAfterUserTypeUpdate", true) as $arEvent)
785 {
786 ExecuteModuleEventEx($arEvent, [$arFields, $ID]);
787 }
788 }
789
790 return true;
791 }
792
802 public function Delete($ID)
803 {
805 $ID = intval($ID);
806
807 $rs = $this->GetList([], ["ID" => $ID]);
808 if ($arField = $rs->Fetch())
809 {
814 $commonEventResult = ['PROVIDE_STORAGE' => true];
815
816 foreach (GetModuleEvents("main", "OnBeforeUserTypeDelete", true) as $arEvent)
817 {
818 $eventResult = ExecuteModuleEventEx($arEvent, [&$arField]);
819
820 if ($eventResult === false)
821 {
822 if ($APPLICATION->GetException())
823 {
824 return false;
825 }
826
827 $aMsg = [];
828 $aMsg[] = [
829 "id" => "FIELD_NAME",
830 "text" => GetMessage("USER_TYPE_DELETE_ERROR", [
831 "#FIELD_NAME#" => htmlspecialcharsbx($arField["FIELD_NAME"]),
832 "#ENTITY_ID#" => htmlspecialcharsbx($arField["ENTITY_ID"]),
833 ]),
834 ];
835
836 $e = new CAdminException($aMsg);
837 $APPLICATION->ThrowException($e);
838
839 return false;
840 }
841 elseif (is_array($eventResult))
842 {
843 $commonEventResult = array_merge($commonEventResult, $eventResult);
844 }
845 }
846
847 $entityId = strtolower($arField["ENTITY_ID"]);
848
849 $arType = $USER_FIELD_MANAGER->GetUserType($arField["USER_TYPE_ID"]);
850 //We need special handling of file type properties
851 if ($arType)
852 {
853 if ($arType["BASE_TYPE"] == "file" && $commonEventResult['PROVIDE_STORAGE'])
854 {
855 // only if we store values
856 if ($arField["MULTIPLE"] == "Y")
857 {
858 $strSql = "SELECT VALUE_INT AS VALUE FROM b_utm_" . $entityId . " WHERE FIELD_ID=" . $arField["ID"];
859 }
860 else
861 {
862 $strSql = "SELECT " . $arField["FIELD_NAME"] . " AS VALUE FROM b_uts_" . $entityId;
863 }
864 $rsFile = $DB->Query($strSql);
865 while ($arFile = $rsFile->Fetch())
866 {
867 CFile::Delete($arFile["VALUE"]);
868 }
869 }
870 elseif ($arType["BASE_TYPE"] == "enum")
871 {
872 $obEnum = new CUserFieldEnum;
873 $obEnum->DeleteFieldEnum($arField["ID"]);
874 }
875 }
876
877 $rs = $DB->Query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = " . $ID);
878 if ($rs)
879 {
880 $rs = $DB->Query("DELETE FROM b_user_field WHERE ID = " . $ID);
881 }
882
883 static::cleanCache();
884
885 foreach (GetModuleEvents("main", "OnAfterUserTypeDelete", true) as $arEvent)
886 {
887 ExecuteModuleEventEx($arEvent, [$arField, $ID]);
888 }
889
890 if ($rs && $commonEventResult['PROVIDE_STORAGE'])
891 {
892 // only if we store values
893 $DB->Query("DELETE FROM b_utm_" . $entityId . " WHERE FIELD_ID = '" . $ID . "'");
894 $DB->Query("ALTER TABLE b_uts_" . $entityId . " DROP " . $arField["FIELD_NAME"]);
895 }
896 }
897 return $rs;
898 }
899
909 public function DropEntity($entity_id)
910 {
911 global $DB, $USER_FIELD_MANAGER;
912
913 $entity_id = preg_replace("/[^0-9A-Z_]+/", "", $entity_id);
914
915 $rs = true;
916 $rsFields = $this->GetList([], ["ENTITY_ID" => $entity_id]);
917 //We need special handling of file and enum type properties
918 while ($arField = $rsFields->Fetch())
919 {
920 $arType = $USER_FIELD_MANAGER->GetUserType($arField["USER_TYPE_ID"]);
921 if ($arType && ($arType["BASE_TYPE"] == "file" || $arType["BASE_TYPE"] == "enum"))
922 {
923 $this->Delete($arField["ID"]);
924 }
925 }
926
927 $bDropTable = false;
928 $rsFields = $this->GetList([], ["ENTITY_ID" => $entity_id]);
929 while ($arField = $rsFields->Fetch())
930 {
931 $bDropTable = true;
932 $DB->Query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = " . $arField["ID"]);
933 $rs = $DB->Query("DELETE FROM b_user_field WHERE ID = " . $arField["ID"]);
934
935 foreach (GetModuleEvents("main", "OnAfterUserTypeDelete", true) as $arEvent)
936 {
937 ExecuteModuleEventEx($arEvent, [$arField, $arField["ID"]]);
938 }
939 }
940
941 static::cleanCache();
942
943 if ($bDropTable)
944 {
945 $entityId = strtolower($entity_id);
946 $DB->Query("DROP TABLE IF EXISTS b_uts_" . $entityId);
947 $DB->Query("DROP TABLE IF EXISTS b_utm_" . $entityId);
948 }
949
950 return $rs;
951 }
952
953 protected static function cleanCache(): void
954 {
956
957 if (CACHED_b_user_field !== false)
958 {
959 $CACHE_MANAGER->CleanDir("b_user_field");
960 }
961 UserFieldTable::cleanCache();
962 UserFieldLangTable::cleanCache();
963 $USER_FIELD_MANAGER->CleanCache();
964 static::$cache = [];
965 }
966
973 function Fetch()
974 {
975 $res = parent::Fetch();
976 if ($res && $res["SETTINGS"] <> '')
977 {
978 $res["SETTINGS"] = unserialize($res["SETTINGS"], ['allowed_classes' => false]);
979 }
980 return $res;
981 }
982}
983
985{
986}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
$arResult
Определения dbresult.php:17
$DB
Определения dbresult.php:40
Определения usertype.php:89
Delete($ID)
Определения usertype.php:802
CreatePropertyTables($entity_id)
Определения usertype.php:92
static cleanCache()
Определения usertype.php:953
static GetByID($ID)
Определения usertype.php:130
CheckFields($ID, $arFields, $bCheckUserType=true)
Определения usertype.php:328
Fetch()
Определения usertype.php:973
DropEntity($entity_id)
Определения usertype.php:909
static $cache
Определения usertype.php:90
static GetList($aSort=[], $aFilter=[])
Определения usertype.php:170
Update($ID, $arFields)
Определения usertype.php:659
Add($arFields, $bCheckUserType=true)
Определения usertype.php:437
Определения dbresult.php:88
Определения userfieldenum.php:6
DeleteFieldEnum($FIELD_ID)
Определения userfieldenum.php:298
Определения usertype.php:985
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$arFields
Определения dblapprove.php:5
$res
Определения filter_act.php:7
global $USER_FIELD_MANAGER
Определения attempt.php:6
if($ajaxMode) $ID
Определения get_user.php:27
if(!defined('SITE_ID')) $lang
Определения include.php:91
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
DelDuplicateSort(&$arSort)
Определения tools.php:2055
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
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$entityId
Определения payment.php:4
$arLangs
Определения prolog_auth_admin.php:31
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
$val
Определения options.php:1793
$rs
Определения action.php:82
$arFilter
Определения user_search.php:106