1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
datamanager.php
См. документацию.
1<?php
8
10
11use Bitrix\Main;
18
19abstract class DataManager extends Entity\DataManager
20{
25 public static function getHighloadBlock()
26 {
27 return null;
28 }
29
30 public static function checkFields(Entity\Result $result, $primary, array $data)
31 {
32 // check for unknown fields
33 foreach ($data as $k => $v)
34 {
35 if (!(static::getEntity()->hasField($k) && static::getEntity()->getField($k) instanceof Entity\ScalarField))
36 {
37 throw new Main\SystemException(sprintf(
38 'Field `%s` not found in entity when trying to query %s row.',
39 $k, static::getEntity()->getName()
40 ));
41 }
42 }
43 }
44
53 public static function add(array $data)
54 {
56
57 // prepare entity object for compatibility with new code
58 $object = static::convertArrayToObject($data, true);
59
60 $result = new Entity\AddResult;
61 $hlblock = static::getHighloadBlock();
62 $entity = static::getEntity();
63
64 try
65 {
66 static::callOnBeforeAddEvent($object, $data, $result);
67
68 // actualize old-style fields array from object
69 $data = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
70
71 // check data by uf manager
72 if (!$USER_FIELD_MANAGER->checkFields('HLBLOCK_'.$hlblock['ID'], null, $data))
73 {
74 if(is_object($APPLICATION) && $APPLICATION->getException())
75 {
76 $e = $APPLICATION->getException();
77 $result->addError(new Entity\EntityError($e->getString()));
78 $APPLICATION->resetException();
79 }
80 else
81 {
82 $result->addError(new Entity\EntityError("Unknown error while checking userfields"));
83 }
84 }
85
86 // return if any error
87 if (!$result->isSuccess(true))
88 {
89 return $result;
90 }
91
92 //event on adding
93 self::callOnAddEvent($object, $data, []);
94
95 // insert base row
97
98 $tableName = $entity->getDBTableName();
99 $identity = $entity->getAutoIncrement();
100
101 $id = $connection->add($tableName, [$identity => new Main\DB\SqlExpression('DEFAULT')], $identity);
102
103 // format data before save
104 $fields = $USER_FIELD_MANAGER->getUserFields('HLBLOCK_'.$hlblock['ID']);
105
106 foreach ($fields as $k => $field)
107 {
108 $fields[$k]['VALUE_ID'] = $id;
109 }
110
111 list($data, $multiValues) = static::convertValuesBeforeSave($data, $fields);
112
113 // data could be changed by uf manager
114 foreach ($data as $k => $v)
115 {
116 $object->set($k, $v);
117 }
118
119 // use save modifiers
120 foreach ($data as $fieldName => $value)
121 {
122 $field = static::getEntity()->getField($fieldName);
123 $data[$fieldName] = $field->modifyValueBeforeSave($value, $data);
124 }
125
126 if (!empty($data))
127 {
128 // save data
129 $helper = $connection->getSqlHelper();
130 $update = $helper->prepareUpdate($tableName, $data);
131
132 $sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$helper->quote($identity)." = ".((int) $id);
133 $connection->queryExecute($sql, $update[1]);
134 }
135
136 // save multi values
137 if (!empty($multiValues))
138 {
139 foreach ($multiValues as $userfieldName => $values)
140 {
141 $utmTableName = HighloadBlockTable::getMultipleValueTableName($hlblock, $fields[$userfieldName]);
142
143 foreach ($values as $value)
144 {
145 $connection->add($utmTableName, array('ID' => $id, 'VALUE' => $value));
146 }
147 }
148 }
149
150 // build standard primary
151 $primary = null;
152
153 if (!empty($id))
154 {
155 $primary = array($entity->getAutoIncrement() => $id);
156 static::normalizePrimary($primary);
157 }
158 else
159 {
160 static::normalizePrimary($primary, $data);
161 }
162
163 // fill result
164 $result->setPrimary($primary);
165 $result->setData($data);
166 $result->setObject($object);
167
168 foreach ($primary as $primaryName => $primaryValue)
169 {
170 $object->sysSetActual($primaryName, $primaryValue);
171 }
172
173 $entity->cleanCache();
174
175 static::callOnAfterAddEvent($object, $data, $id);
176 }
177 catch (\Exception $e)
178 {
179 // check result to avoid warning
180 $result->isSuccess();
181
182 throw $e;
183 }
184
185 return $result;
186 }
187
197 public static function update($primary, array $data)
198 {
200
201 // check primary
202 static::normalizePrimary(
203 $primary, isset($data["fields"]) && is_array($data["fields"]) ? $data["fields"] : $data
204 );
205 static::validatePrimary($primary);
206
208 $object = static::convertArrayToObject($data, false, $primary);
209
210 //$oldData = static::getByPrimary($primary)->fetch();
211 $object->fill(FieldTypeMask::SCALAR);
212 $oldData = $object->collectValues(Values::ACTUAL, FieldTypeMask::SCALAR);
213
214 $hlblock = static::getHighloadBlock();
215 $entity = static::getEntity();
216 $result = new UpdateResult();
217
218 try
219 {
220 static::callOnBeforeUpdateEvent($object, $data, $result);
221
222 // actualize old-style fields array from object
223 $data = $object->collectValues(Values::CURRENT, FieldTypeMask::SCALAR);
224
225 // check data by uf manager CheckFieldsWithOldData
226 if (!$USER_FIELD_MANAGER->checkFieldsWithOldData('HLBLOCK_'.$hlblock['ID'], $oldData, $data))
227 {
228 if(is_object($APPLICATION) && $APPLICATION->getException())
229 {
230 $e = $APPLICATION->getException();
231 $result->addError(new Entity\EntityError($e->getString()));
232 $APPLICATION->resetException();
233 }
234 else
235 {
236 $result->addError(new Entity\EntityError("Unknown error while checking userfields"));
237 }
238 }
239
240 // return if any error
241 if (!$result->isSuccess(true))
242 {
243 return $result;
244 }
245
246 static::callOnUpdateEvent($object, $data, []);
247
248 // format data before save
249 $fields = $USER_FIELD_MANAGER->getUserFieldsWithReadyData('HLBLOCK_'.$hlblock['ID'], $oldData, LANGUAGE_ID, false, 'ID');
250 list($data, $multiValues) = static::convertValuesBeforeSave($data, $fields);
251
252 // data could be changed by uf manager
253 foreach ($data as $k => $v)
254 {
255 $object->set($k, $v);
256 }
257
258 // use save modifiers
259 foreach ($data as $fieldName => $value)
260 {
261 $field = static::getEntity()->getField($fieldName);
262 $data[$fieldName] = $field->modifyValueBeforeSave($value, $data);
263 }
264
265 $connection = Main\Application::getConnection();
266
267 if (!empty($data))
268 {
269 // save data
270 $helper = $connection->getSqlHelper();
271 $tableName = $entity->getDBTableName();
272
273 $update = $helper->prepareUpdate($tableName, $data);
274
275 $id = array();
276 foreach ($primary as $k => $v)
277 {
278 $id[] = $helper->prepareAssignment($tableName, $k, $v);
279 }
280 $where = implode(' AND ', $id);
281
282 $sql = "UPDATE ".$helper->quote($tableName)." SET ".$update[0]." WHERE ".$where;
283 $connection->queryExecute($sql, $update[1]);
284 }
285
286 $result->setAffectedRowsCount($connection);
287 $result->setData($data);
288 $result->setPrimary($primary);
289 $result->setObject($object);
290
291 // save multi values
292 if (!empty($multiValues))
293 {
294 foreach ($multiValues as $userfieldName => $values)
295 {
296 $utmTableName = HighloadBlockTable::getMultipleValueTableName($hlblock, $fields[$userfieldName]);
297
298 // first, delete old values
299 $connection->query(sprintf(
300 'DELETE FROM %s WHERE %s = %d',
301 $helper->quote($utmTableName), $helper->quote('ID'), $primary['ID']
302 ));
303
304 // insert new values
305 foreach ($values as $value)
306 {
307 $connection->add($utmTableName, array('ID' => $primary['ID'], 'VALUE' => $value));
308 }
309 }
310 }
311
312 $entity->cleanCache();
313
314 // event after update
315 static::callOnAfterUpdateEvent($object, $data);
316 }
317 catch (\Exception $e)
318 {
319 // check result to avoid warning
320 $result->isSuccess();
321
322 throw $e;
323 }
324
325 return $result;
326 }
327
336 public static function delete($primary)
337 {
338 global $USER_FIELD_MANAGER;
339
340 // check primary
341 static::normalizePrimary($primary);
342 static::validatePrimary($primary);
343
344 $entity = static::getEntity();
345 $result = new Entity\DeleteResult();
346 $hlblock = static::getHighloadBlock();
347
348 // get old data
349 $oldData = static::getByPrimary($primary)->fetch();
350
351 try
352 {
353 //event before delete
354 static::callOnBeforeDeleteEvent($primary, $entity, $result, $oldData);
355
356 // return if any error
357 if (!$result->isSuccess(true))
358 {
359 return $result;
360 }
361
362 //event on delete
363 static::callOnDeleteEvent($primary, $entity, $oldData);
364
365 // remove row
367 $helper = $connection->getSqlHelper();
368
369 $tableName = $entity->getDBTableName();
370
371 $id = array();
372 foreach ($primary as $k => $v)
373 {
374 $id[] = $k." = '".$helper->forSql($v)."'";
375 }
376 $where = implode(' AND ', $id);
377
378 $sql = "DELETE FROM ".$helper->quote($tableName)." WHERE ".$where;
379 $connection->queryExecute($sql);
380
381 $fields = $USER_FIELD_MANAGER->getUserFields('HLBLOCK_'.$hlblock['ID']);
382
383 foreach ($oldData as $k => $v)
384 {
385 if ($k === 'ID')
386 {
387 continue;
388 }
389 $userfield = $fields[$k];
390
391 // remove multi values
392 if ($userfield['MULTIPLE'] == 'Y')
393 {
394 $utmTableName = HighloadBlockTable::getMultipleValueTableName($hlblock, $userfield);
395
396 $connection->query(sprintf(
397 'DELETE FROM %s WHERE %s = %d',
398 $helper->quote($utmTableName), $helper->quote('ID'), $primary['ID']
399 ));
400 }
401
402 // remove files
403 if ($userfield["USER_TYPE"]["BASE_TYPE"]=="file")
404 {
405 if(is_array($oldData[$k]))
406 {
407 foreach($oldData[$k] as $value)
408 {
409 \CFile::delete($value);
410 }
411 }
412 else
413 {
414 \CFile::delete($oldData[$k]);
415 }
416 }
417 }
418
419 $entity->cleanCache();
420
421 //event after delete
422 static::callOnAfterDeleteEvent($primary, $entity, $oldData);
423 }
424 catch (\Exception $e)
425 {
426 // check result to avoid warning
427 $result->isSuccess();
428
429 throw $e;
430 }
431
432 return $result;
433 }
434
435 protected static function callOnBeforeUpdateEvent($object, $fields, $result)
436 {
437 //event before update
438 $event = new Entity\Event($object->entity, self::EVENT_ON_BEFORE_UPDATE, [
439 "id" => $object->primary,
440 "fields" => $fields,
441 'object' => $object
442 ]);
443
444 $event->send();
445 $event->getErrors($result);
446 $event->mergeObjectFields($object);
447
448 $oldData = $object->collectValues(Values::ACTUAL, FieldTypeMask::SCALAR);
449
450 //event before update (modern with namespace)
451 $event = new Entity\Event($object->entity, self::EVENT_ON_BEFORE_UPDATE, [
452 "id" => $object->primary,
453 "primary" => $object->primary,
454 "fields" => $fields,
455 'object' => $object,
456 "oldFields" => $oldData
457 ], true);
458
459 $event->send();
460 $event->getErrors($result);
461 $event->mergeObjectFields($object);
462 }
463
464 protected static function callOnUpdateEvent($object, $fields, $ufdata)
465 {
466 //event on update
467 $event = new Event($object->entity, self::EVENT_ON_UPDATE, [
468 "id" => $object->primary,
469 "fields" => $fields,
470 'object' => clone $object
471 ]);
472 $event->send();
473
474 $oldData = $object->collectValues(Values::ACTUAL, FieldTypeMask::SCALAR);
475
476 //event on update (modern with namespace)
477 $event = new Event($object->entity, self::EVENT_ON_UPDATE, [
478 "id" => $object->primary,
479 "primary" => $object->primary,
480 "fields" => $fields,
481 'object' => clone $object,
482 "oldFields" => $oldData
483 ], true);
484 $event->send();
485 }
486
487 protected static function callOnAfterUpdateEvent($object, $fields)
488 {
489 //event after update
490 $event = new Entity\Event($object->entity, self::EVENT_ON_AFTER_UPDATE, [
491 "id"=> $object->primary,
492 "fields" => $fields,
493 'object' => clone $object
494 ]);
495 $event->send();
496
497 $oldData = $object->collectValues(Values::ACTUAL, FieldTypeMask::SCALAR);
498
499 //event after update (modern with namespace)
500 $event = new Entity\Event($object->entity, self::EVENT_ON_AFTER_UPDATE, [
501 "id" => $object->primary,
502 "primary" => $object->primary,
503 "fields" => $fields,
504 'object' => clone $object,
505 "oldFields" => $oldData
506 ], true);
507 $event->send();
508 }
509
510 protected static function callOnBeforeDeleteEvent($primary, $entity, $result, $oldData = null)
511 {
512 //event before delete
513 $event = new Entity\Event($entity, self::EVENT_ON_BEFORE_DELETE, array("id"=>$primary));
514 $event->send();
515 $event->getErrors($result);
516
517 //event before delete (modern with namespace)
518 $event = new Entity\Event($entity, self::EVENT_ON_BEFORE_DELETE, array(
519 "id"=>$primary, "primary"=>$primary, "oldFields" => $oldData
520 ), true);
521 $event->send();
522 $event->getErrors($result);
523 }
524
525 protected static function callOnDeleteEvent($primary, $entity, $oldData = null)
526 {
527 //event on delete
528 $event = new Entity\Event($entity, self::EVENT_ON_DELETE, array("id"=>$primary));
529 $event->send();
530
531 //event on delete (modern with namespace)
532 $event = new Entity\Event($entity, self::EVENT_ON_DELETE, array(
533 "id"=>$primary, "primary"=>$primary, "oldFields" => $oldData
534 ), true);
535 $event->send();
536 }
537
538 protected static function callOnAfterDeleteEvent($primary, $entity, $oldData = null)
539 {
540 //event after delete
541 $event = new Entity\Event($entity, self::EVENT_ON_AFTER_DELETE, array("id"=>$primary));
542 $event->send();
543
544 //event after delete (modern with namespace)
545 $event = new Entity\Event($entity, self::EVENT_ON_AFTER_DELETE, array(
546 "id"=>$primary, "primary" => $primary, "oldFields" => $oldData
547 ), true);
548 $event->send();
549 }
550
551 protected static function convertValuesBeforeSave($data, $userfields)
552 {
553 $multiValues = [];
554
555 foreach ($data as $k => $v)
556 {
557 if ($k === 'ID')
558 {
559 continue;
560 }
561
562 $userfield = $userfields[$k];
563
564 if ($userfield['MULTIPLE'] === 'N')
565 {
566 $inputValue = [$v];
567 }
568 else
569 {
570 $inputValue = $v;
571 }
572 if (!is_array($inputValue))
573 {
574 $inputValue = [$inputValue];
575 }
576
577 $tmpValue = [];
578
579 foreach ($inputValue as $singleValue)
580 {
581 $tmpValue[] = static::convertSingleValueBeforeSave($singleValue, $userfield);
582 }
583
584 // write value back
585 if ($userfield['MULTIPLE'] === 'N')
586 {
587 $data[$k] = $tmpValue[0];
588 }
589 else
590 {
591 // remove empty (false) values
592 $tmpValue = array_filter($tmpValue, [__CLASS__, 'isNotNull']);
593
594 $data[$k] = $tmpValue;
595 $multiValues[$k] = $tmpValue;
596 }
597 }
598
599 return [$data, $multiValues];
600 }
601
608 protected static function convertSingleValueBeforeSave($value, $userfield)
609 {
610 if (!isset($userfield['USER_TYPE']) || !is_array($userfield['USER_TYPE']))
611 {
612 $userfield['USER_TYPE'] = [];
613 }
614
615 if (
616 isset($userfield['USER_TYPE']['CLASS_NAME']) &&
617 is_callable(array($userfield['USER_TYPE']['CLASS_NAME'], 'onbeforesave'))
618 )
619 {
620 $value = call_user_func_array(
621 [$userfield['USER_TYPE']['CLASS_NAME'], 'onbeforesave'],
622 [$userfield, $value]
623 );
624 }
625
626 if (static::isNotNull($value))
627 {
628 return $value;
629 }
630 elseif (
631 isset($userfield['USER_TYPE']['BASE_TYPE']) &&
632 (
633 $userfield['USER_TYPE']['BASE_TYPE'] == 'int' ||
634 $userfield['USER_TYPE']['BASE_TYPE'] == 'double'
635 )
636 )
637 {
638 return null;
639 }
640 else
641 {
642 return false;
643 }
644 }
645
646 protected static function isNotNull($value)
647 {
648 return !($value === null || $value === false || $value === '');
649 }
650}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
static callOnBeforeUpdateEvent($object, $fields, $result)
Определения datamanager.php:435
static callOnAfterUpdateEvent($object, $fields)
Определения datamanager.php:487
static callOnAfterDeleteEvent($primary, $entity, $oldData=null)
Определения datamanager.php:538
static convertValuesBeforeSave($data, $userfields)
Определения datamanager.php:551
static callOnBeforeDeleteEvent($primary, $entity, $result, $oldData=null)
Определения datamanager.php:510
static add(array $data)
Определения datamanager.php:53
static isNotNull($value)
Определения datamanager.php:646
static callOnUpdateEvent($object, $fields, $ufdata)
Определения datamanager.php:464
static getHighloadBlock()
Определения datamanager.php:25
static checkFields(Entity\Result $result, $primary, array $data)
Определения datamanager.php:30
static convertSingleValueBeforeSave($value, $userfield)
Определения datamanager.php:608
static callOnDeleteEvent($primary, $entity, $oldData=null)
Определения datamanager.php:525
static getMultipleValueTableName($hlblock, $userfield)
Определения highloadblocktable.php:757
static getConnection($name="")
Определения application.php:638
Определения event.php:5
static callOnAddEvent($object, $fields, $ufdata)
Определения datamanager.php:1756
static update($primary, array $data)
Определения datamanager.php:1256
$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
$entity
Определения arrayresult.php:2
Определения ufield.php:9
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$k
Определения template_pdf.php:567
$fields
Определения yandex_run.php:501