1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
component.php
См. документацию.
1<?php
3
6use \Bitrix\Main\Localization\Loc;
8
9Loc::loadMessages(__FILE__);
10
12{
17 protected static $predefineForDynamicProps = array();
18
23 public static function getHandlerJS()
24 {
25 return 'BX.Landing.Node.Component';
26 }
27
33 public static function setPredefineForDynamicProps(array $additionalVals)
34 {
35 foreach ($additionalVals as $code => $val)
36 {
37 self::$predefineForDynamicProps[$code] = $val;
38 }
39 }
40
48 protected static function saveComponent($content, $code, array $params)
49 {
50 $components = \PHPParser::parseScript($content);
51 foreach ($components as $component)
52 {
53 // get first component with code = $code
54 if ($component['DATA']['COMPONENT_NAME'] == $code)
55 {
56 $params = array_merge($component['DATA']['PARAMS'], $params);
57 $params = array_filter($params, function ($param) {
58 return $param !== null;
59 });
60 $componentCode = ($component['DATA']['VARIABLE'] ? $component['DATA']['VARIABLE'] . '=' : '') .
61 '$APPLICATION->IncludeComponent(' . PHP_EOL .
62 "\t" . '"' . $component['DATA']['COMPONENT_NAME'] . '", ' . PHP_EOL .
63 "\t" . '"' . $component['DATA']['TEMPLATE_NAME'] . '", ' . PHP_EOL .
64 "\t" . 'array(' . PHP_EOL .
65 "\t" . "\t" . \PHPParser::returnPHPStr2($params) . PHP_EOL .
66 "\t" . '),' . PHP_EOL .
67 "\t" . ($component['DATA']['PARENT_COMP'] ? $component['DATA']['PARENT_COMP'] : 'false') .
68 (!empty($component['DATA']['FUNCTION_PARAMS']) ? ',' . PHP_EOL .
69 "\t" . 'array(' . PHP_EOL . "\t" . "\t" . \PHPParser::returnPHPStr2($component['DATA']['FUNCTION_PARAMS']) . PHP_EOL .
70 "\t" . ')' : '') . PHP_EOL .
71 ');';
72 $componentCode = str_replace(array('<?', '?>'), array('< ?', '? >'), $componentCode);
73 $content = mb_substr($content, 0, $component['START']).$componentCode.mb_substr($content, $component['END']);
74 break;
75 }
76 }
77
78 return $content;
79 }
80
86 protected static function checkPhpCode($code)
87 {
88 if (is_array($code))
89 {
90 foreach ($code as $k => $v)
91 {
92 if (
93 self::checkPhpCode($k) ||
94 self::checkPhpCode($v)
95 )
96 {
97 return true;
98 }
99 }
100 }
101 else{
102 if (
103 mb_substr($code, 0, 2) == '={' &&
104 mb_substr($code, -1, 1) == '}' &&
105 mb_strlen($code) > 3
106 )
107 {
108 return true;
109 }
110 }
111
112 return false;
113 }
114
122 public static function saveNode(Block $block, $selector, array $data): void
123 {
124 if (empty($data))
125 {
126 return;
127 }
128
129 $manifest = $block->getManifest();
130 if (isset ($manifest['nodes'][$selector]['extra']))
131 {
132 $updateProps = [];
133 $allowedProps = $manifest['nodes'][$selector]['extra'];
134 $propsBefore = [];
135 if (History::isActive())
136 {
137 foreach ($allowedProps as $code => $prop)
138 {
139 $propsBefore[$code] = self::transformPropValue(
140 $prop['VALUE'],
141 $prop
142 );
143 }
144 }
145
146 foreach ($data as $code => $val)
147 {
148 if (isset($allowedProps[$code]))
149 {
150 $updateProps[$code] = self::transformPropValue(
151 $val,
152 $allowedProps[$code]
153 );
154 if (self::checkPhpCode(array($code => $updateProps[$code])))
155 {
156 unset($updateProps[$code]);
157 }
158 }
159 }
160 if (!empty($updateProps))
161 {
162 // !tmp bugfix about set section id to null
163 if (
164 array_key_exists('SECTION_ID', $updateProps) &&
165 !trim($updateProps['SECTION_ID'])
166 )
167 {
168 $updateProps['SECTION_ID'] = '={$sectionId}';
169 }
170 $doc = $block->getDom();
171 $newContent = self::saveComponent(
172 $doc->saveHTML(),
173 $selector,
174 $updateProps
175 );
176 // first clear dom
177 foreach ($doc->getChildNodesArray() as $node)
178 {
179 $node->getParentNode()->removeChild($node);
180 }
181 // and load new content
182 $doc->loadHTML($newContent);
183
184 if (History::isActive())
185 {
186 $propsAfter = array_merge($propsBefore, $updateProps);
187 $history = new History($block->getLandingId(), History::ENTITY_TYPE_LANDING);
188 $history->push('EDIT_COMPONENT', [
189 'block' => $block,
190 'selector' => $selector,
191 'position' => 0,
192 'valueBefore' => $propsBefore,
193 'valueAfter' => $propsAfter,
194 ]);
195 }
196 }
197 }
198 }
199
207 public static function prepareManifest(Block $block, array $manifest, array &$manifestFull = array())
208 {
209 if (
210 !isset($manifest['extra']['editable']) ||
211 !is_array($manifest['extra']['editable'])
212 )
213 {
214 return null;
215 }
216 else
217 {
218 $editable = $manifest['extra']['editable'];
219 }
220
221 if (
222 !isset($manifestFull['attrs']) ||
223 !is_array($manifestFull['attrs'])
224 )
225 {
226 $manifestFull['attrs'] = array();
227 }
228
229 if (
230 !isset($manifestFull['style']) ||
231 !is_array($manifestFull['style'])
232 )
233 {
234 $manifestFull['style'] = array();
235 }
236
237 $manifestFull['disableCache'] = true;
238 $manifest['allowInlineEdit'] = false;
239 $newExtra = array();
240 $originalStyleBlock = isset($manifestFull['style']['block'])
241 ? $manifestFull['style']['block']
242 : array();
243
244 // detect all components in text
245 $components = \PHPParser::parseScript($block->getContent());
246 $classBlock = $block->getBlockClass();
247 foreach ($components as $component)
248 {
249 foreach ($component['DATA']['PARAMS'] as $key => $param)
250 {
251 if (
252 is_string($param)
253 && stripos($param, '={$classBlock->get') !== false
254 && $value = $classBlock->get($key)
255 )
256 {
257 $component['DATA']['PARAMS'][$key] = $value;
258 }
259 }
260 $componentName = $manifest['code'];
261 // when found what need, get actually params from text and props description from component
262 if ($component['DATA']['COMPONENT_NAME'] == $componentName)
263 {
264 // collect props
265 $componentDesc = \CComponentUtil::GetComponentDescr(
266 $component['DATA']['COMPONENT_NAME']
267 );
268 $propsTemplate = @\CComponentUtil::GetTemplateProps(//@fixme
269 $component['DATA']['COMPONENT_NAME'],
270 $component['DATA']['TEMPLATE_NAME'],
271 '',
272 self::$predefineForDynamicProps
273 );
274 if (isset($propsTemplate['PARAMETERS']))
275 {
276 $propsTemplate = $propsTemplate['PARAMETERS'];
277 }
278 $props = @\CComponentUtil::getComponentProps(//@fixme
279 $component['DATA']['COMPONENT_NAME'],
280 self::$predefineForDynamicProps
281 );
282 if (isset($props['PARAMETERS']))
283 {
284 $props = $props['PARAMETERS'];
285 }
286 if (!empty($propsTemplate) && is_array($propsTemplate))
287 {
288 foreach ($propsTemplate as $code => $prop)
289 {
290 $props[$code] = $prop;
291 }
292 }
293 // style block
294 $styleAttrs = array();
295 if (
296 !isset($manifestFull['style']) ||
297 !is_array($manifestFull['style'])
298 )
299 {
300 $manifestFull['style'] = array(
301 'block' => array(),
302 'nodes' => array()
303 );
304 }
305 else if (!isset($manifestFull['style']['nodes']))
306 {
307 $manifestFull['style'] = array(
308 'nodes' => $manifestFull['style']
309 );
310 }
311 $manifestFull['style']['block'] = array_merge(array(
312 'name' => isset($componentDesc['NAME'])
313 ? $componentDesc['NAME']
314 : '',
315 'type' => 'box',
316 'additional' => array(
317 array(
318 'name' => Loc::getMessage('LANDING_NODE_CMP_STYLE_BLOCK'),
319 'attrs' => &$styleAttrs
320 )
321 )
322 ), $originalStyleBlock);
323 foreach ($editable as $field => $fieldItem)
324 {
325 if (isset($props[$field]))
326 {
327 // change node manifest
328 $newExtra[$field] = $props[$field];
329 $newExtra[$field]['VALUE'] = $component['DATA']['PARAMS'][$field] ?? null;
330 // add attr
331 if (!isset($manifestFull['attrs'][$componentName]))
332 {
333 $manifestFull['attrs'][$componentName] = array();
334 }
335 $propType = self::transformPropType(array(
336 'name' => $fieldItem['name'] ?? $newExtra[$field]['NAME'],
337 'style' => isset($fieldItem['style'])
338 && $fieldItem['style'],
339 'original_type' => 'component',
340 'component_type' => $newExtra[$field]['TYPE'] ?? '',
341 'attribute' => $field,
342 'value' => self::preparePropValue(
343 $newExtra[$field]['VALUE'],
344 $fieldItem
345 ),
346 'default_value' => $newExtra[$field]['DEFAULT'] ?? null,
347 //'original_value' => $newExtra[$field]['VALUE'],
348 'allowInlineEdit' => false
349 ) + $fieldItem, $newExtra[$field]);
350 $newExtra[$field]['ATTRIBUTE_TYPE'] = $propType['type'];
351 if ($propType['style'])
352 {
353 $propType['selector'] = $componentName;
354 $styleAttrs[] = $propType;
355 }
356 else
357 {
358 $manifestFull['attrs'][$componentName][] = $propType;
359 }
360 }
361 }
362 if (empty($styleAttrs))
363 {
364 if ($originalStyleBlock)
365 {
366 $manifestFull['style']['block'] = $originalStyleBlock;
367 }
368 else
369 {
370 unset($manifestFull['style']['block']);
371 }
372 }
373 // all right
374 if (!empty($newExtra))
375 {
376 $manifest['extra'] = $newExtra;
377 return $manifest;
378 }
379 }
380 }
381 return null;
382 }
383
390 protected static function transformPropType(array $item, $prop)
391 {
392 if (isset($prop['TYPE']))
393 {
394 if (
395 $prop['TYPE'] == 'CUSTOM' &&
396 isset($prop['JS_EVENT'])
397 )
398 {
399 $prop['TYPE'] = $prop['TYPE'] . '_' . $prop['JS_EVENT'];
400 }
401
402 switch ($prop['TYPE'])
403 {
404 case 'LIST':
405 {
406 $item['items'] = array();
407 if (isset($prop['MULTIPLE']) && $prop['MULTIPLE'] == 'Y')
408 {
409 $item['type'] = 'multiselect';
410 if (!is_array($item['value']))
411 {
412 $item['value'] = array($item['value']);
413 }
414 }
415 else
416 {
417 $prop['MULTIPLE'] = 'N';
418 $item['type'] = 'dropdown';
419 }
420 if (isset($prop['VALUES']) && is_array($prop['VALUES']))
421 {
422 foreach ($prop['VALUES'] as $code => $val)
423 {
424 $item['items'][] = array(
425 'name' => $val,
426 'value' => $code,
427 'selected' => (
428 $prop['MULTIPLE'] == 'Y' &&
429 in_array($code, $item['value'])
430 ) || $code == $item['value']
431 );
432 }
433 }
434 break;
435 }
436 case 'CHECKBOX':
437 {
438 $item['type'] = 'checkbox';
439 $item['items'] = [
440 [
441 'name' => $item['name'],
442 'value' => 'Y',
443 'checked' => (
444 (isset($item['value']) && $item['value'] !== '')
445 ? $item['value']
446 : $prop['DEFAULT']
447 ) == 'Y'
448 ]
449 ];
450 $item['compact'] = true;
451 unset($item['name']);
452 break;
453 }
454 case 'CUSTOM_initDraggableAddControl':
455 {
456 $item['type'] = 'catalog-view';
457 $item['items'] = array(
458 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-1.svg', 'value' => '0'),
459 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-2.svg', 'value' => '1'),
460 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-3.svg', 'value' => '2'),
461 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-4.svg', 'value' => '3'),
462 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-1-4.svg', 'value' => '4'),
463 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-4-1.svg', 'value' => '5'),
464 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-6.svg', 'value' => '6'),
465 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-1-6.svg', 'value' => '7'),
466 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-6-1.svg', 'value' => '8'),
467 array('name' => '', 'image' => '/bitrix/images/landing/catalog_images/preset-line.svg', 'value' => '9')
468 );
469 $jsArray = \Cutil::jsObjectToPhp($item['value'], true);
470 $item['value'] = array();
471 if (is_array($jsArray))
472 {
473 foreach ($jsArray as $val)
474 {
475 if (isset($val['VARIANT']))
476 {
477 $item['value'][] = (int)$val['VARIANT'];
478 }
479 }
480 }
481 break;
482 }
483 case 'CUSTOM_initPositionControl':
484 {
485 $item['type'] = 'position';
486 $item['items'] = array(
487 'top-left' => array('content' => '', 'value' => 'top-left'),
488 'top-center' => array('content' => '', 'value' => 'top-center'),
489 'top-right' => array('content' => '', 'value' => 'top-right'),
490 'middle-left' => array('content' => '', 'value' => 'middle-left'),
491 'middle-center' => array('content' => '', 'value' => 'middle-center'),
492 'middle-right' => array('content' => '', 'value' => 'middle-right'),
493 'bottom-left' => array('content' => '', 'value' => 'bottom-left'),
494 'bottom-center' => array('content' => '', 'value' => 'bottom-center'),
495 'bottom-right' => array('content' => '', 'value' => 'bottom-right')
496 );
497 break;
498 }
499 case 'CUSTOM_initDraggableOrderControl':
500 {
501 $item['type'] = 'sortable-list';
502 $item['items'] = array();
503 if (!is_array($item['value']))
504 {
505 $item['value'] = explode(',', $item['value']);
506 }
507 $items = Json::decode($prop['JS_DATA']);
508 if (is_array($items))
509 {
510 foreach ($items as $code => $val)
511 {
512 $item['items'][] = array(
513 'name' => $val,
514 'value' => $code,
515 'preview' => '/bitrix/images/landing/catalog_images/preview/'.mb_strtolower($code) . '.svg?v3'
516 );
517 }
518 }
519 break;
520 }
521 case 'CUSTOM_initColorField':
522 {
523 $item['type'] = 'color';
524 $item['subtype'] = 'color';
525
526 break;
527 }
528 case 'CUSTOM_initIconField':
529 {
530 $item['type'] = 'icon';
531 $item['disableLink'] = 'true';
532 $item['value'] = is_array($item['value']) && !empty($item['value'])
533 ? $item['value']
534 : $prop['DEFAULT']
535 ;
536
537 break;
538 }
539 case 'CUSTOM_initImageField':
540 {
541
542 $item['type'] = 'image';
543 $item['disableLink'] = 'true';
544 $data = \Cutil::jsObjectToPhp($prop['JS_DATA'], true);
545 $item['dimensions'] = $data['dimensions'] ?? 'false';
546
547 break;
548 }
549
550 case 'CUSTOM_initUserSelectField':
551 {
552 $item['type'] = 'user-select';
553 $item['value'] = (int)$item['value'] > 0 ? $item['value'] : $prop['DEFAULT'];
554 $item['value'] = (int)$item['value'];
555
556 break;
557 }
558
559 case 'CUSTOM_initDynamicSource':
560 {
561 $item['type'] = 'dynamic_source';
562 $item['hideSort'] = 'true';
563 $data = \Cutil::jsObjectToPhp($prop['JS_DATA'], true);
564 if ($data['sources'] && is_array($data['sources']))
565 {
566 $item['sources'] = $data['sources'];
567 }
568 if ($data['title'] && is_string($data['title']))
569 {
570 $item['title'] = $data['title'];
571 }
572 if ($data['stubText'] && is_string($data['stubText']))
573 {
574 $item['stubText'] = $data['stubText'];
575 }
576 if ($data['useLink'] && is_string($data['useLink']))
577 {
578 $item['useLink'] = $data['useLink'];
579 }
580 if ($data['linkType'] && is_string($data['linkType']))
581 {
582 $item['linkType'] = $data['linkType'];
583 }
584
585 break;
586 }
587
588 default:
589 {
590 if (!isset($item['type']) || !$item['type'])
591 {
592 $item['type'] = 'text';
593 }
594 switch ($item['type'])
595 {
596 case 'url':
597 {
598 $item['disableBlocks'] = true;
599 break;
600 }
601 case 'filter':
602 {
603 ob_start();
604 $filterId = 'LANDING_FLT_' . $item['attribute'];
605 \Bitrix\Landing\Manager::getApplication()->includeComponent(
606 'bitrix:main.ui.filter',
607 '',
608 array(
609 'THEME' => \Bitrix\Main\UI\Filter\Theme::BORDER,
610 'FILTER_ID' => $filterId,
611 'FILTER' => isset($item['fields'])
612 ? $item['fields']
613 : array(),
614 'DISABLE_SEARCH' => true,
615 'ENABLE_LABEL' => true
616 )
617 );
618 $item['html'] = ob_get_clean();
619 $item['filterId'] = $filterId;
620 break;
621 }
622 default:
623 {
624 $item['placeholder'] = '';
625 }
626 }
627 break;
628 }
629 }
630 }
631
632 return $item;
633 }
634
641 protected static function preparePropValue($value, $prop)
642 {
643 if (isset($prop['type']))
644 {
645 switch ($prop['type'])
646 {
647 case 'url':
648 {
649 if ($value && isset($prop['entityType']))
650 {
651 // @todo: make this more universal
652 if (
653 $prop['entityType'] == 'element' &&
654 $value != '={$elementCode}' &&
655 $value != '={$elementId}'
656 )
657 {
658 $value = '#catalogElement' . $value;
659 }
660 else if (
661 $prop['entityType'] == 'section' &&
662 $value != '={$sectionCode}' &&
663 $value != '={$sectionId}'
664 )
665 {
666 $value = '#catalogSection' . $value;
667 }
668 }
669 }
670 }
671 }
672 return $value;
673 }
674
681 protected static function transformPropValue($value, $prop)
682 {
683 if (!is_array($value))
684 {
685 $value = \CUtil::jsObjectToPhp($value, true);
686 }
687
688 if (isset($prop['TYPE']))
689 {
690 if (
691 $prop['TYPE'] == 'CUSTOM' &&
692 isset($prop['JS_EVENT'])
693 )
694 {
695 $prop['TYPE'] = $prop['TYPE'] . '_' . $prop['JS_EVENT'];
696 }
697 if (
698 isset($prop['MULTIPLE']) &&
699 $prop['MULTIPLE'] == 'Y' &&
700 !is_array($value)
701 )
702 {
703 $value = array($value);
704 }
705
706 switch ($prop['TYPE'])
707 {
708 case 'CHECKBOX':
709 {
710 if (is_array($value))
711 {
712 $value = array_shift($value);
713 }
714 if ($value != 'Y')
715 {
716 $value = 'N';
717 }
718 break;
719 }
720 case 'CUSTOM_initDraggableAddControl':
721 {
722 $newValue = array();
723 if (is_array($value))
724 {
725 foreach ($value as $val)
726 {
727 $newValue[] = array(
728 'VARIANT' => $val,
729 'BIG_DATA' => false
730 );
731 }
732 }
733 $value = \CUtil::phpToJsObject($newValue);
734 break;
735 }
736 case 'CUSTOM_initDraggableOrderControl':
737 {
738 if (is_array($value))
739 {
740 $value = implode(',', $value);
741 }
742 break;
743 }
744 default:
745 {
746 if (isset($prop['ATTRIBUTE_TYPE']))
747 {
748 switch ($prop['ATTRIBUTE_TYPE'])
749 {
750 case 'url':
751 {
752 if (preg_match('/^#landing([\d]+)$/', $value, $matches))
753 {
754 $lansing = \Bitrix\Landing\Landing::createInstance($matches[1], [
755 'skip_blocks' => true
756 ]);
757 if ($lansing->exist())
758 {
759 $value = $lansing->getPublicUrl();
760 }
761 }
762 else if (preg_match('/^#catalog(Element|Section)([\d]+)$/', $value, $matches))
763 {
764 $value = $matches[2];
765 }
766 break;
767 }
768 }
769 }
770 }
771 }
772 }
773
774 return $value;
775 }
776
784 public static function getIblockURL($elementId, $urlType)
785 {
786 return \Bitrix\Landing\PublicAction\Utils::getIblockURL($elementId, $urlType);
787 }
788
795 public static function getIblockParams($key = false)
796 {
797 static $params = array();
798
799 if (empty($params))
800 {
801 $params['id'] = \Bitrix\Main\Config\Option::get('crm', 'default_product_catalog_id');
802 $params['type'] = 'CRM_PRODUCT_CATALOG';
803 $params['default_product'] = false;
804 }
805
806 if ($key === false)
807 {
808 return $params;
809 }
810 else
811 {
812 return isset($params[$key]) ? $params[$key] : null;
813 }
814 }
815
822 public static function getNode(Block $block, $selector)
823 {
824 $data = array();
825 $manifest = $block->getManifest();
826
827 // gets common attrs
828 if (isset($manifest['attrs'][$selector]))
829 {
830 $allowedProps = $manifest['attrs'][$selector];
831 foreach ($allowedProps as $attr)
832 {
833 if (!self::checkPhpCode($attr['value']))
834 {
835 $data[$attr['attribute']] = $attr['value'];
836 }
837 }
838 }
839
840 // gets attrs from style block
841 if (
842 isset($manifest['style']['block']['additional']) &&
843 is_array($manifest['style']['block']['additional'])
844 )
845 {
846 foreach ($manifest['style']['block']['additional'] as $item)
847 {
848 if (
849 isset($item['attrs']) &&
850 is_array($item['attrs'])
851 )
852 {
853 foreach ($item['attrs'] as $attr)
854 {
855 if (!self::checkPhpCode($attr['value']))
856 {
857 $data[$attr['attribute']] = $attr['value'];
858 }
859 }
860 }
861 }
862 }
863
864 return $data;
865 }
866}
getContent()
Определения block.php:1421
getManifest(bool $extended=false, bool $missCache=false, array $params=array())
Определения block.php:1682
getLandingId()
Определения block.php:1385
getBlockClass()
Определения block.php:1430
getDom($clear=false)
Определения block.php:3530
static getApplication()
Определения manager.php:71
static getIblockParams($key=false)
Определения component.php:795
static getIblockURL($elementId, $urlType)
Определения component.php:784
static setPredefineForDynamicProps(array $additionalVals)
Определения component.php:33
static transformPropValue($value, $prop)
Определения component.php:681
static prepareManifest(Block $block, array $manifest, array &$manifestFull=array())
Определения component.php:207
static $predefineForDynamicProps
Определения component.php:17
static checkPhpCode($code)
Определения component.php:86
static preparePropValue($value, $prop)
Определения component.php:641
static getNode(Block $block, $selector)
Определения component.php:822
static transformPropType(array $item, $prop)
Определения component.php:390
static getHandlerJS()
Определения component.php:23
static saveComponent($content, $code, array $params)
Определения component.php:48
static saveNode(Block $block, $selector, array $data)
Определения component.php:122
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
Определения json.php:9
static GetTemplateProps($componentName, $templateName, $siteTemplate="", $arCurrentValues=array())
Определения component_util.php:963
static GetComponentDescr($componentName)
Определения component_util.php:402
$content
Определения commerceml.php:144
$componentName
Определения component_props2.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
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
Определения component.php:2
if(empty($signedUserToken)) $key
Определения quickway.php:257
$props
Определения template.php:269
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$items
Определения template.php:224
$val
Определения options.php:1793
$matches
Определения index.php:22
$k
Определения template_pdf.php:567