1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
prop_directory.php
См. документацию.
1<?php
2
7
12{
13 const TABLE_PREFIX = 'b_hlbd_';
14
15 const USER_TYPE = 'directory';
16
17 protected static array $arFullCache = [];
18 protected static array $arItemCache = [];
19 protected static array $directoryMap = [];
20 protected static array $hlblockCache = [];
21 protected static array $hlblockClassNameCache = [];
22
28 public static function GetUserTypeDescription(): array
29 {
30 return array(
31 'PROPERTY_TYPE' => 'S',
32 'USER_TYPE' => self::USER_TYPE,
33 'DESCRIPTION' => Loc::getMessage('HIBLOCK_PROP_DIRECTORY_DESCRIPTION'),
34 'GetSettingsHTML' => array(__CLASS__, 'GetSettingsHTML'),
35 'GetPropertyFieldHtml' => array(__CLASS__, 'GetPropertyFieldHtml'),
36 'PrepareSettings' => array(__CLASS__, 'PrepareSettings'),
37 'GetAdminListViewHTML' => array(__CLASS__, 'GetAdminListViewHTML'),
38 'GetPublicViewHTML' => array(__CLASS__, 'GetPublicViewHTML'),
39 'GetPublicEditHTML' => array(__CLASS__, 'GetPublicEditHTML'),
40 'GetPublicEditHTMLMulty' => array(__CLASS__, 'GetPublicEditHTMLMulty'),
41 'GetAdminFilterHTML' => array(__CLASS__, 'GetAdminFilterHTML'),
42 'GetExtendedValue' => array(__CLASS__, 'GetExtendedValue'),
43 'GetSearchContent' => array(__CLASS__, 'GetSearchContent'),
44 'AddFilterFields' => array(__CLASS__, 'AddFilterFields'),
45 'GetUIFilterProperty' => array(__CLASS__, 'GetUIFilterProperty'),
46 'GetUIEntityEditorProperty' => array(__CLASS__, 'GetUIEntityEditorProperty'),
47 'GetUIEntityEditorPropertyEditHtml' => array(__CLASS__, 'GetUIEntityEditorPropertyEditHtml'),
48 'GetUIEntityEditorPropertyViewHtml' => array(__CLASS__, 'GetUIEntityEditorPropertyViewHtml'),
49 );
50 }
51
58 public static function PrepareSettings($arProperty): array
59 {
60 $size = 1;
61 $width = 0;
62 $multiple = "N";
63 $group = "N";
64 $directoryTableName = '';
65
66 if (!empty($arProperty["USER_TYPE_SETTINGS"]) && is_array($arProperty["USER_TYPE_SETTINGS"]))
67 {
68 if (isset($arProperty["USER_TYPE_SETTINGS"]["size"]))
69 {
70 $size = (int)$arProperty["USER_TYPE_SETTINGS"]["size"];
71 if ($size <= 0)
72 $size = 1;
73 }
74
75 if (isset($arProperty["USER_TYPE_SETTINGS"]["width"]))
76 {
77 $width = (int)$arProperty["USER_TYPE_SETTINGS"]["width"];
78 if ($width < 0)
79 $width = 0;
80 }
81
82 if (isset($arProperty["USER_TYPE_SETTINGS"]["group"]) && $arProperty["USER_TYPE_SETTINGS"]["group"] === "Y")
83 $group = "Y";
84
85 if (isset($arProperty["USER_TYPE_SETTINGS"]["multiple"]) && $arProperty["USER_TYPE_SETTINGS"]["multiple"] === "Y")
86 $multiple = "Y";
87
88 if (isset($arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"]))
89 $directoryTableName = (string)$arProperty["USER_TYPE_SETTINGS"]['TABLE_NAME'];
90 }
91
92 $extendedSettings = false;
93 $result = [
94 'size' => $size,
95 'width' => $width,
96 'group' => $group,
97 'multiple' => $multiple,
98 'TABLE_NAME' => $directoryTableName,
99 ];
100 $defaultValue = '';
101 if ($directoryTableName !== '')
102 {
103 $hlblock = static::resolveHighloadblockByTableName($directoryTableName);
104 if ($hlblock)
105 {
106 $defaultValue = self::getDefaultXmlId($hlblock['ID']);
107 if ($defaultValue !== null)
108 {
109 $extendedSettings = true;
110 }
111 }
112 unset(
113 $hlblock,
114 );
115 }
116
117 if (!$extendedSettings)
118 {
119 return $result;
120 }
121
122 $arProperty['USER_TYPE_SETTINGS'] = $result;
123 $arProperty['DEFAULT_VALUE'] = $defaultValue;
124
125 return $arProperty;
126 }
127
136 public static function GetSettingsHTML($arProperty, $strHTMLControlName, &$arPropertyFields): string
137 {
138 $iblockID = 0;
139 if (isset($arProperty['IBLOCK_ID']))
140 $iblockID = (int)$arProperty['IBLOCK_ID'];
141 CJSCore::Init(array('translit'));
142 $settings = static::PrepareSettings($arProperty);
143 if (isset($settings['USER_TYPE_SETTINGS']))
144 $settings = $settings['USER_TYPE_SETTINGS'];
145 $arPropertyFields = array(
146 'HIDE' => ['ROW_COUNT', 'COL_COUNT', 'MULTIPLE_CNT', 'DEFAULT_VALUE', 'WITH_DESCRIPTION'],
147 'SET' => ['DEFAULT_VALUE' => ''],
148 );
149
150 $directory = [];
151 $cellOption = '<option value="-1"'.('' == $settings["TABLE_NAME"] ? ' selected' : '').'>'.Loc::getMessage('HIBLOCK_PROP_DIRECTORY_NEW_DIRECTORY').'</option>';
152
153 $rsData = HL\HighloadBlockTable::getList(array(
154 'select' => array('*', 'NAME_LANG' => 'LANG.NAME'),
155 'order' => array('NAME_LANG' => 'ASC', 'NAME' => 'ASC'),
156 ));
157 while($arData = $rsData->fetch())
158 {
159 if ($settings['TABLE_NAME'] == $arData['TABLE_NAME'])
160 {
161 $directory = $arData;
162 unset($directory['NAME_LANG']);
163 }
164 $arData['NAME_LANG'] = (string)$arData['NAME_LANG'];
165 $hlblockTitle = ($arData['NAME_LANG'] != '' ? $arData['NAME_LANG'] : $arData['NAME']).' ('.$arData["TABLE_NAME"].')';
166 $selected = ($settings["TABLE_NAME"] == $arData['TABLE_NAME']) ? ' selected' : '';
167 $cellOption .= '<option '.$selected.' value="'.htmlspecialcharsbx($arData["TABLE_NAME"]).'">'.htmlspecialcharsbx($hlblockTitle).'</option>';
168 unset($hlblockTitle);
169 }
170 unset($arData, $rsData);
171
172 if (!empty($directory))
173 {
174 $defaultValue = self::getDefaultXmlId($directory);
175 if ($defaultValue !== null)
176 $arPropertyFields['SET']['DEFAULT_VALUE'] = $defaultValue;
177 unset($defaultValue);
178 }
179 unset($directory);
180
181 $multiple = $arProperty['MULTIPLE'];
182
183 $tablePrefix = self::TABLE_PREFIX;
184 $selectDir = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_SELECT_DIR");
185 $headingXmlId = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_XML_ID");
186 $headingName = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_NAME");
187 $headingSort = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_SORT");
188 $headingDef = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_DEF");
189 $headingLink = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_LINK");
190 $headingFile = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_FILE");
191 $headingDescription = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_DECSRIPTION");
192 $headingFullDescription = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_FULL_DESCRIPTION");
193 $directoryName = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_NEW_NAME");
194 $directoryMore = Loc::getMessage("HIBLOCK_PROP_DIRECTORY_MORE");
195
196 $emptyDefaultValue = '';
197 if ($multiple == 'N')
198 {
199 $emptyDefaultValue = '<tr id="hlbl_property_tr_empty">'.
200 '<td colspan="6" style="text-align: center;">'.Loc::getMessage('HIBLOCK_PROP_DIRECTORY_EMPTY_DEFAULT_VALUE').'</td>'.
201 '<td style="text-align:center;">'.
202 '<input type="radio" name="PROPERTY_VALUES_DEF" id="PROPERTY_VALUES_DEF_EMPTY" value="-1" checked="checked">'.
203 '<td colspan="2">&nbsp;</td>'.
204 '</tr>';
205 }
206
207 return <<<"HIBSELECT"
208<script>
209function getTableHead()
210{
211 BX('hlb_directory_table').innerHTML = '<tr class="heading"><td></td><td>$headingName</td><td>$headingSort</td><td>$headingXmlId</td><td>$headingFile</td><td>$headingLink</td><td>$headingDef</td><td>$headingDescription</td><td>$headingFullDescription</td></tr>$emptyDefaultValue';
212}
213
214function getDirectoryTableRow(addNew)
215{
216 addNew = (addNew === 'row' ? 'row' : 'full');
217 var obSelectHLBlock = BX('hlb_directory_table_id');
218 if (!!obSelectHLBlock)
219 {
220 var rowNumber = parseInt(BX('hlb_directory_row_number').value, 10);
221 if (BX('IB_MAX_ROWS_COUNT'))
222 rowNumber = parseInt(BX('IB_MAX_ROWS_COUNT').value, 10);
223 if (isNaN(rowNumber))
224 rowNumber = 0;
225 var hlBlock = (-1 < obSelectHLBlock.selectedIndex ? obSelectHLBlock.options[obSelectHLBlock.selectedIndex].value : '');
226 var selectHLBlockValue = hlBlock;
227
228 if (addNew === 'full')
229 {
230 if (selectHLBlockValue == '-1')
231 {
232 getTableHead();
233 BX('hlb_directory_table_tr').style.display = 'table-row';
234 BX('hlb_directory_title_tr').style.display = 'table-row';
235 BX('hlb_directory_table_name').style.display = 'table-row';
236 BX('hlb_directory_table_name').disabled = false;
237
238 addNew = 'row';
239 rowNumber = 0;
240 }
241 else
242 {
243 BX('hlb_directory_table_name').disabled = true;
244 BX('hlb_directory_title_tr').style.display = 'none';
245
246 BX.ajax.post(
247 'highloadblock_directory_ajax.php',
248 {
249 lang: BX.message('LANGUAGE_ID'),
250 sessid: BX.bitrix_sessid(),
251 hlBlock: hlBlock,
252 rowNumber: rowNumber,
253 getTitle: 'Y',
254 IBLOCK_ID: '{$iblockID}',
255 multiple: '{$multiple}'
256 },
257 BX.delegate(function(result) {
258 BX('hlb_directory_table').innerHTML = result;
259 })
260 );
261
262 }
263 }
264 if (addNew === 'row')
265 {
266 BX.ajax.loadJSON(
267 'highloadblock_directory_ajax.php',
268 {
269 lang: BX.message('LANGUAGE_ID'),
270 sessid: BX.bitrix_sessid(),
271 hlBlock: hlBlock,
272 rowNumber: rowNumber,
273 addEmptyRow: 'Y',
274 IBLOCK_ID: '{$iblockID}',
275 multiple: '{$multiple}'
276 },
277 BX.delegate(function(result) {
278 var obRow = null,
279 obTable = BX('hlb_directory_table'),
280 i = '',
281 obCell = null,
282 rowNumber = 0;
283
284 if (!!obTable && 'object' === typeof result)
285 {
286 rowNumber = parseInt(BX('hlb_directory_row_number').value, 10);
287 if (!!BX('IB_MAX_ROWS_COUNT'))
288 rowNumber = parseInt(BX('IB_MAX_ROWS_COUNT').value, 10);
289 if (isNaN(rowNumber))
290 rowNumber = 0;
291 obRow = obTable.insertRow(obTable.rows.length);
292 obRow.id = 'hlbl_property_tr_'+rowNumber;
293 for (i in result)
294 {
295 obCell = obRow.insertCell(-1);
296 BX.adjust(obCell, { style: result[i].style, html: result[i].html });
297 }
298 BX('hlb_directory_row_number').value = rowNumber + 1;
299 if(BX('IB_MAX_ROWS_COUNT'))
300 BX('IB_MAX_ROWS_COUNT').value = rowNumber + 1;
301 }
302 })
303 );
304 }
305 }
306}
307function getDirectoryTableHead(e)
308{
309 e.value = BX.translit(e.value, {
310 'change_case' : 'L',
311 'replace_space' : '',
312 'delete_repeat_replace' : true
313 });
314
315 var obSelectHLBlock = BX('hlb_directory_table_id');
316 if (!!obSelectHLBlock)
317 {
318 if (-1 < obSelectHLBlock.selectedIndex && '-1' == obSelectHLBlock.options[obSelectHLBlock.selectedIndex].value)
319 {
320 BX('hlb_directory_table_id_hidden').disabled = false;
321 BX('hlb_directory_table_id_hidden').value = '{$tablePrefix}'+BX('hlb_directory_table_name').value;
322 BX('hlb_directory_table_id_hidden').value = BX('hlb_directory_table_id_hidden').value.substr(0, 30);
323 }
324 }
325}
326
327</script>
328<tr>
329 <td>{$selectDir}:</td>
330 <td>
331 <input type="hidden" name="{$strHTMLControlName["NAME"]}[TABLE_NAME]" disabled id="hlb_directory_table_id_hidden">
332 <select name="{$strHTMLControlName["NAME"]}[TABLE_NAME]" id="hlb_directory_table_id" onchange="getDirectoryTableRow('full');"/>
333 $cellOption
334 </select>
335 </td>
336</tr>
337<tr id="hlb_directory_title_tr" class="adm-detail-required-field">
338 <td>$directoryName</td>
339 <td>
340 <input type="hidden" value="0" id="hlb_directory_row_number">
341 <input type="text" name="HLB_NEW_TITLE" size="30" id="hlb_directory_table_name" onchange="getDirectoryTableHead(this);">
342 </td>
343</tr>
344<tr id="hlb_directory_table_tr">
345 <td colspan="2" style="text-align: center;">
346 <table class="internal" id="hlb_directory_table" style="margin: 0 auto;">
347 <script>getDirectoryTableRow('full');</script>
348 </table>
349 </td>
350</tr>
351<tr>
352 <td colspan="2" style="text-align: center;">
353 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_NAME]" value="{$headingName}">
354 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_SORT]" value="{$headingSort}">
355 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_XML_ID]" value="{$headingXmlId}">
356 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_FILE]" value="{$headingFile}">
357 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_LINK]" value="{$headingLink}">
358 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_DEF]" value="{$headingDef}">
359 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_DESCRIPTION]" value="{$headingDescription}">
360 <input type="hidden" name="{$strHTMLControlName["NAME"]}[LANG][UF_FULL_DESCRIPTION]" value="{$headingFullDescription}">
361 <div style="width: 100%; text-align: center; margin: 10px 0;">
362 <input type="button" value="{$directoryMore}" onclick="getDirectoryTableRow('row');" id="hlb_directory_table_button" class="adm-btn-big">
363 </div>
364 </td>
365</tr>
366HIBSELECT;
367 }
368
377 public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName): string
378 {
380 $size = ($settings["size"] > 1 ? ' size="'.$settings["size"].'"' : '');
381 $width = ($settings["width"] > 0 ? ' style="width:'.$settings["width"].'px"' : '');
382
383 $options = CIBlockPropertyDirectory::GetOptionsHtml($arProperty, array($value["VALUE"]));
384 $html = '<select name="'.$strHTMLControlName["VALUE"].'"'.$size.$width.'>';
385 $html .= $options;
386 $html .= '</select>';
387 return $html;
388 }
389
398 public static function GetPublicEditHTML($property, $value, $control): string
399 {
400 $multi = (isset($property['MULTIPLE']) && $property['MULTIPLE'] == 'Y');
401
403 $size = ($settings['size'] > 1 ? ' size="'.$settings['size'].'"' : '');
404 $width = ($settings['width'] > 0 ? ' style="width:'.$settings['width'].'px"' : ' style="margin-bottom:3px"');
405
406 $html = '<select '.($multi ? 'multiple' : '').' name="'.$control['VALUE'].($multi ? '[]' : '').'"'.$size.$width.'>';
407 $html .= CIBlockPropertyDirectory::GetOptionsHtml($property, $value);
408 $html .= '</select>';
409
410 return $html;
411 }
412
421 public static function GetPublicEditHTMLMulty($property, $value, $control): string
422 {
424 $settings['size'] = ($settings['size'] <= 1 ? 5 : $settings['size']);
425
426 $width = ($settings['width'] > 0 ? ' style="width:'.$settings['width'].'px"' : ' style="margin-bottom:3px"');
427
428 $html = '<select multiple name="'.$control['VALUE'].'[]" size="'.$settings['size'].'"'.$width.'>';
429 $html .= CIBlockPropertyDirectory::GetOptionsHtml($property, self::normalizeValue($value));
430 $html .= '</select>';
431
432 return $html;
433 }
434
442 public static function GetOptionsHtml($arProperty, $values): string
443 {
444 $selectedValue = false;
445 $cellOption = '';
446 $defaultOption = '';
447 $highLoadIBTableName = ($arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"] ?? '');
448 if($highLoadIBTableName != '')
449 {
450 if (empty(self::$arFullCache[$highLoadIBTableName]))
451 {
452 self::$arFullCache[$highLoadIBTableName] = self::getEntityFieldsByFilter(
453 $highLoadIBTableName,
454 array(
455 'select' => array('UF_XML_ID', 'UF_NAME', 'ID'),
456 )
457 );
458 }
459 foreach(self::$arFullCache[$highLoadIBTableName] as $data)
460 {
461 $options = '';
462 if(in_array($data["UF_XML_ID"], $values))
463 {
464 $options = ' selected';
465 $selectedValue = true;
466 }
467 $cellOption .= '<option '.$options.' value="'.htmlspecialcharsbx($data['UF_XML_ID']).'">'.htmlspecialcharsEx($data["UF_NAME"].' ['.$data["ID"]).']</option>';
468 }
469 $defaultOption = '<option value=""'.($selectedValue ? '' : ' selected').'>'.Loc::getMessage('HIBLOCK_PROP_DIRECTORY_EMPTY_VALUE').'</option>';
470 }
471 else
472 {
473 $cellOption = '<option value="" selected>'.Loc::getMessage('HIBLOCK_PROP_DIRECTORY_EMPTY_VALUE').'</option>';
474 }
475 return $defaultOption.$cellOption;
476 }
477
484 public static function GetOptionsData($arProperty): array
485 {
486 $listData = array();
487
488 if(isset($arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"]))
489 {
490 $highLoadIBTableName = $arProperty["USER_TYPE_SETTINGS"]["TABLE_NAME"];
491 if (empty(self::$arFullCache[$highLoadIBTableName]))
492 {
493 self::$arFullCache[$highLoadIBTableName] = self::getEntityFieldsByFilter(
494 $highLoadIBTableName,
495 array("select" => array("UF_XML_ID", "UF_NAME", "ID"))
496 );
497 }
498 foreach(self::$arFullCache[$highLoadIBTableName] as $data)
499 {
500 $listData[$data['UF_XML_ID']] = $data["UF_NAME"]." [".$data["ID"]."]";
501 }
502 }
503
504 return $listData;
505 }
506
514 public static function GetExtendedValue($arProperty, $value)
515 {
516 if (!isset($value['VALUE']))
517 return false;
518
519 if (is_array($value['VALUE']) && count($value['VALUE']) == 0)
520 return false;
521
522 if (empty($arProperty['USER_TYPE_SETTINGS']['TABLE_NAME']))
523 return false;
524
525 $tableName = $arProperty['USER_TYPE_SETTINGS']['TABLE_NAME'];
526 if (!isset(self::$arItemCache[$tableName]))
527 self::$arItemCache[$tableName] = array();
528
529 if (is_array($value['VALUE']) || !isset(self::$arItemCache[$tableName][$value['VALUE']]))
530 {
531 $data = self::getEntityFieldsByFilter(
532 $arProperty['USER_TYPE_SETTINGS']['TABLE_NAME'],
533 array(
534 'select' => array('UF_XML_ID', 'UF_NAME'),
535 'filter' => array('=UF_XML_ID' => $value['VALUE']),
536 )
537 );
538
539 if (!empty($data))
540 {
541 foreach ($data as $item)
542 {
543 if (isset($item['UF_XML_ID']))
544 {
545 $item['VALUE'] = $item['UF_NAME'];
546 if (isset($item['UF_FILE']))
547 {
548 $item['FILE_ID'] = $item['UF_FILE'];
549 }
550 self::$arItemCache[$tableName][$item['UF_XML_ID']] = $item;
551 }
552 }
553 }
554 }
555
556 if (is_array($value['VALUE']))
557 {
558 $result = array();
559 foreach ($value['VALUE'] as $prop)
560 {
561 if (isset(self::$arItemCache[$tableName][$prop]))
562 {
563 $result[$prop] = self::$arItemCache[$tableName][$prop];
564 }
565 else
566 {
567 $result[$prop] = false;
568 }
569 }
570 return $result;
571 }
572 else
573 {
574 if (isset(self::$arItemCache[$tableName][$value['VALUE']]))
575 {
576 return self::$arItemCache[$tableName][$value['VALUE']];
577 }
578 }
579 return false;
580 }
581
590 public static function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName): string
591 {
592 $dataValue = self::GetExtendedValue($arProperty, $value);
593 if ($dataValue)
594 {
595 return htmlspecialcharsbx($dataValue['UF_NAME']);
596 }
597 return '';
598 }
599
608 public static function GetPublicViewHTML($arProperty, $value, $strHTMLControlName): string
609 {
610 $dataValue = self::GetExtendedValue($arProperty, $value);
611 if ($dataValue)
612 {
613 if (isset($strHTMLControlName['MODE']) && 'CSV_EXPORT' == $strHTMLControlName['MODE'])
614 return $dataValue['UF_XML_ID'];
615 elseif (isset($strHTMLControlName['MODE']) && ('SIMPLE_TEXT' == $strHTMLControlName['MODE'] || 'ELEMENT_TEMPLATE' == $strHTMLControlName['MODE']))
616 return $dataValue['UF_NAME'];
617 else
618 return htmlspecialcharsbx($dataValue['UF_NAME']);
619 }
620 return '';
621 }
622
630 public static function GetAdminFilterHTML($arProperty, $strHTMLControlName): string
631 {
632 $lAdmin = new CAdminList($strHTMLControlName["TABLE_ID"]);
633 $lAdmin->InitFilter(array($strHTMLControlName["VALUE"]));
634 $filterValue = $GLOBALS[$strHTMLControlName["VALUE"]];
635
636 if(isset($filterValue) && is_array($filterValue))
637 $values = $filterValue;
638 else
639 $values = array();
640
642 $size = ($settings["size"] > 1 ? ' size="'.$settings["size"].'"' : '');
643 $width = ($settings["width"] > 0 ? ' style="width:'.$settings["width"].'px"' : '');
644
646 $html = '<select name="'.$strHTMLControlName["VALUE"].'[]"'.$size.$width.' multiple>';
647 $html .= $options;
648 $html .= '</select>';
649 return $html;
650 }
651
660 public static function GetSearchContent($arProperty, $value, $strHTMLControlName): string
661 {
662 if (!isset($value['VALUE']))
663 return '';
664
665 if (is_array($value['VALUE']) && empty($value['VALUE'])) // order not change!
666 return '';
667
668 $dataValue = self::GetExtendedValue($arProperty, $value);
669 if (!empty($dataValue) && is_array($dataValue))
670 {
671 $result = [];
672 if (is_array($value['VALUE']))
673 {
674 foreach ($value['VALUE'] as $item)
675 {
676 if (empty($dataValue[$item]) && !is_array($dataValue[$item]))
677 {
678 continue;
679 }
680 $result[] = $dataValue[$item]['UF_NAME'] ?? $dataValue[$item]['UF_XML_ID'];
681 }
682 }
683 else
684 {
685 $result[] = $dataValue['UF_NAME'] ?? $dataValue['UF_XML_ID'];
686 }
687
688 return implode(' / ', $result);
689 }
690
691 return '';
692 }
693
703 public static function AddFilterFields($arProperty, $strHTMLControlName, &$arFilter, &$filtered): void
704 {
705 $filtered = false;
706 $values = array();
707
708 if (isset($_REQUEST[$strHTMLControlName["VALUE"]]))
709 $values = (is_array($_REQUEST[$strHTMLControlName["VALUE"]]) ? $_REQUEST[$strHTMLControlName["VALUE"]] : array($_REQUEST[$strHTMLControlName["VALUE"]]));
710 elseif (isset($GLOBALS[$strHTMLControlName["VALUE"]]))
711 $values = (is_array($GLOBALS[$strHTMLControlName["VALUE"]]) ? $GLOBALS[$strHTMLControlName["VALUE"]] : array($GLOBALS[$strHTMLControlName["VALUE"]]));
712
713 if (!empty($values))
714 {
715 $clearValues = array();
716 foreach ($values as $oneValue)
717 {
718 $oneValue = (string)$oneValue;
719 if ($oneValue != '')
720 $clearValues[] = $oneValue;
721 }
722 $values = $clearValues;
723 unset($oneValue, $clearValues);
724 }
725 if (!empty($values))
726 {
727 $filtered = true;
728 $arFilter['=PROPERTY_'.$arProperty['ID']] = $values;
729 }
730 }
731
738 public static function createHighloadTableName($name)
739 {
740 $name = trim((string)$name);
741 if ($name == '')
742 return false;
743 $name = mb_substr(self::TABLE_PREFIX.$name, 0, 30);
744 return $name;
745 }
746
753 public static function GetUIFilterProperty($property, $strHTMLControlName, &$field)
754 {
755 $tableName = (string)($property['USER_TYPE_SETTINGS']['TABLE_NAME'] ?? '');
756 if ($tableName === '')
757 {
758 return;
759 }
760
761 unset($field['value']); // aftefact from \Bitrix\Iblock\Helpers\Filter\PropertyManager::getFilterFields
762
763 $hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getRow([
764 'select' => ['ID'],
765 'filter' => ['=TABLE_NAME' => $tableName],
766 ]);
767 if ($hlblock)
768 {
769 $field['type'] = 'entity_selector';
770 $field['params'] = [
771 'multiple' => 'Y',
772 'dialogOptions' => [
773 'entities' => [
774 [
775 'id' => ElementProvider::ENTITY_ID,
776 'dynamicLoad' => true,
777 'dynamicSearch' => true,
778 'options' => [
779 'highloadblockId' => $hlblock['ID'],
780 ],
781 ],
782 ],
783 'searchOptions' => [
784 'allowCreateItem' => false,
785 ],
786 ],
787 ];
788 }
789 }
790
798 private static function getEntityFieldsByFilter($tableName, $listDescr = array()): array
799 {
800 $arResult = array();
801 $tableName = (string)$tableName;
802 if (!is_array($listDescr))
803 $listDescr = array();
804 if (!empty($tableName))
805 {
806 $hlblock = static::resolveHighloadblockByTableName($tableName);
807 if ($hlblock)
808 {
809 if (!isset(self::$directoryMap[$tableName]))
810 {
811 $entity = HL\HighloadBlockTable::compileEntity($hlblock);
812 self::$hlblockClassNameCache[$tableName] = $entity->getDataClass();
813 self::$directoryMap[$tableName] = $entity->getFields();
814 unset($entity);
815 }
816 if (!isset(self::$directoryMap[$tableName]['UF_XML_ID']))
817 return $arResult;
818 $entityDataClass = self::$hlblockClassNameCache[$tableName];
819
820 $nameExist = isset(self::$directoryMap[$tableName]['UF_NAME']);
821 if (!$nameExist)
822 $listDescr['select'] = array('UF_XML_ID', 'ID');
823 $fileExists = isset(self::$directoryMap[$tableName]['UF_FILE']);
824 if ($fileExists)
825 $listDescr['select'][] = 'UF_FILE';
826
827 $sortExist = isset(self::$directoryMap[$tableName]['UF_SORT']);
828 $listDescr['order'] = array();
829 if ($sortExist)
830 {
831 $listDescr['order']['UF_SORT'] = 'ASC';
832 $listDescr['select'][] = 'UF_SORT';
833 }
834 if ($nameExist)
835 $listDescr['order']['UF_NAME'] = 'ASC';
836 else
837 $listDescr['order']['UF_XML_ID'] = 'ASC';
838 $listDescr['order']['ID'] = 'ASC';
839 $rsData = $entityDataClass::getList($listDescr);
840 while($arData = $rsData->fetch())
841 {
842 if (!$nameExist)
843 $arData['UF_NAME'] = $arData['UF_XML_ID'];
844 $arData['SORT'] = ($sortExist ? $arData['UF_SORT'] : $arData['ID']);
845 $arResult[] = $arData;
846 }
847 unset($arData, $rsData);
848 }
849 }
850
851 return $arResult;
852 }
853
854 private static function normalizeValue($value): array
855 {
856 $result = [];
857 if (!is_array($value))
858 {
859 $value = (string)$value;
860 if ($value !== '')
861 $result[] = $value;
862 }
863 else
864 {
865 if (!empty($value))
866 {
867 if (isset($value['VALUE']) && is_array($value['VALUE']))
868 {
869 $value = $value['VALUE'];
870 }
871 foreach ($value as $row)
872 {
873 $oneValue = '';
874 if (is_array($row))
875 {
876 if (isset($row['VALUE']))
877 $oneValue = (string)$row['VALUE'];
878 }
879 else
880 {
881 $oneValue = (string)$row;
882 }
883 if ($oneValue !== '')
884 $result[] = $oneValue;
885 }
886 unset($oneValue, $row);
887 }
888 }
889 return $result;
890 }
891
899 private static function getDefaultXmlId($identifier): ?string
900 {
901 $result = null;
902 $entity = HL\HighloadBlockTable::compileEntity($identifier);
903 $fields = $entity->getFields();
904 if (isset($fields['UF_DEF']) && isset($fields['UF_XML_ID']))
905 {
906 $entityClassName = $entity->getDataClass();
907
908 $select = ['ID', 'UF_XML_ID'];
909 $order = [];
910 if (isset($fields['UF_SORT']))
911 {
912 $select[] = 'UF_SORT';
913 $order['UF_SORT'] = 'ASC';
914 }
915 if (isset($fields['UF_NAME']))
916 {
917 $select[] = 'UF_NAME';
918 $order['UF_NAME'] = 'ASC';
919 }
920 $order['ID'] = 'ASC';
921
922 $iterator = $entityClassName::getList([
923 'select' => $select,
924 'filter' => ['=UF_DEF' => 1],
925 'order' => $order,
926 'limit' => 1,
927 ]);
928 $row = $iterator->fetch();
929 if (!empty($row))
930 $result = $row['UF_XML_ID'];
931 unset($row, $iterator);
932 unset($entityClassName);
933 }
934 unset($fields, $entity);
935
936 return $result;
937 }
938
939 private static function getEntityFieldsForTable($hlTableName)
940 {
941 if (!isset(self::$arFullCache[$hlTableName]))
942 {
943 self::$arFullCache[$hlTableName] = static::getEntityFieldsByFilter($hlTableName, [
944 'select' => ['UF_XML_ID', 'UF_NAME', 'ID'],
945 ]);
946 }
947
948 return self::$arFullCache[$hlTableName];
949 }
950
951 public static function GetUIEntityEditorProperty($settings, $value): array
952 {
953 $hlTableName = (string)($settings['USER_TYPE_SETTINGS']['TABLE_NAME'] ?? '');
954
955 if ($hlTableName === '')
956 {
957 return [
958 'type' => 'custom',
959 ];
960 }
961
962 $gridMode = ($settings['GRID_MODE'] ?? false) === true;
963 $hasImages = false;
964 $items = [];
965
966 foreach (static::getEntityFieldsForTable($hlTableName) as $data)
967 {
968 $item = [
969 'NAME' => $data['UF_NAME'] ?? '',
970 'TEXT' => $data['UF_NAME'] ?? '',
971 'VALUE' => $data['UF_XML_ID'],
972 'DESCRIPTION' => $data['UF_DESCRIPTION'] ?? '',
973 ];
974
975 if (isset($data['UF_FILE']) && (int)$data['UF_FILE'] >= 0)
976 {
977 $hasImages = true;
978 $item['IMAGE'] = $data['UF_FILE'];
979 }
980
981 if ($hasImages)
982 {
983 $image = \CFile::GetFileArray($data['UF_FILE']) ?: null;
984 $item['IMAGE_SRC'] = $image['SRC'];
985 if ($image)
986 {
987 if ($settings['MULTIPLE'] === 'Y')
988 {
989 $item['HTML'] = "<span class=\"catalog-multi-list-dictionary-select-icon\" style=\"background-image:url('{$image['SRC']}');\"></span> ".htmlspecialcharsbx($item['NAME']);
990 }
991 else
992 {
993 $item['NAME'] = "<span class=\"catalog-list-dictionary-select-icon\" style=\"background-image:url('{$image['SRC']}');\"></span> ".htmlspecialcharsbx($item['NAME']);
994 }
995 }
996 else
997 {
998 if ($settings['MULTIPLE'] !== 'Y')
999 {
1000 $item['NAME'] = htmlspecialcharsbx($item['NAME']);
1001 }
1002 }
1003 }
1004
1005 $items[] = $item;
1006 }
1007
1008 if ($settings['MULTIPLE'] === 'Y')
1009 {
1010 $type = 'multilist';
1011 }
1012 elseif ($hasImages && $gridMode)
1013 {
1014 $type = 'custom';
1015 }
1016 else
1017 {
1018 $type = 'list';
1019 }
1020
1021 return [
1022 'type' => $type,
1023 'data' => [
1024 'userType' => 'directory',
1025 'isHtml' => $hasImages,
1026 'items' => $items,
1027 'enableEmptyItem' => $settings['IS_REQUIRED'] === 'N',
1028 ],
1029 ];
1030 }
1031
1032 public static function GetUIEntityEditorPropertyEditHtml(array $params = []) : string
1033 {
1034 $settings = $params['SETTINGS'] ?? [];
1035 $hlTableName = (string)($settings['USER_TYPE_SETTINGS']['TABLE_NAME'] ?? '');
1036
1037 if ($hlTableName === '')
1038 {
1039 return '';
1040 }
1041
1042 $propertyId = $settings['ID'];
1043 $popupId = 'directory_popup_'.CUtil::JSEscape($propertyId);
1044
1045 $inputHtml = '';
1046 $labelHtml = '';
1047 $selectedHtml = '';
1048
1049 $entityFields = static::getEntityFieldsForTable($hlTableName);
1050
1051 if ($settings['IS_REQUIRED'] === 'N')
1052 {
1053 array_unshift($entityFields, [
1054 'UF_XML_ID' => '0',
1055 'UF_NAME' => Loc::getMessage('HIBLOCK_PROP_DIRECTORY_EMPTY_GRID_VALUE'),
1056 ]);
1057 }
1058
1059 $checkedXmlId = null;
1060
1061 foreach ($entityFields as $field)
1062 {
1063 if ($field['UF_XML_ID'] === $params['VALUE'])
1064 {
1065 $checkedXmlId = $field['UF_XML_ID'];
1066 break;
1067 }
1068 }
1069
1070 if (!$checkedXmlId && !empty($entityFields))
1071 {
1072 $checkedXmlId = reset($entityFields)['UF_XML_ID'];
1073 }
1074
1075 foreach ($entityFields as $field)
1076 {
1077 $checked = $field['UF_XML_ID'] === $checkedXmlId;
1078 $name = HtmlFilter::encode($field['UF_NAME']);
1079 $xmlId = HtmlFilter::encode($field['UF_XML_ID']);
1080
1081 $image = null;
1082 if (!empty($field['UF_FILE']))
1083 {
1084 $image = \CFile::GetFileArray($field['UF_FILE']) ?: null;
1085 }
1086
1087 if ($checked)
1088 {
1089 if (!empty($image['SRC']))
1090 {
1091 $selectedHtml .= "<span class=\"catalog-productcard-select-btn-color-icon\" style=\"background-image:url('{$image['SRC']}');\"></span>";
1092 }
1093
1094 $selectedHtml .= " <span class=\"catalog-productcard-select-param-text\">{$name}</span>";
1095 }
1096
1097 $inputName = $params['FIELD_NAME'].'_'.$params['ELEMENT_ID'];
1098 $inputId = $params['FIELD_NAME'].'_'.$xmlId.'_'.$params['ELEMENT_ID'];
1099 $checkedValue = $checked ? 'checked="checked"' : '';
1100 $inputHtml .= "<input style=\"display: none;\" type=\"radio\" name=\"$inputName\" id=\"$inputId\" value=\"$xmlId\" $checkedValue />";
1101
1102 $class = $checked ? ' selected' : '';
1103 $imageHtml = '';
1104
1105 if (!empty($image['SRC']))
1106 {
1107 $imageHtml .= "<span class=\"catalog-productcard-select-btn-color-icon\" style=\"background-image:url('{$image['SRC']}');\"></span>";
1108 }
1109
1110 $html = <<<LABEL
1111<li class="catalog-productcard-popup-select-item$class">
1112 <label for="$inputId" data-role="label_$xmlId" class="catalog-productcard-popup-select-label"
1113 onclick="selectDropDownItem(event, this, '$popupId')">
1114 $imageHtml <span class="catalog-productcard-popup-select-text">$name</span>
1115 </label>
1116</li>
1117LABEL;
1118 $labelHtml .= $html;
1119 }
1120
1121 if ($selectedHtml === '')
1122 {
1123 $selectedHtml = Loc::getMessage('HIBLOCK_PROP_DIRECTORY_EMPTY_GRID_VALUE');
1124 }
1125
1126 return <<<HTML
1127<div class="catalog-productcard-select">
1128 <div class="catalog-productcard-select-container">
1129 <div class="catalog-productcard-select-block" onclick="showDropDownPopup(event, this, '$popupId')">
1130 <div class="catalog-productcard-select-text fix" data-role="currentOption">
1131 $selectedHtml
1132 </div>
1133 <div class="catalog-productcard-select-arrow"></div>
1134 $inputHtml
1135 <div class="catalog-productcard-popup-select" data-role="dropdownContent" style="display: none">
1136 <ul class="catalog-productcard-popup-select-inner" data-propertyId="$propertyId">$labelHtml</ul>
1137 </div>
1138 </div>
1139 </div>
1140</div>
1141<script>
1142 if (!window.showDropDownPopup)
1143 {
1144 window.showDropDownPopup = function(event, element, popupId)
1145 {
1146 var popup = BX.Main.PopupManager.getPopupById("prop_directory_" + popupId);
1147 if (popup)
1148 {
1149 popup.close();
1150 return;
1151 }
1152
1153 var contentNode = BX.clone(element.querySelector('[data-role="dropdownContent"]'));
1154 var items = contentNode.querySelectorAll('label');
1155 for (var i in items)
1156 {
1157 if (items.hasOwnProperty(i))
1158 {
1159 var input = document.getElementById(items[i].getAttribute('for'));
1160 if (BX.type.isDomNode(input) && input.checked)
1161 {
1162 BX.addClass(items[i].parentNode, 'selected');
1163 }
1164 else
1165 {
1166 BX.removeClass(items[i].parentNode, 'selected');
1167 }
1168 }
1169 }
1170
1171 popup = BX.Main.PopupManager.create(
1172 "prop_directory_" + popupId,
1173 element,
1174 {
1175 cacheable: false,
1176 autoHide: true,
1177 offsetLeft: 0,
1178 padding: 0,
1179 offsetTop: 3,
1180 minWidth: 400,
1181 overlay: false,
1182 draggable: {restrict: true},
1183 closeByEsc: true,
1184 content: contentNode
1185 }
1186 );
1187 popup.show();
1188 };
1189 }
1190
1191 if (!window.selectDropDownItem)
1192 {
1193 window.selectDropDownItem = function(event, element, popupId)
1194 {
1195 var popup = BX.Main.PopupManager.getPopupById("prop_directory_" + popupId);
1196 if (popup)
1197 {
1198 var currentOption = popup.bindElement.querySelector('[data-role="currentOption"]');
1199 currentOption.innerHTML = element.innerHTML;
1200 }
1201 };
1202 }
1203</script>
1204HTML;
1205 }
1206
1207 public static function GetUIEntityEditorPropertyViewHtml(array $params = []) : string
1208 {
1209 $settings = $params['SETTINGS'] ?? [];
1210 $value = ['VALUE' => $params['VALUE'] ?? ''];
1211
1212 $viewHtml = '';
1213
1214 $dataValue = static::getExtendedValue($settings, $value);
1215 if (isset($dataValue['UF_NAME']))
1216 {
1217 $viewHtml .= '<div class="brandblock-block-wrapper">';
1218
1219 if (!empty($dataValue['UF_FILE']))
1220 {
1221 $image = \CFile::GetFileArray($dataValue['UF_FILE']);
1222 if ($image)
1223 {
1224 $viewHtml .= '<span class="brandblock-block" style="background-image:url(\'';
1225 $viewHtml .= $image['SRC'];
1226 $viewHtml .= '\');"></span>';
1227 }
1228 }
1229
1230 $viewHtml .= htmlspecialcharsbx($dataValue['UF_NAME']);
1231 $viewHtml .= '</div>';
1232 }
1233
1234 return $viewHtml;
1235 }
1236
1237 protected static function resolveHighloadblockByTableName(string $tableName): ?array
1238 {
1239 if ($tableName === '')
1240 {
1241 return null;
1242 }
1243 if (!isset(self::$hlblockCache[$tableName]))
1244 {
1245 $row = HL\HighloadBlockTable::getRow([
1246 'select' => [
1247 'TABLE_NAME',
1248 'NAME',
1249 'ID',
1250 ],
1251 'filter' => [
1252 '=TABLE_NAME' => $tableName,
1253 ],
1254 'cache' => [
1255 'ttl' => 86400,
1256 ],
1257 ]);
1258 self::$hlblockCache[$tableName] = $row ?? false;
1259 }
1260
1261 return self::$hlblockCache[$tableName] ?: null;
1262 }
1263
1264 public static function cleanCache(): void
1265 {
1266 self::$arFullCache = [];
1267 self::$arItemCache = [];
1268 self::$directoryMap = [];
1269 self::$hlblockCache = [];
1270 self::$hlblockClassNameCache = [];
1271 }
1272}
return select
Определения access_edit.php:440
$type
Определения options.php:106
if($_SERVER $defaultValue['REQUEST_METHOD']==="GET" &&!empty($RestoreDefaults) && $bizprocPerms==="W" &&check_bitrix_sessid())
Определения options.php:32
$arResult
Определения generate_coupon.php:16
Определения admin_list.php:16
static GetUIEntityEditorPropertyEditHtml(array $params=[])
Определения prop_directory.php:1032
static GetPublicViewHTML($arProperty, $value, $strHTMLControlName)
Определения prop_directory.php:608
static GetSearchContent($arProperty, $value, $strHTMLControlName)
Определения prop_directory.php:660
static PrepareSettings($arProperty)
Определения prop_directory.php:58
static GetPublicEditHTML($property, $value, $control)
Определения prop_directory.php:398
static array $hlblockClassNameCache
Определения prop_directory.php:21
static GetSettingsHTML($arProperty, $strHTMLControlName, &$arPropertyFields)
Определения prop_directory.php:136
static array $hlblockCache
Определения prop_directory.php:20
static GetExtendedValue($arProperty, $value)
Определения prop_directory.php:514
static array $arFullCache
Определения prop_directory.php:17
const TABLE_PREFIX
Определения prop_directory.php:13
static GetOptionsData($arProperty)
Определения prop_directory.php:484
static AddFilterFields($arProperty, $strHTMLControlName, &$arFilter, &$filtered)
Определения prop_directory.php:703
static GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
Определения prop_directory.php:377
static GetUserTypeDescription()
Определения prop_directory.php:28
static GetUIEntityEditorPropertyViewHtml(array $params=[])
Определения prop_directory.php:1207
static array $arItemCache
Определения prop_directory.php:18
static GetAdminListViewHTML($arProperty, $value, $strHTMLControlName)
Определения prop_directory.php:590
static createHighloadTableName($name)
Определения prop_directory.php:738
static GetUIEntityEditorProperty($settings, $value)
Определения prop_directory.php:951
static GetPublicEditHTMLMulty($property, $value, $control)
Определения prop_directory.php:421
static array $directoryMap
Определения prop_directory.php:19
static GetUIFilterProperty($property, $strHTMLControlName, &$field)
Определения prop_directory.php:753
static GetAdminFilterHTML($arProperty, $strHTMLControlName)
Определения prop_directory.php:630
static GetOptionsHtml($arProperty, $values)
Определения prop_directory.php:442
const USER_TYPE
Определения prop_directory.php:15
static Init($arExt=array(), $bReturn=false)
Определения jscore.php:66
$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
Form FILTER_ACTION disabled
Определения options.php:358
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$result
Определения get_property_values.php:14
$entity
$control
Определения iblock_catalog_edit.php:61
$select
Определения iblock_catalog_list.php:194
$inputName
Определения options.php:197
htmlspecialcharsEx($str)
Определения tools.php:2685
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$name
Определения menu_edit.php:35
$value
Определения Param.php:39
$order
Определения payment.php:8
$settings
Определения product_settings.php:43
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
lang
Определения options.php:182
font style
Определения invoice.php:442
font size
Определения invoice.php:442
</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
$width
Определения html.php:68
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$items
Определения template.php:224
$GLOBALS['_____370096793']
Определения update_client.php:1
if(file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log") &&is_file($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log") &&is_readable($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/updater.log")) $rsData
Определения update_log.php:102
$lAdmin
Определения update_log.php:25
$arFilter
Определения user_search.php:106
$iterator
Определения yandex_run.php:610
$fields
Определения yandex_run.php:501