1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
base.php
См. документацию.
1<?php
2
4
13
14abstract class Base
15{
16 const TYPE_INT = 'integer';
17 const TYPE_FLOAT = 'double';
18 const TYPE_STRING = 'string';
19 const TYPE_CHAR = 'char';
20 const TYPE_LIST = 'list';
21 const TYPE_TEXT = 'text';
22 const TYPE_FILE = 'file';
23 const TYPE_DATE = 'date';
24 const TYPE_DATETIME = 'datetime';
25 const TYPE_DATATYPE = 'datatype';
26
27 abstract public function getFields();
28
29 public function prepareFieldInfos($fields)
30 {
31 $result = [];
32 if (is_array($fields))
33 {
34 foreach($fields as $name => $info)
35 {
36 $attributs = isset($info['ATTRIBUTES']) ? $info['ATTRIBUTES'] : [];
37
38 if(in_array(Attributes::Hidden, $attributs, true))
39 {
40 continue;
41 }
42
44 'TYPE' => $info['TYPE'],
45 'IS_REQUIRED' => in_array(Attributes::Required, $attributs, true),
46 'IS_READ_ONLY' => in_array(Attributes::ReadOnly, $attributs, true),
47 'IS_IMMUTABLE' => in_array(Attributes::Immutable, $attributs, true)
48 );
49 }
50 }
51
52 return $result;
53 }
54
55 public function getSettableFields()
56 {
57 return array_keys(
58 $this->getListFieldInfo($this->getFields(), ['filter'=>['ignoredAttributes'=>[Attributes::Hidden, Attributes::ReadOnly, Attributes::Immutable]]])
59 );
60 }
61
62 public function getListFieldInfo(array $fieldsInfo, $params=[])
63 {
64 $list = [];
65
66 $filter = is_set($params, 'filter')?$params['filter']:[];
67 $ignoredAttributes = is_set($filter, 'ignoredAttributes')?$filter['ignoredAttributes']:[];
68 $ignoredFields = is_set($filter, 'ignoredFields')?$filter['ignoredFields']:[];
69 $skipFields = is_set($filter, 'skipFields')?$filter['skipFields']:[];
70
71 foreach ($fieldsInfo as $name=>$info)
72 {
73 if(in_array($name, $ignoredFields))
74 {
75 continue;
76 }
77 elseif(in_array($name, $skipFields) == false)
78 {
79 if(isset($info['ATTRIBUTES']))
80 {
81 $skipAttr = array_intersect($ignoredAttributes, $info['ATTRIBUTES']);
82 if(!empty($skipAttr))
83 {
84 continue;
85 }
86 }
87 }
88
89 $list[$name] = $info;
90 }
91
92 return $list;
93 }
94
95 protected function isNewItem($fields)
96 {
97 return (isset($fields['ID']) === false);
98 }
99
100 //region convert keys to snake case
102 {
103 return $this->convertKeysToSnakeCase($fields);
104 }
105
107 {
108 $converter = new Converter(Converter::VALUES | Converter::TO_SNAKE | Converter::TO_UPPER| Converter::TO_SNAKE_DIGIT);
109 $items = $converter->process($fields);
110 return $this->converterValuesProcessOnAfter($items);
111 }
112
114 {
115 return $this->convertKeysToSnakeCase($fields);
116 }
117
119 {
120 $result = [];
121
122 $converter = new Converter(Converter::VALUES | Converter::TO_UPPER);
123 $converterForKey = new Converter(Converter::KEYS | Converter::TO_SNAKE | Converter::TO_UPPER | Converter::TO_SNAKE_DIGIT);
124
125 foreach ($converter->process($fields) as $key=>$value)
126 {
127 $result[$converterForKey->process($key)] = $value;
128 }
129 return $this->converterKeysProcessOnAfter($result);
130 }
131
132 public function convertKeysToSnakeCaseArguments($name, $arguments)
133 {
134 return $arguments;
135 }
136
137 protected function convertKeysToSnakeCase($data): array
138 {
139 $converter = new Converter(Converter::KEYS | Converter::RECURSIVE | Converter::TO_SNAKE | Converter::TO_UPPER | Converter::TO_SNAKE_DIGIT);
140 $items = $converter->process($data);
141 return $this->converterKeysProcessOnAfter($items);
142 }
143
144 private function converterKeysProcessOnAfter($items): array
145 {
146 $result = [];
147 foreach ($items as $key=>$item)
148 {
149 $result[$this->resolveFieldName($key)] = $item;
150 }
151 return $result;
152 }
153
154 private function converterValuesProcessOnAfter($items): array
155 {
156 $result = [];
157 foreach ($items as $key=>$item)
158 {
159 $result[$key] = $this->resolveFieldName($item);
160 }
161 return $result;
162 }
163
164 private function resolveFieldName($name)
165 {
166 if ($name === 'ID_1_C')
167 {
168 return 'ID_1C';
169 }
170
171 if ($name === 'VERSION_1_C')
172 {
173 return 'VERSION_1C';
174 }
175
176 if ($name === 'UPDATED_1_C')
177 {
178 return 'UPDATED_1C';
179 }
180
181 return $name;
182 }
183 //endregion
184
185 //region internalize fields
192 public function internalizeArguments($name, $arguments)
193 {
194 throw new NotImplementedException('Internalize arguments. The method '.$name.' is not implemented.');
195 }
196
197 public function internalizeFieldsList($arguments)
198 {
199 $fieldsInfo = $this->getListFieldInfo($this->getFields(), ['filter'=>['ignoredAttributes'=>[Attributes::Hidden]]]);
200
201 $filter = isset($arguments['filter']) ? $this->internalizeFilterFields($arguments['filter'], $fieldsInfo):[];
202 $select = isset($arguments['select']) ? $this->internalizeSelectFields($arguments['select'], $fieldsInfo):[];
203 $order = isset($arguments['order']) ? $this->internalizeOrderFields($arguments['order'], $fieldsInfo):[];
204
205 return [
206 'filter'=>$filter,
207 'select'=>$select,
208 'order'=>$order,
209 ];
210 }
211
213 {
214 return $this->internalizeFields(
215 $fields,
216 $this->getListFieldInfo(
217 $this->getFields(),
218 ['filter'=>['ignoredAttributes'=>[Attributes::Hidden, Attributes::ReadOnly]]]
219 )
220 );
221 }
222
224 {
225 return $this->internalizeFields(
226 $fields,
227 $this->getListFieldInfo(
228 $this->getFields(),
229 ['filter'=>['ignoredAttributes'=>[Attributes::Hidden, Attributes::ReadOnly, Attributes::Immutable]]]
230 )
231 );
232 }
233
241 {
242 throw new NotImplementedException('The method internalizeFieldsModify is not implemented.');
243 }
244
246 {
247 return $this->internalizeFieldsAdd($fields);
248 }
249
251 {
252 return $this->internalizeFieldsUpdate($fields);
253 }
254
256 {
257 return $this->internalizeFieldsModify($fields);
258 }
259
260 protected function internalizeFieldValue($value, $info)
261 {
262 $result = new Result();
263
264 $type = $info['TYPE'] ?? '';
265
266 if($type === self::TYPE_DATE || $type === self::TYPE_DATETIME)
267 {
268 if($value === '')
269 {
270 $date = '';
271 }
272 else
273 {
274 $time = strtotime($value);
275 $date = ($time) ? \Bitrix\Main\Type\DateTime::createFromTimestamp($time):'';
276 }
277
278 if($date instanceof Date)
279 {
280 $value = $date;
281 }
282 else
283 {
284 $result->addError(new Error('internalize data field error', 0));
285 }
286 }
287 elseif($type === self::TYPE_FILE)
288 {
289 //InternalizeFileField()
290 }
291 $result->addData([$value]);
292
293 return $result;
294 }
295
296 protected function internalizeFields($fields, array $fieldsInfo)
297 {
298 $result = [];
299
300 foreach ($fields as $name=>$value)
301 {
302 $info = isset($fieldsInfo[$name]) ? $fieldsInfo[$name]:null;
303 if(!$info)
304 {
305 continue;
306 }
307
308 $r = $this->internalizeFieldValue($value, $info);
309 if($r->isSuccess())
310 {
311 $value = current($r->getData());
312 }
313 else
314 {
315 continue;
316 }
317
318 $result[$name] = $value;
319 }
320 return $result;
321 }
322
323 protected function internalizeFilterFields($fields, array $fieldsInfo)
324 {
325 $result = [];
326
327 $fieldsInfo = empty($fieldsInfo)? $this->getFields():$fieldsInfo;
328
329 if(is_array($fields) && count($fields)>0)
330 {
331 $listFieldsInfo = $this->getListFieldInfo($fieldsInfo, ['filter'=>['ignoredAttributes'=>[Attributes::Hidden]]]);
332
333 foreach ($fields as $rawName=>$value)
334 {
335 $field = \CSqlUtil::GetFilterOperation($rawName);
336
337 $info = isset($listFieldsInfo[$field['FIELD']]) ? $listFieldsInfo[$field['FIELD']]:null;
338 if(!$info)
339 {
340 continue;
341 }
342
343 $r = $this->internalizeFieldValue($value, $info);
344 if($r->isSuccess())
345 {
346 $value = current($r->getData());
347 }
348 else
349 {
350 continue;
351 }
352
353 $operation = mb_substr($rawName, 0, mb_strlen($rawName) - mb_strlen($field['FIELD']));
354 if(isset($info['FORBIDDEN_FILTERS'])
355 && is_array($info['FORBIDDEN_FILTERS'])
356 && in_array($operation, $info['FORBIDDEN_FILTERS'], true))
357 {
358 continue;
359 }
360
361 $result[$rawName]=$value;
362 }
363 }
364 return $result;
365 }
366
367 protected function internalizeSelectFields($fields, array $fieldsInfo)
368 {
369 $result = [];
370
371 $fieldsInfo = empty($fieldsInfo)? $this->getFields():$fieldsInfo;
372
373 $listFieldsInfo = $this->getListFieldInfo($fieldsInfo, ['filter'=>['ignoredAttributes'=>[Attributes::Hidden]]]);
374
375 if(empty($fields) || in_array('*', $fields, true))
376 {
377 $result = array_keys($listFieldsInfo);
378 }
379 else
380 {
381 foreach ($fields as $name)
382 {
383 $info = isset($listFieldsInfo[$name]) ? $listFieldsInfo[$name]:null;
384 if(!$info)
385 {
386 continue;
387 }
388
389 $result[] = $name;
390 }
391 }
392
393 return $result;
394 }
395
396 protected function internalizeOrderFields($fields, array $fieldsInfo)
397 {
398 $result = [];
399
400 $fieldsInfo = empty($fieldsInfo)? $this->getFields():$fieldsInfo;
401
402 if(is_array($fields)
403 && count($fields)>0)
404 {
405 $listFieldsInfo = $this->getListFieldInfo($fieldsInfo, ['filter'=>['ignoredAttributes'=>[Attributes::Hidden]]]);
406
407 foreach ($fields as $field=>$order)
408 {
409 $info = isset($listFieldsInfo[$field]) ? $listFieldsInfo[$field]:null;
410 if(!$info)
411 {
412 continue;
413 }
414
415 $result[$field]=$order;
416 }
417 }
418
419 return $result;
420 }
421
422 public function rewriteFieldsList($arguments)
423 {
424 $filter = isset($arguments['filter']) ? $this->rewriteFilterFields($arguments['filter']):[];
425 $select = isset($arguments['select']) ? $this->rewriteSelectFields($arguments['select']):[];
426 $order = isset($arguments['order']) ? $this->rewriteOrderFields($arguments['order']):[];
427
428 return [
429 'filter'=>$filter,
430 'select'=>$select,
431 'order'=>$order,
432 ];
433 }
434
435 protected function rewriteSelectFields($fields)
436 {
437 $result = [];
438 $rewriteFields = $this->getRewritedFields();
439
440 foreach ($fields as $name)
441 {
442 $fieldsIsAlias = isset($rewriteFields[$name]);
443
444 if($fieldsIsAlias)
445 {
446 if(isset($rewriteFields[$name]['REFERENCE_FIELD']))
447 {
448 $result[$name] = $rewriteFields[$name]['REFERENCE_FIELD'];
449 }
450 }
451 else
452 {
453 $result[] = $name;
454 }
455 }
456
457 return $result;
458 }
459
460 protected function rewriteFilterFields($fields)
461 {
462 $result = [];
463 $rewriteFields = $this->getRewritedFields();
464
465
466 foreach ($fields as $rawName=>$value)
467 {
468 $field = \CSqlUtil::GetFilterOperation($rawName);
469
470 $fieldsIsAlias = isset($rewriteFields[$field['FIELD']]);
471
472 if($fieldsIsAlias)
473 {
474 if(isset($rewriteFields[$field['FIELD']]['REFERENCE_FIELD']))
475 {
476 $originalName = $rewriteFields[$field['FIELD']]['REFERENCE_FIELD'];
477 $operation = mb_substr($rawName, 0, mb_strlen($rawName) - mb_strlen($field['FIELD']));
478 $result[$operation.$originalName] = $value;
479 }
480 }
481 else
482 {
483 $result[$rawName] = $value;
484 }
485 }
486
487 return $result;
488 }
489
490 protected function rewriteOrderFields($fields)
491 {
492 $result = [];
493 $rewriteFields = $this->getRewritedFields();
494
495 foreach ($fields as $name=>$value)
496 {
497 $fieldsIsAlias = isset($rewriteFields[$name]);
498
499 if($fieldsIsAlias)
500 {
501 if(isset($rewriteFields[$name]['REFERENCE_FIELD']))
502 {
503 $result[$rewriteFields[$name]['REFERENCE_FIELD']] = $value;
504 }
505 }
506 else
507 {
508 $result[$name] = $value;
509 }
510 }
511
512 return $result;
513 }
514
519 protected function getRewritedFields()
520 {
521 return [];
522 }
523
524 protected function internalizeListFields($list, $fieldsInfo=[])
525 {
526 $result = [];
527
528 $fieldsInfo = empty($fieldsInfo) ? $this->getFields():$fieldsInfo;
529
530 $listFieldsInfo = $this->getListFieldInfo($fieldsInfo, ['filter'=>['ignoredAttributes'=>[Attributes::Hidden]]]);
531
532 if(is_array($list) && count($list)>0)
533 {
534 foreach ($list as $k=>$item)
535 {
536 $result[$k] = $this->internalizeFields($item, $listFieldsInfo);
537 }
538 }
539 return $result;
540 }
541
542 //endregion
543
544 // region externalize fields
545 public function externalizeFields($fields)
546 {
547 if (!is_array($fields))
548 {
549 return [];
550 }
551
552 $result = [];
553
554 $fieldsInfo = $this->getListFieldInfo(
555 $this->getFields(),
556 [
557 'filter' => [
558 'ignoredAttributes' => [
560 ],
561 ],
562 ]
563 );
564
565 foreach ($fields as $name => $value)
566 {
567 $info = $fieldsInfo[$name] ?? null;
568 if (!$info)
569 {
570 continue;
571 }
572
573 $type = $info['TYPE'] ?? '';
574 $hasValue = isset($value) && $value !== '';
575
576 switch ($type)
577 {
578 case DataType::TYPE_STRING:
579 case DataType::TYPE_CHAR:
580 case DataType::TYPE_TEXT:
581 $value = (string)$value;
582 break;
583 case DataType::TYPE_FLOAT:
584 $value = $hasValue ? (float)$value : null;
585 break;
586 case DataType::TYPE_INT:
587 $value = $hasValue ? (int)$value : null;
588 break;
589 case DataType::TYPE_DATE:
590 if ($hasValue)
591 {
592 $time = strtotime($value);
593 $value = $time ? Date::createFromTimestamp($time) : null;
594 }
595 else
596 {
597 $value = null;
598 }
599 break;
600 case DataType::TYPE_DATETIME:
601 if ($hasValue)
602 {
603 $time = strtotime($value);
604 $value = $time ? DateTime::createFromTimestamp($time) : null;
605 }
606 else
607 {
608 $value = null;
609 }
610 break;
611 case DataType::TYPE_DATATYPE:
612 case DataType::TYPE_LIST:
613 break;
614 default:
615 $value = null;
616 break;
617 }
618
619 $result[$name] = $value;
620 }
621
622 return $result;
623 }
624
625 public function externalizeListFields($list)
626 {
627 $result = [];
628 if(is_array($list) && count($list)>0)
629 {
630 foreach($list as $k=>$fields)
632 }
633 return $result;
634 }
635
642 {
643 throw new NotImplementedException('The method externalizeFieldsModify is not implemented.');
644 }
645
647 {
648 return $this->externalizeFieldsModify($fields);
649 }
650
658 {
659 throw new NotImplementedException('Externalize result. The method '.$name.' is not implemented.');
660 }
661 // endregion
662
663 //region convert keys to camel case
665 {
666 return Converter::toJson()
667 ->process($fields);
668 }
669 // endregion
670
671 //region check fields
672 public function checkFieldsAdd($fields)
673 {
674 $r = new Result();
675
676 $required = $this->checkRequiredFieldsAdd($fields);
677 if(!$required->isSuccess())
678 $r->addError(new Error('Required fields: '.implode(', ', $required->getErrorMessages())));
679
680 return $r;
681 }
682
683 public function checkFieldsUpdate($fields)
684 {
685 $r = new Result();
686
687 $required = $this->checkRequiredFieldsUpdate($fields);
688 if(!$required->isSuccess())
689 $r->addError(new Error('Required fields: '.implode(', ', $required->getErrorMessages())));
690
691 return $r;
692 }
693
694 public function checkFieldsModify($fields)
695 {
696 $r = new Result();
697
698 $required = $this->checkRequiredFieldsModify($fields);
699 if(!$required->isSuccess())
700 $r->addError(new Error('Required fields: '.implode(' ', $required->getErrorMessages())));
701
702 return $r;
703 }
704
705 public function checkArguments($name, $arguments)
706 {
707 return new Result();
708 }
709
710 protected function checkRequiredFieldsAdd($fields)
711 {
712 return $this->checkRequiredFields($fields, $this->getListFieldInfo(
713 $this->getFields(),
714 ['filter'=>['ignoredAttributes'=>[Attributes::Hidden, Attributes::ReadOnly]]]
715 ));
716 }
717
719 {
720 return $this->checkRequiredFields($fields, $this->getListFieldInfo(
721 $this->getFields(),
722 ['filter'=>['ignoredAttributes'=>[Attributes::Hidden, Attributes::ReadOnly, Attributes::Immutable]]]
723 ));
724 }
725
732 {
733 throw new NotImplementedException('The method checkFieldsModify is not implemented.');
734 }
735
736 protected function checkRequiredFields($fields, array $fieldsInfo, $params=[])
737 {
738 $r = new Result();
739
740 $addRequiredFields = is_set($params, '+required') ? $params['+required']:[];
741 $delRequiredFields = is_set($params, '-required') ? $params['-required']:[];
742
743 foreach ($this->prepareFieldInfos($fieldsInfo) as $name=>$info)
744 {
745 if(in_array($name, $delRequiredFields))
746 {
747 continue;
748 }
749 elseif($info['IS_REQUIRED'] == 'Y' || in_array($name, $addRequiredFields))
750 {
751 if(!is_set($fields, $name))
752 $r->addError(new Error($this->convertKeysToCamelCase($name)));
753 }
754 }
755
756 return $r;
757 }
758 //endregion
759}
$type
Определения options.php:106
Определения error.php:15
Определения date.php:9
const Hidden
Определения attributes.php:8
const Required
Определения attributes.php:11
const ReadOnly
Определения attributes.php:9
const Immutable
Определения attributes.php:10
const TYPE_CHAR
Определения base.php:19
checkRequiredFieldsAdd($fields)
Определения base.php:710
externalizeListFields($list)
Определения base.php:625
externalizeFields($fields)
Определения base.php:545
const TYPE_DATE
Определения base.php:23
rewriteFieldsList($arguments)
Определения base.php:422
const TYPE_DATETIME
Определения base.php:24
internalizeFieldValue($value, $info)
Определения base.php:260
checkFieldsUpdate($fields)
Определения base.php:683
internalizeFieldsTryUpdate($fields)
Определения base.php:250
internalizeFieldsTryModify($fields)
Определения base.php:255
internalizeSelectFields($fields, array $fieldsInfo)
Определения base.php:367
internalizeArguments($name, $arguments)
Определения base.php:192
convertKeysToCamelCase($fields)
Определения base.php:664
getListFieldInfo(array $fieldsInfo, $params=[])
Определения base.php:62
const TYPE_FILE
Определения base.php:22
internalizeFilterFields($fields, array $fieldsInfo)
Определения base.php:323
const TYPE_STRING
Определения base.php:18
rewriteSelectFields($fields)
Определения base.php:435
checkFieldsModify($fields)
Определения base.php:694
externalizeFieldsModify($fields)
Определения base.php:641
externalizeFieldsTryModify($fields)
Определения base.php:646
convertKeysToSnakeCaseOrder($fields)
Определения base.php:118
convertKeysToSnakeCaseArguments($name, $arguments)
Определения base.php:132
prepareFieldInfos($fields)
Определения base.php:29
const TYPE_INT
Определения base.php:16
checkArguments($name, $arguments)
Определения base.php:705
convertKeysToSnakeCase($data)
Определения base.php:137
rewriteOrderFields($fields)
Определения base.php:490
internalizeFieldsTryAdd($fields)
Определения base.php:245
getRewritedFields()
Определения base.php:519
internalizeOrderFields($fields, array $fieldsInfo)
Определения base.php:396
internalizeFieldsUpdate($fields)
Определения base.php:223
convertKeysToSnakeCaseSelect($fields)
Определения base.php:106
checkRequiredFieldsUpdate($fields)
Определения base.php:718
const TYPE_LIST
Определения base.php:20
const TYPE_FLOAT
Определения base.php:17
internalizeFieldsList($arguments)
Определения base.php:197
externalizeResult($name, $fields)
Определения base.php:657
checkRequiredFieldsModify($fields)
Определения base.php:731
internalizeFields($fields, array $fieldsInfo)
Определения base.php:296
checkFieldsAdd($fields)
Определения base.php:672
internalizeListFields($list, $fieldsInfo=[])
Определения base.php:524
convertKeysToSnakeCaseFields($fields)
Определения base.php:101
getSettableFields()
Определения base.php:55
internalizeFieldsAdd($fields)
Определения base.php:212
const TYPE_TEXT
Определения base.php:21
convertKeysToSnakeCaseFilter($fields)
Определения base.php:113
const TYPE_DATATYPE
Определения base.php:25
rewriteFilterFields($fields)
Определения base.php:460
checkRequiredFields($fields, array $fieldsInfo, $params=[])
Определения base.php:736
internalizeFieldsModify($fields)
Определения base.php:240
isNewItem($fields)
Определения base.php:95
static GetFilterOperation($key)
Определения sql_util.php:45
$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
$result
Определения get_property_values.php:14
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
Определения backup.php:924
is_set($a, $k=false)
Определения tools.php:2133
$name
Определения menu_edit.php:35
Определения collection.php:2
Определения base.php:3
$order
Определения payment.php:8
$time
Определения payment.php:61
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
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$items
Определения template.php:224
$k
Определения template_pdf.php:567
$fields
Определения yandex_run.php:501