1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
datamanager.php
См. документацию.
1<?php
2
9
10namespace Bitrix\Main\ORM\Data;
11
12use Bitrix\Main;
13use Bitrix\Main\ORM\Entity;
14use Bitrix\Main\ORM\EntityError;
15use Bitrix\Main\ORM\Event;
16use Bitrix\Main\ORM\Fields\ExpressionField;
17use Bitrix\Main\ORM\Fields\FieldError;
18use Bitrix\Main\ORM\Fields\FieldTypeMask;
19use Bitrix\Main\ORM\Fields\ScalarField;
20use Bitrix\Main\ORM\Objectify\Values;
21use Bitrix\Main\ORM\Query\Query;
22use Bitrix\Main\ORM\Query\Result as QueryResult;
23use Bitrix\Main\Localization\Loc;
24use Bitrix\Main\ORM\Data\AddStrategy\Contract\AddStrategy;
25use Bitrix\Main\ORM\Query\Filter\ConditionTree as Filter;
26use Bitrix\Main\ORM\Objectify\EntityObject;
27use Bitrix\Main\ORM\Objectify\Collection;
28
29Loc::loadMessages(__FILE__);
30
34abstract class DataManager
35{
36 const EVENT_ON_BEFORE_ADD = "OnBeforeAdd";
37 const EVENT_ON_ADD = "OnAdd";
38 const EVENT_ON_AFTER_ADD = "OnAfterAdd";
39 const EVENT_ON_BEFORE_UPDATE = "OnBeforeUpdate";
40 const EVENT_ON_UPDATE = "OnUpdate";
41 const EVENT_ON_AFTER_UPDATE = "OnAfterUpdate";
42 const EVENT_ON_BEFORE_DELETE = "OnBeforeDelete";
43 const EVENT_ON_DELETE = "OnDelete";
44 const EVENT_ON_AFTER_DELETE = "OnAfterDelete";
45
47 protected static $entity;
48
50 protected static $objectClass;
51
53 protected static $collectionClass;
54
56 protected static $currentDeletingObjects;
57
65 public static function getEntity()
66 {
67 $class = static::getEntityClass()::normalizeEntityClass(get_called_class());
68
69 if (!isset(static::$entity[$class]))
70 {
71 static::$entity[$class] = static::getEntityClass()::getInstance($class);
72 }
73
74 return static::$entity[$class];
75 }
76
77 public static function unsetEntity($class)
78 {
79 $class = static::getEntityClass()::normalizeEntityClass($class);
80
81 if (isset(static::$entity[$class]))
82 {
83 unset(static::$entity[$class]);
84 }
85 }
86
92 public static function getTableName()
93 {
94 return null;
95 }
96
102 public static function getConnectionName()
103 {
104 return 'default';
105 }
106
110 public static function getTitle()
111 {
112 return null;
113 }
114
120 public static function getObjectClass()
121 {
122 if (!isset(static::$objectClass[get_called_class()]))
123 {
124 static::$objectClass[get_called_class()] = static::getObjectClassByDataClass(get_called_class());
125 }
126
127 return static::$objectClass[get_called_class()];
128 }
129
135 final public static function getObjectClassName()
136 {
137 $class = static::getObjectClass();
138 return substr($class, strrpos($class, '\\') + 1);
139 }
140
141 protected static function getObjectClassByDataClass($dataClass)
142 {
143 $objectClass = static::getEntityClass()::normalizeName($dataClass);
144
145 // make class name more unique
146 $namespace = substr($objectClass, 0, strrpos($objectClass, '\\') + 1);
147 $className = substr($objectClass, strrpos($objectClass, '\\') + 1);
148
149 $className = static::getEntityClass()::getDefaultObjectClassName($className);
150
151 return $namespace.$className;
152 }
153
159 public static function getCollectionClass()
160 {
161 if (!isset(static::$collectionClass[get_called_class()]))
162 {
163 static::$collectionClass[get_called_class()] = static::getCollectionClassByDataClass(get_called_class());
164 }
165
166 return static::$collectionClass[get_called_class()];
167 }
168
174 final public static function getCollectionClassName()
175 {
176 $class = static::getCollectionClass();
177 return substr($class, strrpos($class, '\\') + 1);
178 }
179
180 protected static function getCollectionClassByDataClass($dataClass)
181 {
182 $objectClass = static::getEntityClass()::normalizeName($dataClass);
183
184 // make class name more unique
185 $namespace = substr($objectClass, 0, strrpos($objectClass, '\\') + 1);
186 $className = substr($objectClass, strrpos($objectClass, '\\') + 1);
187
188 $className = static::getEntityClass()::getDefaultCollectionClassName($className);
189
190 return $namespace.$className;
191 }
192
196 public static function getObjectParentClass()
197 {
198 return EntityObject::class;
199 }
200
204 public static function getCollectionParentClass()
205 {
206 return Collection::class;
207 }
208
212 public static function getQueryClass()
213 {
214 return Query::class;
215 }
216
220 public static function getEntityClass()
221 {
222 return Entity::class;
223 }
224
232 final public static function createObject($setDefaultValues = true)
233 {
234 return static::getEntity()->createObject($setDefaultValues);
235 }
236
242 final public static function createCollection()
243 {
244 return static::getEntity()->createCollection();
245 }
246
256 final public static function wakeUpObject($row)
257 {
258 return static::getEntity()->wakeUpObject($row);
259 }
260
270 final public static function wakeUpCollection($rows)
271 {
272 return static::getEntity()->wakeUpCollection($rows);
273 }
274
279 public static function getMap()
280 {
281 return array();
282 }
283
284 public static function getUfId()
285 {
286 return null;
287 }
288
289 public static function isUts()
290 {
291 return false;
292 }
293
294 public static function isUtm()
295 {
296 return false;
297 }
298
304 public static function setDefaultScope($query)
305 {
306 return $query;
307 }
308
314 public static function postInitialize(Entity $entity)
315 {
316 return null;
317 }
318
330 public static function getByPrimary($primary, array $parameters = array())
331 {
332 static::normalizePrimary($primary);
333 static::validatePrimary($primary);
334
335 $primaryFilter = array();
336
337 foreach ($primary as $k => $v)
338 {
339 $primaryFilter['='.$k] = $v;
340 }
341
342 if (isset($parameters['filter']))
343 {
344 $parameters['filter'] = array($primaryFilter, $parameters['filter']);
345 }
346 else
347 {
348 $parameters['filter'] = $primaryFilter;
349 }
350
351 return static::getList($parameters);
352 }
353
364 public static function getById($id)
365 {
366 return static::getByPrimary($id);
367 }
368
380 public static function getRowById($id, array $parameters = [])
381 {
382 $result = static::getByPrimary($id, $parameters);
383 $row = $result->fetch();
384
385 return (is_array($row)? $row : null);
386 }
387
398 public static function getRow(array $parameters)
399 {
400 $parameters['limit'] = 1;
401 $result = static::getList($parameters);
402 $row = $result->fetch();
403
404 return (is_array($row)? $row : null);
405 }
406
431 public static function getList(array $parameters = array())
432 {
433 $query = static::query();
434
435 if(!isset($parameters['select']))
436 {
437 $query->setSelect(array('*'));
438 }
439
440 foreach($parameters as $param => $value)
441 {
442 switch($param)
443 {
444 case 'select':
445 $query->setSelect($value);
446 break;
447 case 'filter':
448 $value instanceof Filter ? $query->where($value) : $query->setFilter($value);
449 break;
450 case 'group':
451 $query->setGroup($value);
452 break;
453 case 'order';
454 $query->setOrder($value);
455 break;
456 case 'limit':
457 $query->setLimit($value);
458 break;
459 case 'offset':
460 $query->setOffset($value);
461 break;
462 case 'count_total':
463 $query->countTotal($value);
464 break;
465 case 'runtime':
466 foreach ($value as $name => $fieldInfo)
467 {
468 $query->registerRuntimeField($name, $fieldInfo);
469 }
470 break;
471 case 'data_doubling':
472 if($value)
473 {
474 $query->enableDataDoubling();
475 }
476 else
477 {
478 $query->disableDataDoubling();
479 }
480 break;
481 case 'private_fields':
482 if($value)
483 {
484 $query->enablePrivateFields();
485 }
486 else
487 {
488 $query->disablePrivateFields();
489 }
490 break;
491 case 'cache':
492 $query->setCacheTtl($value["ttl"]);
493 if(isset($value["cache_joins"]))
494 {
495 $query->cacheJoins($value["cache_joins"]);
496 }
497 break;
498 default:
499 throw new Main\ArgumentException("Unknown parameter: ".$param, $param);
500 }
501 }
502
503 return $query->exec();
504 }
505
516 public static function getCount($filter = array(), array $cache = array())
517 {
518 $query = static::query();
519
520 // new filter
521 $query->addSelect(new ExpressionField('CNT', 'COUNT(1)'));
522
523 if ($filter instanceof Filter)
524 {
525 $query->where($filter);
526 }
527 else
528 {
529 $query->setFilter($filter);
530 }
531
532 if(isset($cache["ttl"]))
533 {
534 $query->setCacheTtl($cache["ttl"]);
535 }
536
537 $result = $query->exec()->fetch();
538
539 return (int)$result['CNT'];
540 }
541
549 public static function query()
550 {
551 $queryClass = static::getQueryClass();
552 return new $queryClass(static::getEntity());
553 }
554
562 protected static function replaceFieldName($data = array())
563 {
564 $newData = [];
565 $entity = static::getEntity();
566
567 foreach ($data as $fieldName => $value)
568 {
569 $newData[$entity->getField($fieldName)->getColumnName()] = $value;
570 }
571
572 return $newData;
573 }
574
582 protected static function normalizePrimary(&$primary, $data = array())
583 {
584 $entity = static::getEntity();
585 $entity_primary = $entity->getPrimaryArray();
586
587 if ($primary === null)
588 {
589 $primary = array();
590
591 // extract primary from data array
592 foreach ($entity_primary as $key)
593 {
595 $field = $entity->getField($key);
596 if ($field->isAutocomplete())
597 {
598 continue;
599 }
600
601 if (!isset($data[$key]))
602 {
603 throw new Main\ArgumentException(sprintf(
604 'Primary `%s` was not found when trying to query %s row.', $key, $entity->getName()
605 ));
606 }
607
608 $primary[$key] = $data[$key];
609 }
610 }
611 elseif (is_scalar($primary))
612 {
613 if (count($entity_primary) > 1)
614 {
615 throw new Main\ArgumentException(sprintf(
616 'Require multi primary {`%s`}, but one scalar value "%s" found when trying to query %s row.',
617 join('`, `', $entity_primary), $primary, $entity->getName()
618 ));
619 }
620
621 $primary = array($entity_primary[0] => $primary);
622 }
623 }
624
631 protected static function validatePrimary($primary)
632 {
633 $entity = static::getEntity();
634 if (is_array($primary))
635 {
636 if(empty($primary))
637 {
638 throw new Main\ArgumentException(sprintf(
639 'Empty primary found when trying to query %s row.', $entity->getName()
640 ));
641 }
642
643 $entity_primary = $entity->getPrimaryArray();
644
645 foreach (array_keys($primary) as $key)
646 {
647 if (!in_array($key, $entity_primary, true))
648 {
649 throw new Main\ArgumentException(sprintf(
650 'Unknown primary `%s` found when trying to query %s row.',
651 $key, $entity->getName()
652 ));
653 }
654 }
655 }
656 else
657 {
658 throw new Main\ArgumentException(sprintf(
659 'Unknown type of primary "%s" found when trying to query %s row.', gettype($primary), $entity->getName()
660 ));
661 }
662
663 // primary values validation
664 foreach ($primary as $key => $value)
665 {
666 if (!is_scalar($value) && !($value instanceof Main\Type\Date))
667 {
668 throw new Main\ArgumentException(sprintf(
669 'Unknown value type "%s" for primary "%s" found when trying to query %s row.',
670 gettype($value), $key, $entity->getName()
671 ));
672 }
673 }
674 }
675
686 public static function checkFields(Result $result, $primary, array $data)
687 {
688 $entity = static::getEntity();
689 //checks required fields
690 foreach ($entity->getFields() as $field)
691 {
692 if ($field instanceof ScalarField && $field->isRequired())
693 {
694 $fieldName = $field->getName();
695 if (
696 (empty($primary) && (!isset($data[$fieldName]) || $field->isValueEmpty($data[$fieldName])))
697 || (!empty($primary) && array_key_exists($fieldName, $data) && $field->isValueEmpty($data[$fieldName]))
698 )
699 {
700 $result->addError(new FieldError(
701 $field,
702 Loc::getMessage("MAIN_ENTITY_FIELD_REQUIRED", array("#FIELD#"=>$field->getTitle())),
703 FieldError::EMPTY_REQUIRED
704 ));
705 }
706 }
707 }
708
709 // checks data - fieldname & type & strlen etc.
710 foreach ($data as $k => $v)
711 {
712 if ($entity->hasField($k))
713 {
714 $field = $entity->getField($k);
715
716 }
717 else
718 {
719 throw new Main\ArgumentException(sprintf(
720 'Field `%s` not found in entity when trying to query %s row.',
721 $k, $entity->getName()
722 ));
723 }
724
725 $field->validateValue($v, $primary, $data, $result);
726 }
727 }
728
738 protected static function convertArrayToObject(&$fields, $setDefaultValues = false, $primary = null)
739 {
740 // extended data format
741 $data = null;
742
743 if (isset($fields["fields"]) && is_array($fields["fields"]))
744 {
745 $data = $fields;
746 $fields = $data["fields"];
747 }
748
749 // convert to object
750 if (isset($fields['__object']))
751 {
752 $object = $fields['__object'];
753 unset($fields['__object']);
754 }
755 else
756 {
757 $entity = static::getEntity();
758
760 if ($primary === null)
761 {
762 $object = $entity->createObject($setDefaultValues);
763
764 foreach ($fields as $fieldName => $value)
765 {
766 // sometimes data array can be used for storing non-entity data
767 if ($entity->hasField($fieldName))
768 {
769 $object->sysSetValue($fieldName, $value);
770 }
771 }
772 }
773 else
774 {
775 $object = $entity->wakeUpObject($primary);
776
777 foreach ($fields as $fieldName => $value)
778 {
779 // sometimes data array can be used for storing non-entity data
780 if ($entity->hasField($fieldName))
781 {
782 if ($entity->getField($fieldName) instanceof ScalarField && $entity->getField($fieldName)->isPrimary())
783 {
784 // ignore old primary
785 if (array_key_exists($fieldName, $primary) && $primary[$fieldName] == $value)
786 {
787 unset($fields[$fieldName]);
788 continue;
789 }
790
791 // but prevent primary changing
792 trigger_error(sprintf(
793 'Primary of %s %s can not be changed. You can delete this row and add a new one',
794 static::getObjectClass(), Main\Web\Json::encode($object->primary)
795 ), E_USER_WARNING);
796
797 continue;
798 }
799
800 $object->sysSetValue($fieldName, $value);
801 }
802 }
803 }
804 }
805
806 // auth context
807 if (isset($data['auth_context']))
808 {
809 $object->authContext = $data['auth_context'];
810 }
811
812 return $object;
813 }
814
820 protected static function checkUfFields($object, $ufdata, $result)
821 {
823
824 $userId = ($object->authContext && $object->authContext->getUserId())
825 ? $object->authContext->getUserId()
826 : false;
827
828 if ($object->sysGetState() === Main\ORM\Objectify\State::RAW)
829 {
830 $ufPrimary = false;
831 }
832 else
833 {
834 $ufPrimary = $object->primary;
835 $ufPrimary = end($ufPrimary);
836 }
837
838 if (!$USER_FIELD_MANAGER->CheckFields($object->entity->getUfId(), $ufPrimary, $ufdata, $userId))
839 {
840 if (is_object($APPLICATION) && $APPLICATION->getException())
841 {
842 $e = $APPLICATION->getException();
843 $result->addError(new EntityError($e->getString()));
844 $APPLICATION->resetException();
845 }
846 else
847 {
848 $result->addError(new EntityError("Unknown error while checking userfields"));
849 }
850 }
851 }
852
853 protected static function getAddStrategy(): AddStrategy
854 {
855 return new Main\ORM\Data\AddStrategy\Insert(static::getEntity());
856 }
857
877 public static function add(array $data)
878 {
879 return self::sysAddInternal(static::getAddStrategy(), $data);
880 }
881
885 final protected static function sysAddInternal(
886 AddStrategy $strategy,
887 array $data,
888 bool $ignoreEvents = false,
889 ): AddResult
890 {
891 global $USER_FIELD_MANAGER;
892
893 // compatibility
894 $fields = $data;
895
896 // prepare entity object for compatibility with new code
897 $object = static::convertArrayToObject($fields, true);
898
899 $entity = static::getEntity();
900 $result = new AddResult();
901
902 try
903 {
904 if (!$ignoreEvents)
905 {
906 static::callOnBeforeAddEvent($object, $fields, $result);
907 }
908
909 // actualize old-style fields array from object
910 $fields = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
911
912 // uf values
913 $ufdata = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);
914
915 // check data
916 static::checkFields($result, null, $fields);
917
918 // check uf data
919 if (!empty($ufdata))
920 {
921 static::checkUfFields($object, $ufdata, $result);
922 }
923
924 // check if there is still some data
925 if (empty($fields) && empty($ufdata))
926 {
927 $result->addError(new EntityError('There is no data to add.'));
928 }
929
930 // return if any error
931 if (!$result->isSuccess(true))
932 {
933 return $result;
934 }
935
936 if (!$ignoreEvents)
937 {
938 //event on adding
939 self::callOnAddEvent($object, $fields, $ufdata);
940 }
941
942 // use save modifiers
943 $fieldsToDb = $fields;
944
945 foreach ($fieldsToDb as $fieldName => $value)
946 {
947 $field = $entity->getField($fieldName);
948 if ($field->isPrimary() && $field->isAutocomplete() && is_null($value))
949 {
950 unset($fieldsToDb[$fieldName]); // postgresql compatibility
951 continue;
952 }
953 $fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
954 }
955
956 $addedData = $strategy->add(static::replaceFieldName($fieldsToDb));
957 $id = $addedData->id;
958
959 // build standard primary
960 $primary = null;
961 $isGuessedPrimary = false;
962
963 if (!empty($id))
964 {
965 if (!empty($entity->getAutoIncrement()))
966 {
967 $primary = [$entity->getAutoIncrement() => $id];
968 static::normalizePrimary($primary);
969 }
970 else
971 {
972 // for those who did not set 'autocomplete' flag but wants to get id from result
973 $primary = ['ID' => $id];
974 $isGuessedPrimary = true;
975 }
976 }
977 else
978 {
979 static::normalizePrimary($primary, $fields);
980 }
981
982 // fill result
983 $result->setPrimary($primary);
984 $result->setData($fields + $ufdata);
985 $result->setObject($object);
986
987 if (!$isGuessedPrimary)
988 {
989 foreach ($primary as $primaryName => $primaryValue)
990 {
991 $object->sysSetActual($primaryName, $primaryValue);
992 }
993 }
994
995 // save uf data
996 if (!empty($ufdata))
997 {
998 $ufUserId = false;
999
1000 if ($object->authContext)
1001 {
1002 $ufUserId = $object->authContext->getUserId();
1003 }
1004
1005 $USER_FIELD_MANAGER->update($entity->getUfId(), end($primary), $ufdata, $ufUserId);
1006 }
1007
1008 if ($addedData->isDBChanged)
1009 {
1010 static::cleanCache();
1011 }
1012
1013 if (!$ignoreEvents)
1014 {
1015 static::callOnAfterAddEvent($object, $fields + $ufdata, $id);
1016 }
1017 }
1018 catch (\Exception $e)
1019 {
1020 // check result to avoid warning
1021 $result->isSuccess();
1022
1023 throw $e;
1024 }
1025
1026 return $result;
1027 }
1028
1041 public static function addMulti($rows, $ignoreEvents = false)
1042 {
1044 static::getAddStrategy(),
1045 (array)$rows,
1046 (bool)$ignoreEvents,
1047 );
1048 }
1049
1053 final protected static function sysAddMultiInternal(
1054 AddStrategy $strategy,
1055 array $multiData,
1056 bool $ignoreEvents = false,
1057 ): AddResult
1058 {
1059 if (count($multiData) <= 0)
1060 {
1061 return (new AddResult())->addError(new EntityError('There is no data to add.'));
1062 }
1063 if (count($multiData) === 1)
1064 {
1065 return self::sysAddInternal($strategy, reset($multiData), $ignoreEvents);
1066 }
1067
1068 global $USER_FIELD_MANAGER;
1069
1070 $rows = array_values($multiData);
1071
1072 // prepare objects
1073 $objects = [];
1074
1075 foreach ($rows as $k => &$row)
1076 {
1077 $objects[$k] = static::convertArrayToObject($row, true);
1078 }
1079
1080 $entity = static::getEntity();
1081 $result = new AddResult();
1082
1083 try
1084 {
1085 // call onBeforeEvent
1086 if (!$ignoreEvents)
1087 {
1088 foreach ($objects as $k => $object)
1089 {
1090 static::callOnBeforeAddEvent($object, $rows[$k], $result);
1091 }
1092 }
1093
1094 // collect array data
1095 $allFields = [];
1096 $allUfData = [];
1097
1098 foreach ($objects as $k => $object)
1099 {
1100 // actualize old-style fields array from object
1101 $allFields[$k] = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
1102
1103 // uf values
1104 $allUfData[$k] = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);
1105 }
1106
1107 // check data and uf
1108 foreach ($objects as $k => $object)
1109 {
1110 $fields = $allFields[$k];
1111 $ufdata = $allUfData[$k];
1112
1113 // check data
1114 static::checkFields($result, null, $fields);
1115
1116 // check uf data
1117 if (!empty($ufdata))
1118 {
1119 static::checkUfFields($object, $ufdata, $result);
1120 }
1121
1122 // check if there is still some data
1123 if (empty($fields) && empty($ufdata))
1124 {
1125 $result->addError(new EntityError('There is no data to add.'));
1126 }
1127 }
1128
1129 // return if any error in any row
1130 if (!$result->isSuccess(true))
1131 {
1132 return $result;
1133 }
1134
1135 //event on adding
1136 if (!$ignoreEvents)
1137 {
1138 foreach ($objects as $k => $object)
1139 {
1140 $fields = $allFields[$k];
1141 $ufdata = $allUfData[$k];
1142
1143 self::callOnAddEvent($object, $fields, $ufdata);
1144 }
1145 }
1146
1147 $allFieldsToDb = [];
1148
1149 foreach ($allFields as $k => $fields)
1150 {
1151 // use save modifiers
1152 $fieldsToDb = $fields;
1153
1154 foreach ($fieldsToDb as $fieldName => $value)
1155 {
1156 $field = $entity->getField($fieldName);
1157 $fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
1158 }
1159
1160 $dataReplacedColumn = static::replaceFieldName($fieldsToDb);
1161
1162 $allFieldsToDb[$k] = $dataReplacedColumn;
1163 }
1164
1165 if (!$ignoreEvents && !empty($entity->getAutoIncrement()))
1166 {
1167 // change to warning
1168 trigger_error(
1169 'Multi-insert doesn\'t work with events as far as we can not get last inserted IDs that we need for the events. '.
1170 'Insert query was forced to multiple separate queries.',
1171 E_USER_NOTICE
1172 );
1173
1174 $forcedSeparateQueries = true;
1175 $isDBChanged = false;
1176
1177 $ids = [];
1178 foreach ($allFieldsToDb as $key => $dbFields)
1179 {
1180 $addedData = $strategy->add($dbFields);
1181 $ids[$key] = $addedData->id;
1182 $isDBChanged = $isDBChanged || $addedData->isDBChanged;
1183 }
1184 }
1185 else
1186 {
1187 $addedData = $strategy->addMulti($allFieldsToDb);
1188
1189 $forcedSeparateQueries = false;
1190 $isDBChanged = $addedData->isDBChanged;
1191 $ids = null;
1192 }
1193
1194 // save uf data
1195 foreach ($allUfData as $k => $ufdata)
1196 {
1197 if (!empty($ufdata))
1198 {
1199 $ufUserId = false;
1200
1201 if ($objects[$k]->authContext)
1202 {
1203 $ufUserId = $objects[$k]->authContext->getUserId();
1204 }
1205
1206 $USER_FIELD_MANAGER->update($entity->getUfId(), end($primary), $ufdata, $ufUserId);
1207 }
1208 }
1209
1210 if ($isDBChanged)
1211 {
1212 static::cleanCache();
1213 }
1214
1215 // after event
1216 if (!$ignoreEvents)
1217 {
1218 foreach ($objects as $k => $object)
1219 {
1220 $fields = $allFields[$k] + $allUfData[$k];
1221 $id = $forcedSeparateQueries ? $ids[$k] : null;
1222
1223 static::callOnAfterAddEvent($object, $fields, $id);
1224 }
1225 }
1226 }
1227 catch (\Exception $e)
1228 {
1229 // check result to avoid warning
1230 $result->isSuccess();
1231
1232 throw $e;
1233 }
1234
1235 return $result;
1236 }
1237
1256 public static function update($primary, array $data)
1257 {
1258 global $USER_FIELD_MANAGER;
1259
1260 // check primary
1261 static::normalizePrimary(
1262 $primary, isset($data["fields"]) && is_array($data["fields"]) ? $data["fields"] : $data
1263 );
1264 static::validatePrimary($primary);
1265
1266 // compatibility
1267 $fields = $data;
1268
1269 // prepare entity object for compatibility with new code
1270 $object = static::convertArrayToObject($fields, false, $primary);
1271
1272 $entity = static::getEntity();
1273 $result = new UpdateResult();
1274
1275 try
1276 {
1277 static::callOnBeforeUpdateEvent($object, $fields, $result);
1278
1279 // actualize old-style fields array from object
1280 $fields = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
1281
1282 // uf values
1283 $ufdata = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);
1284
1285 // check data
1286 static::checkFields($result, $primary, $fields);
1287
1288 // check uf data
1289 if (!empty($ufdata))
1290 {
1291 static::checkUfFields($object, $ufdata, $result);
1292 }
1293
1294 // check if there is still some data
1295 if (empty($fields) && empty($ufdata))
1296 {
1297 return $result;
1298 }
1299
1300 // return if any error
1301 if (!$result->isSuccess(true))
1302 {
1303 return $result;
1304 }
1305
1306 static::callOnUpdateEvent($object, $fields, $ufdata);
1307
1308 // use save modifiers
1309 $fieldsToDb = $fields;
1310
1311 foreach ($fieldsToDb as $fieldName => $value)
1312 {
1313 $field = $entity->getField($fieldName);
1314 $fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
1315 }
1316
1317 // save data
1318 if (!empty($fieldsToDb))
1319 {
1320 $connection = $entity->getConnection();
1321 $helper = $connection->getSqlHelper();
1322
1323 $tableName = $entity->getDBTableName();
1324
1325 $dataReplacedColumn = static::replaceFieldName($fieldsToDb);
1326 $update = $helper->prepareUpdate($tableName, $dataReplacedColumn);
1327
1328 $replacedPrimary = static::replaceFieldName($primary);
1329 $id = array();
1330 foreach ($replacedPrimary as $k => $v)
1331 {
1332 $id[] = $helper->prepareAssignment($tableName, $k, $v);
1333 }
1334 $where = implode(' AND ', $id);
1335
1336 $sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
1337 $connection->queryExecute($sql, $update[1]);
1338
1339 $result->setAffectedRowsCount($connection);
1340 }
1341
1342 $result->setData($fields + $ufdata);
1343 $result->setPrimary($primary);
1344 $result->setObject($object);
1345
1346 // save uf data
1347 if (!empty($ufdata))
1348 {
1349 $ufUserId = false;
1350
1351 if ($object->authContext)
1352 {
1353 $ufUserId = $object->authContext->getUserId();
1354 }
1355
1356 $USER_FIELD_MANAGER->update($entity->getUfId(), end($primary), $ufdata, $ufUserId);
1357 }
1358
1359 static::cleanCache();
1360
1361 // event after update
1362 static::callOnAfterUpdateEvent($object, $fields + $ufdata);
1363 }
1364 catch (\Exception $e)
1365 {
1366 // check result to avoid warning
1367 $result->isSuccess();
1368
1369 throw $e;
1370 }
1371
1372 return $result;
1373 }
1374
1384 public static function updateMulti($primaries, $data, $ignoreEvents = false)
1385 {
1386 global $USER_FIELD_MANAGER;
1387
1388 $entity = static::getEntity();
1389 $primaries = array_values($primaries);
1390
1392 $objects = [];
1393
1394 foreach ($primaries as &$primary)
1395 {
1396 static::normalizePrimary($primary, $data);
1397 static::validatePrimary($primary);
1398
1400 $object = $entity->wakeUpObject($primary);
1401
1402 foreach ($data as $k => $v)
1403 {
1404 $object->set($k, $v);
1405 }
1406
1407 $objects[] = $object;
1408 }
1409
1410 $result = new UpdateResult;
1411
1412 try
1413 {
1414 // before event
1415 if (!$ignoreEvents)
1416 {
1417 foreach ($objects as $object)
1418 {
1419 static::callOnBeforeUpdateEvent($object, $data, $result);
1420 }
1421 }
1422
1423 // collect array data
1424 $allFields = [];
1425 $allUfData = [];
1426
1427 foreach ($objects as $k => $object)
1428 {
1429 // actualize old-style fields array from object
1430 $allFields[$k] = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
1431
1432 // uf values
1433 $allUfData[$k] = $object->collectValues(Values::CURRENT, FieldTypeMask::USERTYPE);
1434 }
1435
1436 // check data and uf
1437 foreach ($objects as $k => $object)
1438 {
1439 $fields = $allFields[$k];
1440 $ufdata = $allUfData[$k];
1441
1442 // check data
1443 static::checkFields($result, $object->primary, $fields);
1444
1445 // check uf data
1446 if (!empty($ufdata))
1447 {
1448 static::checkUfFields($object, $ufdata, $result);
1449 }
1450
1451 // check if there is still some data
1452 if (empty($fields) && empty($ufdata))
1453 {
1454 $result->addError(new EntityError("There is no data to add."));
1455 }
1456 }
1457
1458 // return if any error in any row
1459 if (!$result->isSuccess(true))
1460 {
1461 return $result;
1462 }
1463
1464 //event on adding
1465 if (!$ignoreEvents)
1466 {
1467 foreach ($objects as $k => $object)
1468 {
1469 $fields = $allFields[$k];
1470 $ufdata = $allUfData[$k];
1471
1472 static::callOnUpdateEvent($object, $fields, $ufdata);
1473 }
1474 }
1475
1476 // prepare sql
1477 $allSqlData = [];
1478
1479 foreach ($allFields as $k => $fields)
1480 {
1481 // use save modifiers
1482 $fieldsToDb = $fields;
1483
1484 foreach ($fieldsToDb as $fieldName => $value)
1485 {
1486 $field = $entity->getField($fieldName);
1487 $fieldsToDb[$fieldName] = $field->modifyValueBeforeSave($value, $fields);
1488 }
1489
1490 $dataReplacedColumn = static::replaceFieldName($fieldsToDb);
1491
1492 $allSqlData[$k] = $dataReplacedColumn;
1493 }
1494
1495 // check if rows data are equal
1496 $areEqual = true;
1497
1498 $dataSample = $allSqlData[0];
1499 asort($dataSample);
1500
1501 if (!empty($allSqlData[0]))
1502 {
1503
1504 foreach ($allSqlData as $data)
1505 {
1506 asort($data);
1507
1508 if ($data !== $dataSample)
1509 {
1510 $areEqual = false;
1511 break;
1512 }
1513 }
1514
1515 // save data
1516 $connection = $entity->getConnection();
1517 $helper = $connection->getSqlHelper();
1518 $tableName = $entity->getDBTableName();
1519
1520 // save data
1521 if ($areEqual)
1522 {
1523 // one query
1524 $update = $helper->prepareUpdate($tableName, $dataSample);
1525 $where = [];
1526 $isSinglePrimary = (count($entity->getPrimaryArray()) == 1);
1527
1528 foreach ($allSqlData as $k => $data)
1529 {
1530 $replacedPrimary = static::replaceFieldName($objects[$k]->primary);
1531
1532 if ($isSinglePrimary)
1533 {
1534 // for single primary IN is better
1535 $primaryName = key($replacedPrimary);
1536 $primaryValue = current($replacedPrimary);
1537 $tableField = $entity->getConnection()->getTableField($tableName, $primaryName);
1538
1539 $where[] = $helper->convertToDb($primaryValue, $tableField);
1540 }
1541 else
1542 {
1543 $id = [];
1544
1545 foreach ($replacedPrimary as $primaryName => $primaryValue)
1546 {
1547 $id[] = $helper->prepareAssignment($tableName, $primaryName, $primaryValue);
1548 }
1549 $where[] = implode(' AND ', $id);
1550 }
1551 }
1552
1553 if ($isSinglePrimary)
1554 {
1555 $where = $helper->quote($entity->getPrimary()).' IN ('.join(', ', $where).')';
1556 }
1557 else
1558 {
1559 $where = '('.join(') OR (', $where).')';
1560 }
1561
1562 $sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
1563 $connection->queryExecute($sql, $update[1]);
1564
1565 $result->setAffectedRowsCount($connection);
1566 }
1567 else
1568 {
1569 // query for each row
1570 foreach ($allSqlData as $k => $dataReplacedColumn)
1571 {
1572 $update = $helper->prepareUpdate($tableName, $dataReplacedColumn);
1573
1574 $replacedPrimary = static::replaceFieldName($objects[$k]->primary);
1575
1576 $id = [];
1577
1578 foreach ($replacedPrimary as $primaryName => $primaryValue)
1579 {
1580 $id[] = $helper->prepareAssignment($tableName, $primaryName, $primaryValue);
1581 }
1582 $where = implode(' AND ', $id);
1583
1584 $sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
1585 $connection->queryExecute($sql, $update[1]);
1586
1587 $result->setAffectedRowsCount($connection);
1588 }
1589 }
1590 }
1591
1592 // doesn't make sense for multiple rows
1593 $result->setData($dataSample);
1594
1595 if (count($allSqlData) == 1)
1596 {
1597 $result->setPrimary($objects[0]->primary);
1598 $result->setObject($objects[0]);
1599 }
1600
1601 // save uf data
1602 foreach ($allUfData as $k => $ufdata)
1603 {
1604 if (!empty($ufdata))
1605 {
1606 $ufPrimary = $objects[$k]->primary;
1607 $USER_FIELD_MANAGER->update($entity->getUfId(), end($ufPrimary), $ufdata);
1608 }
1609 }
1610
1611 static::cleanCache();
1612
1613 // event after update
1614 if (!$ignoreEvents)
1615 {
1616 foreach ($objects as $k => $object)
1617 {
1618 $fields = $allFields[$k] + $allUfData[$k];
1619
1620 static::callOnAfterUpdateEvent($object, $fields);
1621 }
1622 }
1623 }
1624 catch (\Exception $e)
1625 {
1626 // check result to avoid warning
1627 $result->isSuccess();
1628
1629 throw $e;
1630 }
1631
1632 return $result;
1633 }
1634
1644 public static function delete($primary)
1645 {
1646 global $USER_FIELD_MANAGER;
1647
1648 // check primary
1649 static::normalizePrimary($primary);
1650 static::validatePrimary($primary);
1651
1652 $entity = static::getEntity();
1653 $result = new DeleteResult();
1654
1655 $entityClass = static::getEntity()->getDataClass();
1656 $primaryAsString = EntityObject::sysSerializePrimary($primary, static::getEntity());
1657
1658 $object = !empty(static::$currentDeletingObjects[$entityClass][$primaryAsString])
1659 ? static::$currentDeletingObjects[$entityClass][$primaryAsString]
1660 : static::wakeUpObject($primary);
1661
1662 try
1663 {
1664 //event before delete
1665 static::callOnBeforeDeleteEvent($object, $entity, $result);
1666
1667 // return if any error
1668 if (!$result->isSuccess(true))
1669 {
1670 return $result;
1671 }
1672
1673 //event on delete
1674 static::callOnDeleteEvent($object, $entity);
1675
1676 // delete
1677 $connection = $entity->getConnection();
1678 $helper = $connection->getSqlHelper();
1679
1680 $tableName = $entity->getDBTableName();
1681
1682 $replacedPrimary = static::replaceFieldName($primary);
1683 $id = array();
1684 foreach ($replacedPrimary as $k => $v)
1685 {
1686 $id[] = $helper->prepareAssignment($tableName, $k, $v);
1687 }
1688 $where = implode(' AND ', $id);
1689
1690 $sql = "DELETE FROM ".$helper->quote($tableName)." WHERE ".$where;
1691 $connection->queryExecute($sql);
1692
1693 // delete uf data
1694 if ($entity->getUfId())
1695 {
1696 $USER_FIELD_MANAGER->delete($entity->getUfId(), end($primary));
1697 }
1698
1699 static::cleanCache();
1700
1701 //event after delete
1702 static::callOnAfterDeleteEvent($object, $entity);
1703 }
1704 catch (\Exception $e)
1705 {
1706 // check result to avoid warning
1707 $result->isSuccess();
1708
1709 throw $e;
1710 }
1711 finally
1712 {
1713 // clean temporary objects
1714 if (!empty(static::$currentDeletingObjects[$entityClass][$primaryAsString]))
1715 {
1716 unset(static::$currentDeletingObjects[$entityClass][$primaryAsString]);
1717 }
1718 }
1719
1720 return $result;
1721 }
1722
1728 protected static function callOnBeforeAddEvent($object, $fields, $result)
1729 {
1730 //event before adding
1731 $event = new Event($object->entity, self::EVENT_ON_BEFORE_ADD, [
1732 'fields' => $fields,
1733 'object' => $object,
1734 ]);
1735
1736 $event->send();
1737 $event->getErrors($result);
1738 $event->mergeObjectFields($object);
1739
1740 //event before adding (modern with namespace)
1741 $event = new Event($object->entity, self::EVENT_ON_BEFORE_ADD, [
1742 'fields' => $fields,
1743 'object' => $object,
1744 ], true);
1745
1746 $event->send();
1747 $event->getErrors($result);
1748 $event->mergeObjectFields($object);
1749 }
1750
1756 protected static function callOnAddEvent($object, $fields, $ufdata)
1757 {
1758 $event = new Event($object->entity, self::EVENT_ON_ADD, [
1759 'fields' => $fields + $ufdata,
1760 'object' => clone $object,
1761 ]);
1762 $event->send();
1763
1764 //event on adding (modern with namespace)
1765 $event = new Event($object->entity, self::EVENT_ON_ADD, [
1766 'fields' => $fields + $ufdata,
1767 'object' => clone $object,
1768 ], true);
1769 $event->send();
1770 }
1771
1777 protected static function callOnAfterAddEvent($object, $fields, $id)
1778 {
1779 //event after adding
1780 $event = new Event($object->entity, self::EVENT_ON_AFTER_ADD, [
1781 'id' => $id,
1782 'fields' => $fields,
1783 'object' => clone $object,
1784 ]);
1785 $event->send();
1786
1787 //event after adding (modern with namespace)
1788 $event = new Event($object->entity, self::EVENT_ON_AFTER_ADD, [
1789 'id' => $id,
1790 'primary' => $object->primary,
1791 'fields' => $fields,
1792 'object' => clone $object,
1793 ], true);
1794 $event->send();
1795 }
1796
1802 protected static function callOnBeforeUpdateEvent($object, $fields, $result)
1803 {
1804 $event = new Event($object->entity, self::EVENT_ON_BEFORE_UPDATE, [
1805 'id' => $object->primary,
1806 'fields' => $fields,
1807 'object' => $object,
1808 ]);
1809
1810 $event->send();
1811 $event->getErrors($result);
1812 $event->mergeObjectFields($object);
1813
1814 //event before update (modern with namespace)
1815 $event = new Event($object->entity, self::EVENT_ON_BEFORE_UPDATE, [
1816 'id' => $object->primary,
1817 'primary' => $object->primary,
1818 'fields' => $fields,
1819 'object' => $object,
1820 ], true);
1821
1822 $event->send();
1823 $event->getErrors($result);
1824 $event->mergeObjectFields($object);
1825 }
1826
1832 protected static function callOnUpdateEvent($object, $fields, $ufdata)
1833 {
1834 $event = new Event($object->entity, self::EVENT_ON_UPDATE, [
1835 'id' => $object->primary,
1836 'fields' => $fields + $ufdata,
1837 'object' => clone $object,
1838 ]);
1839 $event->send();
1840
1841 //event on update (modern with namespace)
1842 $event = new Event($object->entity, self::EVENT_ON_UPDATE, [
1843 'id' => $object->primary,
1844 'primary' => $object->primary,
1845 'fields' => $fields + $ufdata,
1846 'object' => clone $object,
1847 ], true);
1848 $event->send();
1849 }
1850
1855 protected static function callOnAfterUpdateEvent($object, $fields)
1856 {
1857 $event = new Event($object->entity, self::EVENT_ON_AFTER_UPDATE, [
1858 'id' => $object->primary,
1859 'fields' => $fields,
1860 'object' => clone $object,
1861 ]);
1862 $event->send();
1863
1864 //event after update (modern with namespace)
1865 $event = new Event($object->entity, self::EVENT_ON_AFTER_UPDATE, [
1866 'id' => $object->primary,
1867 'primary' => $object->primary,
1868 'fields' => $fields,
1869 'object' => clone $object,
1870 ], true);
1871 $event->send();
1872 }
1873
1879 protected static function callOnBeforeDeleteEvent($object, $entity, $result)
1880 {
1881 $event = new Event($entity, self::EVENT_ON_BEFORE_DELETE, array("id" => $object->primary));
1882 $event->send();
1883 $event->getErrors($result);
1884
1885 //event before delete (modern with namespace)
1886 $event = new Event($entity, self::EVENT_ON_BEFORE_DELETE, array("id" => $object->primary, "primary" => $object->primary, "object" => clone $object), true);
1887 $event->send();
1888 $event->getErrors($result);
1889 }
1890
1895 protected static function callOnDeleteEvent($object, $entity)
1896 {
1897 $event = new Event($entity, self::EVENT_ON_DELETE, array("id" => $object->primary));
1898 $event->send();
1899
1900 //event on delete (modern with namespace)
1901 $event = new Event($entity, self::EVENT_ON_DELETE, array("id" => $object->primary, "primary" => $object->primary, "object" => clone $object), true);
1902 $event->send();
1903 }
1904
1909 protected static function callOnAfterDeleteEvent($object, $entity)
1910 {
1911 $event = new Event($entity, self::EVENT_ON_AFTER_DELETE, array("id" => $object->primary));
1912 $event->send();
1913
1914 //event after delete (modern with namespace)
1915 $event = new Event($entity, self::EVENT_ON_AFTER_DELETE, array("id" => $object->primary, "primary" => $object->primary, "object" => clone $object), true);
1916 $event->send();
1917 }
1918
1926 public static function enableCrypto($field, $table = null, $mode = true)
1927 {
1928 if($table === null)
1929 {
1930 $table = static::getTableName();
1931 }
1932 $options = array();
1933 $optionString = Main\Config\Option::get("main", "~crypto_".$table);
1934 if($optionString <> '')
1935 {
1936 $options = unserialize($optionString, ['allowed_classes' => false]);
1937 }
1938 $options[strtoupper($field)] = $mode;
1939 Main\Config\Option::set("main", "~crypto_".$table, serialize($options));
1940 }
1941
1950 public static function cryptoEnabled($field, $table = null)
1951 {
1952 if($table === null)
1953 {
1954 $table = static::getTableName();
1955 }
1956 $optionString = Main\Config\Option::get("main", "~crypto_".$table);
1957 if($optionString <> '')
1958 {
1959 $field = strtoupper($field);
1960 $options = unserialize($optionString, ['allowed_classes' => false]);
1961 if(isset($options[$field]) && $options[$field] === true)
1962 {
1963 return true;
1964 }
1965 }
1966 return false;
1967 }
1968
1972 public static function setCurrentDeletingObject($object): void
1973 {
1974 $entityClass = static::getEntity()->getDataClass();
1975 self::$currentDeletingObjects[$entityClass][$object->primaryAsString] = $object;
1976 }
1977
1983 public static function cleanCache(): void
1984 {
1985 if (static::isCacheable())
1986 {
1987 $entity = static::getEntity();
1988 $entity->cleanCache();
1989 }
1990 }
1991
1997 public static function isCacheable(): bool
1998 {
1999 return true;
2000 }
2001
2002 /*
2003 An inheritor class can define the event handlers for own events.
2004 Why? To prevent from rewriting the add/update/delete functions.
2005 These handlers are triggered in the Bitrix\Main\ORM\Event::send() function
2006 */
2007 public static function onBeforeAdd(Event $event){}
2008 public static function onAdd(Event $event){}
2009 public static function onAfterAdd(Event $event){}
2010 public static function onBeforeUpdate(Event $event){}
2011 public static function onUpdate(Event $event){}
2012 public static function onAfterUpdate(Event $event){}
2013 public static function onBeforeDelete(Event $event){}
2014 public static function onDelete(Event $event){}
2015 public static function onAfterDelete(Event $event){}
2016}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static set($moduleId, $name, $value="", $siteId="")
Определения option.php:261
Определения event.php:5
static getCollectionParentClass()
Определения datamanager.php:204
static callOnBeforeUpdateEvent($object, $fields, $result)
Определения datamanager.php:1802
static wakeUpObject($row)
Определения datamanager.php:256
const EVENT_ON_AFTER_ADD
Определения datamanager.php:38
static getObjectClassByDataClass($dataClass)
Определения datamanager.php:141
static $collectionClass
Определения datamanager.php:53
static getCollectionClassByDataClass($dataClass)
Определения datamanager.php:180
const EVENT_ON_UPDATE
Определения datamanager.php:40
const EVENT_ON_DELETE
Определения datamanager.php:43
static callOnAfterUpdateEvent($object, $fields)
Определения datamanager.php:1855
static wakeUpCollection($rows)
Определения datamanager.php:270
static callOnAddEvent($object, $fields, $ufdata)
Определения datamanager.php:1756
static onAfterUpdate(Event $event)
Определения datamanager.php:2012
static isCacheable()
Определения datamanager.php:1997
static cleanCache()
Определения datamanager.php:1983
static setDefaultScope($query)
Определения datamanager.php:304
static getObjectParentClass()
Определения datamanager.php:196
static getEntity()
Определения datamanager.php:65
static onAdd(Event $event)
Определения datamanager.php:2008
static getObjectClassName()
Определения datamanager.php:135
static $currentDeletingObjects
Определения datamanager.php:56
const EVENT_ON_BEFORE_DELETE
Определения datamanager.php:42
static unsetEntity($class)
Определения datamanager.php:77
const EVENT_ON_AFTER_UPDATE
Определения datamanager.php:41
static onDelete(Event $event)
Определения datamanager.php:2014
static callOnBeforeDeleteEvent($object, $entity, $result)
Определения datamanager.php:1879
static getRowById($id, array $parameters=[])
Определения datamanager.php:380
static checkUfFields($object, $ufdata, $result)
Определения datamanager.php:820
static createCollection()
Определения datamanager.php:242
static setCurrentDeletingObject($object)
Определения datamanager.php:1972
static getCollectionClassName()
Определения datamanager.php:174
static getRow(array $parameters)
Определения datamanager.php:398
static getById($id)
Определения datamanager.php:364
static getList(array $parameters=array())
Определения datamanager.php:431
static onAfterAdd(Event $event)
Определения datamanager.php:2009
static sysAddInternal(AddStrategy $strategy, array $data, bool $ignoreEvents=false,)
Определения datamanager.php:885
static onBeforeAdd(Event $event)
Определения datamanager.php:2007
static validatePrimary($primary)
Определения datamanager.php:631
static callOnDeleteEvent($object, $entity)
Определения datamanager.php:1895
static addMulti($rows, $ignoreEvents=false)
Определения datamanager.php:1041
const EVENT_ON_BEFORE_ADD
Определения datamanager.php:36
const EVENT_ON_AFTER_DELETE
Определения datamanager.php:44
static getEntityClass()
Определения datamanager.php:220
static getAddStrategy()
Определения datamanager.php:853
static callOnBeforeAddEvent($object, $fields, $result)
Определения datamanager.php:1728
static sysAddMultiInternal(AddStrategy $strategy, array $multiData, bool $ignoreEvents=false,)
Определения datamanager.php:1053
static createObject($setDefaultValues=true)
Определения datamanager.php:232
static getConnectionName()
Определения datamanager.php:102
static getCount($filter=array(), array $cache=array())
Определения datamanager.php:516
static cryptoEnabled($field, $table=null)
Определения datamanager.php:1950
static replaceFieldName($data=array())
Определения datamanager.php:562
static add(array $data)
Определения datamanager.php:877
static checkFields(Result $result, $primary, array $data)
Определения datamanager.php:686
static enableCrypto($field, $table=null, $mode=true)
Определения datamanager.php:1926
static onAfterDelete(Event $event)
Определения datamanager.php:2015
static $objectClass
Определения datamanager.php:50
static callOnUpdateEvent($object, $fields, $ufdata)
Определения datamanager.php:1832
static postInitialize(Entity $entity)
Определения datamanager.php:314
static callOnAfterAddEvent($object, $fields, $id)
Определения datamanager.php:1777
static onBeforeDelete(Event $event)
Определения datamanager.php:2013
static onBeforeUpdate(Event $event)
Определения datamanager.php:2010
static getQueryClass()
Определения datamanager.php:212
static getByPrimary($primary, array $parameters=array())
Определения datamanager.php:330
static getObjectClass()
Определения datamanager.php:120
const EVENT_ON_BEFORE_UPDATE
Определения datamanager.php:39
static onUpdate(Event $event)
Определения datamanager.php:2011
static callOnAfterDeleteEvent($object, $entity)
Определения datamanager.php:1909
static getTitle()
Определения datamanager.php:110
static update($primary, array $data)
Определения datamanager.php:1256
static getTableName()
Определения datamanager.php:92
static getCollectionClass()
Определения datamanager.php:159
Определения date.php:9
$options
Определения commerceml2.php:49
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
global $USER_FIELD_MANAGER
Определения attempt.php:6
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$entity
$filter
Определения iblock_catalog_list.php:54
$name
Определения menu_edit.php:35
Определения ufield.php:9
Определения collection.php:2
$table
Определения mysql_to_pgsql.php:36
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
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
$rows
Определения options.php:264
$k
Определения template_pdf.php:567
$fields
Определения yandex_run.php:501