1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
subelement.php
См. документацию.
1<?php
2
5
6IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/interface/admin_lib.php");
8
10{
11 public $list_url;
12
13 public function __construct($table_id, $by_initial = false, $order_initial = false, $by_name = "by", $ord_name = "order", $list_url = '')
14 {
15 global $APPLICATION;
16
17 parent::__construct($table_id, $by_initial, $order_initial, $by_name, $ord_name);
18 $this->list_url = trim((string)$list_url);
19 if ($this->list_url === '')
20 $this->list_url = $APPLICATION->GetCurPage();
21 }
22
23 public function Show($text, $sort_by, $alt_title = false, $baseCssClass = "")
24 {
25 $ord = "asc";
26 $class = "";
27 $title = GetMessage("admin_lib_sort_title")." ".($alt_title?$alt_title:$text);
28 if(mb_strtolower($this->field) == mb_strtolower($sort_by))
29 {
30 if(mb_strtolower($this->order) == "desc")
31 {
32 $class = "-down";
33 $title .= " ".GetMessage("admin_lib_sort_down");
34 }
35 else
36 {
37 $class = "-up";
38 $title .= " ".GetMessage("admin_lib_sort_up");
39 $ord = "desc";
40 }
41 }
42
44 $sep = (false === mb_strpos($path, '?') ? '?' : '&');
45 $url = $path.$sep.$this->by_name."=".$sort_by."&".$this->ord_name."=".($class <> ""? $ord:"");
46
47 return 'class="'.$baseCssClass.' adm-list-table-cell-sort'.$class.'" onclick="'.$this->table_id.'.Sort(\''.htmlspecialcharsbx(CUtil::addslashes($url)).'\', '.($class <> ""? "false" : "true").', arguments);" title="'.$title.'"';
48 }
49}
50
51class CAdminSubList extends CAdminList
52{
53 public const MODE_CONFIG = 'subsettings';
54/*
55 * list_url - string with params or array:
56 * LINK
57 * PARAMS (array key => value)
58 */
59
60 public $strListUrl = ''; // add
61 public $strListUrlParams = ''; // add
62 public $arListUrlParams = array(); // add
63 public $boolNew = false; // add
64 public $arFieldNames = array(); // add
65 public $arHideHeaders = array(); // add
66
67 protected $bPublicMode = false;
68
69 protected $dialogParams = array();
70 protected $requiredDialogParams = array(
71 'bxpublic' => 'Y'
72 );
73 protected $dialogButtons = array(
74 'BX.CAdminDialog.btnSave', 'BX.CAdminDialog.btnCancel'
75 );
76
83
84 public function __construct($table_id, $sort = false, $list_url = '', $arHideHeaders = false)
85 {
86 global $APPLICATION;
87
88 $this->bPublicMode = defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1;
89 $this->dialogParams['from_module'] = 'iblock';
90 $this->requiredDialogParams['sessid'] = bitrix_sessid();
91 if (!$this->bPublicMode)
92 {
93 $this->dialogParams['bxsku'] = 'Y';
94 $this->requiredDialogParams['bxshowsettings'] = 'Y';
95 }
96
97 $arJSDescr = array(
98 'js' => '/bitrix/js/iblock/subelement.js',
99 'rel' => array('admin_interface')
100 );
101 if ($this->bPublicMode)
102 $arJSDescr['css'] = '/bitrix/panel/iblock/sub-public.css';
103 else
104 $arJSDescr['css'] = '/bitrix/panel/iblock/sub-admin.css';
105
106 CJSCore::RegisterExt('subelement', $arJSDescr);
107 CJSCore::Init(array("subelement"));
108
109 $this->strListUrlParams = '';
110 $this->arListUrlParams = array();
111
112 if (is_array($list_url) && isset($list_url['LINK']))
113 {
114 $this->strListUrl = $list_url['LINK'];
115 $this->__ParseListUrl(true);
116 if (isset($list_url['PARAMS']))
117 $this->__SetListUrlParams($list_url['PARAMS']);
118 }
119 else
120 {
121 $this->strListUrl = $list_url;
122 $this->__ParseListUrl(true);
123 }
124 if ('' == $this->strListUrl)
125 {
126 $this->strListUrl = $APPLICATION->GetCurPageParam();
127 $this->__ParseListUrl(true);
128 }
129 if ($this->bPublicMode)
130 $this->__AddListUrlParams('bxpublic', 'Y');
131
132 if ($sort === false)
133 $sort = new CAdminSubSorting($table_id, 'ID', 'ASC', 'by', 'order', $this->GetListUrl(true));
134 else
135 $sort->list_url = $this->GetListUrl(true);
136
137 parent::__construct($table_id, $sort);
138
139 $this->SetBaseFieldNames();
140 if (!empty($arHideHeaders) && is_array($arHideHeaders))
141 $this->arHideHeaders = $arHideHeaders;
142 }
143
144 //TODO: remove after parent update wiil be stable
145 protected function initMode(): void
146 {
147 $this->mode = self::MODE_PAGE;
148 $mode = $this->request->get(self::MODE_FIELD_NAME);
149 if (
150 is_string($mode)
151 && (in_array(
152 $mode,
153 $this->getModeList(),
154 true
155 ))
156 )
157 {
158 $this->mode = $mode;
159 }
160 }
161
162 protected function getModeList(): array
163 {
164 return [
165 parent::MODE_LIST,
166 parent::MODE_ACTION,
167 parent::MODE_EXPORT,
168 self::MODE_CONFIG,
169 ];
170 }
171
172 public function isConfigMode(): bool
173 {
174 return $this->getCurrentMode() === self::MODE_CONFIG;
175 }
176
177 function GetListUrl($boolFull = false)
178 {
179 $boolFull = ($boolFull === true);
180 return $this->strListUrl.($boolFull && '' != $this->strListUrlParams ? '?'.$this->strListUrlParams : '');
181 }
182
183 function __UpdateListUrlParams()
184 {
185 $this->strListUrlParams = '';
186 if (!empty($this->arListUrlParams))
187 {
188 foreach ($this->arListUrlParams as $key => $value)
189 $this->strListUrlParams .= $key.'='.$value.'&';
190 unset($key, $value);
191 $this->strListUrlParams = mb_substr($this->strListUrlParams, 0, -1);
192 }
193 }
194
195 function __ClearListUrlParams()
196 {
197 $this->arListUrlParams = array();
198 $this->strListUrlParams = '';
199 }
200
201 function __AddListUrlParams($strKey, $strValue)
202 {
203 if ('' != $strKey)
204 {
205 $this->arListUrlParams[$strKey] = $strValue;
206 $this->__UpdateListUrlParams();
207 }
208 }
209
210 function __DeleteListUrlParams($mxKey)
211 {
212 if (is_array($mxKey))
213 {
214 foreach ($mxKey as $value)
215 if ('' != $value && array_key_exists($value,$this->arListUrlParams))
216 unset($this->arListUrlParams[$value]);
217 }
218 elseif ('' != $mxKey && array_key_exists($mxKey,$this->arListUrlParams))
219 {
220 unset($this->arListUrlParams[$mxKey]);
221 }
222 $this->__UpdateListUrlParams();
223 }
224
225 function __SetListUrlParams($mxParams,$boolClear = false)
226 {
227 $boolClear = ($boolClear === true);
228 if ($boolClear)
229 $this->arListUrlParams = array();
230 if (!is_array($mxParams))
231 {
232 $arParams = array();
233 parse_str($mxParams, $arParams);
234 $mxParams = (is_array($arParams) ? $arParams : array());
235 }
236 foreach ($mxParams as $key => $value)
237 if ('' != $key)
238 $this->arListUrlParams[$key] = $value;
239
240 $this->__UpdateListUrlParams();
241 }
242
243 function __ParseListUrl($boolClear = false)
244 {
245 $mxPos = mb_strpos($this->strListUrl, '?');
246 if (false !== $mxPos)
247 {
248 $this->__SetListUrlParams(mb_substr($this->strListUrl, $mxPos + 1), $boolClear);
249 $this->strListUrl = mb_substr($this->strListUrl, 0, $mxPos);
250 }
251 }
252
253 function AddHideHeader($strID)
254 {
255 $strID = trim($strID);
256 if ('' != $strID)
257 {
258 if (!in_array($strID, $this->arHideHeaders))
259 $this->arHideHeaders[] = $strID;
260 }
261 }
262
263 //id, name, content, sort, default
264 public function AddHeaders($aParams)
265 {
266 $showAll = $this->request->get('showallcol');
267 if ($showAll !== null && $showAll !== '')
268 {
269 $this->session['SHALL'] = $showAll === 'Y';
270 }
271 $showAll = isset($this->session['SHALL']) && $this->session['SHALL'];
272
273 $hiddenColumns = (!empty($this->arHideHeaders) ? array_fill_keys($this->arHideHeaders, true) : array());
274
275 $aOptions = CUserOptions::GetOption("list", $this->table_id, array());
276 if (!is_array($aOptions))
277 {
278 $aOptions = [];
279 }
280
281 $aColsTmp = explode(",", $aOptions["columns"] ?? '');
282 $aCols = array();
283 $userColumns = array();
284
285 foreach($aColsTmp as $col)
286 {
287 $col = trim($col);
288 if ($col != '' && !isset($hiddenColumns[$col]))
289 {
290 $aCols[] = $col;
291 $userColumns[$col] = true;
292 }
293 }
294
295 $bEmptyCols = empty($aCols);
296 $userVisibleColumns = array();
297 foreach ($aParams as $param)
298 {
299 $param["__sort"] = -1;
300 $param['default'] ??= false;
301 if (!isset($hiddenColumns[$param["id"]]))
302 {
303 $this->aHeaders[$param["id"]] = $param;
304 if (
305 $showAll
306 || ($bEmptyCols && ($param["default"] === true))
307 || isset($userColumns[$param["id"]])
308 )
309 {
310 $this->arVisibleColumns[] = $param["id"];
311 $userVisibleColumns[$param["id"]] = true;
312 }
313 }
314 }
315 unset($userColumns);
316
317 $aAllCols = ($this->isConfigMode() ? $this->aHeaders : null);
318
319 if(!$bEmptyCols)
320 {
321 foreach ($aCols as $i => $col)
322 if (isset($this->aHeaders[$col]))
323 $this->aHeaders[$col]["__sort"] = $i;
324 Main\Type\Collection::sortByColumn($this->aHeaders, array('__sort' => SORT_ASC), '', null, true);
325 }
326
327 foreach($this->aHeaders as $id=>$arHeader)
328 {
329 if (isset($userVisibleColumns[$id]) && !isset($hiddenColumns[$id]))
330 $this->aVisibleHeaders[$id] = $arHeader;
331 }
332 unset($userVisibleColumns, $hiddenColumns);
333
334 if ($this->isConfigMode())
335 {
336 $this->ShowSettings($aAllCols, $aCols, $aOptions);
337 }
338 }
339
340 public function AddVisibleHeaderColumn($id)
341 {
342 if (!in_array($id, $this->arVisibleColumns) && !in_array($id,$this->arHideHeaders))
343 $this->arVisibleColumns[] = $id;
344 }
345
346 protected function GetSystemContextMenu(array $config = []): array
347 {
348 $result = [];
349
350 if (isset($config['settings']))
351 {
352 $this->__AddListUrlParams(parent::MODE_FIELD_NAME,self::MODE_CONFIG);
353 $result[] = [
354 "TEXT" => GetMessage("admin_lib_context_sett"),
355 "TITLE" => GetMessage("admin_lib_context_sett_title"),
356 "ONCLICK" => $this->table_id.".ShowSettings('".CUtil::JSEscape($this->GetListUrl(true))."')",
357 "ICON" => "btn_sub_settings",
358 ];
359 $this->__DeleteListUrlParams('mode');
360 }
361 if (isset($config['excel']))
362 {
363 $this->__AddListUrlParams(parent::MODE_FIELD_NAME,parent::MODE_EXPORT);
364 $result[] = [
365 "TEXT" => "Excel",
366 "TITLE" => GetMessage("admin_lib_excel"),
367 "ONCLICK" => "location.href='".htmlspecialcharsbx($this->GetListUrl(true))."'",
368 "ICON" => "btn_sub_excel",
369 ];
370 $this->__DeleteListUrlParams('mode');
371 }
372 return $result;
373 }
374
375 protected function InitContextMenu(array $menu = [], array $additional = []): void
376 {
377 if (!empty($menu) || !empty($additional))
378 {
379 $this->context = new CAdminSubContextMenuList($menu, $additional);
380 }
381 }
382
388 public function IsGroupActionToAll()
389 {
390 return (isset($_REQUEST['action_sub_target']) && $_REQUEST['action_sub_target'] === 'selected');
391 }
392
396 protected function GetGroupIds()
397 {
398 $result = null;
399 if (isset($_REQUEST['SUB_ID']))
400 {
401 $result = (!is_array($_REQUEST['SUB_ID']) ? array($_REQUEST['SUB_ID']) : $_REQUEST['SUB_ID']);
402 }
403 return $result;
404 }
405
406 public function ActionPost($url = false, $action_name = false, $action_value = 'Y')
407 {
408 return $this->table_id.".FormSubmit();";
409 }
410
411 public function ActionDoGroup($id, $action_id, $add_params='')
412 {
413 $strParams = "SUB_ID=".urlencode($id)
414 ."&action=".urlencode($action_id)
415 ."&lang=".urlencode(LANGUAGE_ID)
416 ."&".bitrix_sessid_get()
417 .($add_params<>""? "&".$add_params: "")
418 ;
419 $strUrl = $this->GetListUrl(true).('' != $this->strListUrlParams ? '&' : '?').$strParams;
420 return $this->table_id.".GetAdminList('".CUtil::JSEscape($strUrl)."');";
421 }
422
423 public function &AddRow($id = false, $arRes = array(), $link = false, $title = false, $boolBX = false)
424 {
425 $row = new CAdminSubListRow($this->aHeaders, $this->table_id);
426 $row->id = $id;
427 $row->arRes = $arRes;
428 $row->link = $link;
429 $row->title = $title;
430 $row->pList = &$this;
431 $row->boolBX = $boolBX;
432
433 if($id)
434 {
435 if($this->bEditMode && in_array($id, $this->arEditedRows))
436 $row->bEditMode = true;
437 elseif(!empty($this->arUpdateErrorIDs) && in_array($id, $this->arUpdateErrorIDs))
438 $row->bEditMode = true;
439 }
440
441 $this->aRows[] = &$row;
442 return $row;
443 }
444
445 public function Display()
446 {
447 foreach(GetModuleEvents("main", "OnAdminSubListDisplay", true) as $arEvent)
448 ExecuteModuleEventEx($arEvent, array(&$this));
449
450 // Check after event handlers
451 if (!is_array($this->arActions))
452 {
453 $this->arActions = [];
454 }
455 if (!is_array($this->arActionsParams))
456 {
457 $this->arActionsParams = [];
458 }
459
460 echo '<div id="form_'.$this->table_id.'" class="adm-sublist">';
461
462 if($this->bEditMode && !$this->bCanBeEdited)
463 $this->bEditMode = false;
464
465 $boolCloseMessage = true;
466 $errmsg = '';
467 foreach ($this->arFilterErrors as $err)
468 $errmsg .= ($errmsg<>''? '<br>': '').$err;
469 foreach ($this->arUpdateErrors as $err)
470 $errmsg .= ($errmsg<>''? '<br>': '').$err[0];
471 foreach ($this->arGroupErrors as $err)
472 $errmsg .= ($errmsg<>''? '<br>': '').$err[0];
473 if($errmsg<>'')
474 {
475 CAdminSubMessage::ShowMessage(array("MESSAGE"=>GetMessage("admin_lib_error"), "DETAILS"=>$errmsg, "TYPE"=>"ERROR"));
476 $boolCloseMessage = false;
477 }
478
479 $successMessage = '';
480 for ($i = 0, $cnt = count($this->arActionSuccess); $i < $cnt; $i++)
481 $successMessage .= ($successMessage != '' ? '<br>' : '').$this->arActionSuccess[$i];
482 if ($successMessage != '')
483 {
484 CAdminSubMessage::ShowMessage(array("MESSAGE" => GetMessage("admin_lib_success"), "DETAILS" => $successMessage, "TYPE" => "OK"));
485 $boolCloseMessage = false;
486 }
487
488 if ($this->bPublicMode && $boolCloseMessage)
489 {
490 echo '<script>top.BX.WindowManager.Get().hideNotify();</script>';
491 }
492
493 echo $this->sPrologContent;
494
495 if($this->sContent===false)
496 {
497 echo '<div class="adm-list-table-wrap'.($this->context ? '' : ' adm-list-table-without-header').(empty($this->arActions) && !$this->bCanBeEdited ? ' adm-list-table-without-footer' : '').'">';
498 }
499
500 if ($this->context)
501 $this->context->Show();
502
504 echo bitrix_sessid_post();
505
506 if($this->sContent!==false)
507 {
508 echo $this->sContent;
509 return;
510 }
511
512 $bShowSelectAll = (!empty($this->arActions) || $this->bCanBeEdited);
513
514 $this->bShowActions = false;
515 foreach($this->aRows as $row)
516 {
517 if(!empty($row->aActions))
518 {
519 $this->bShowActions = true;
520 break;
521 }
522 }
523
524 $colSpan = 0;
525
526echo '<table class="adm-list-table" id="'.$this->table_id.'">
527 <thead>
528 <tr class="adm-list-table-header">';
529
530 if($bShowSelectAll)
531 {
532 echo '<td class="adm-list-table-cell adm-list-table-checkbox" onclick="this.firstChild.firstChild.click(); return BX.PreventDefault(event);"><div class="adm-list-table-cell-inner"><input class="adm-checkbox adm-designed-checkbox" type="checkbox" id="'.$this->table_id.'_check_all" '.($this->bEditMode ? 'disabled' : 'onclick="'.$this->table_id.'.SelectAllRows(this); return BX.eventCancelBubble(event);"').' title="'.GetMessage("admin_lib_list_check_all").'" /><label for="'.$this->table_id.'_check_all" class="adm-designed-checkbox-label"></label></div></td>';
533 $colSpan++;
534 }
535 if($this->bShowActions)
536 {
537 echo '<td class="adm-list-table-cell adm-list-table-popup-block" title="'.GetMessage("admin_lib_list_act").'"><div class="adm-list-table-cell-inner"></div></td>';
538 $colSpan++;
539 }
540 foreach($this->aHeaders as $column_id=>$header)
541 {
542 if(!in_array($column_id, $this->arVisibleColumns))
543 continue;
544
545 $header['title'] = (string)($header['title'] ?? '');
546 $bSort = $this->sort && !empty($header["sort"]);
547
548 if ($bSort)
549 {
550 $attrs = $this->sort->Show(
551 $header["content"],
552 $header["sort"],
553 $header["title"],
554 "adm-list-table-cell"
555 );
556 }
557 else
558 {
559 $attrs = 'class="adm-list-table-cell"';
560 }
561
562
563 echo '<td '.$attrs.'>
564 <div class="adm-list-table-cell-inner">'.$header["content"].'</div>'.($bSort ? '<span class="adm-sub-sort"></span>' : '').'
565 </td>';
566
567 $colSpan++;
568 }
569 echo '</tr></thead><tbody>';
570
571 if (!empty($this->aRows))
572 {
573 foreach ($this->aRows as &$row)
574 $row->Display();
575 unset($row);
576 }
577 elseif (!empty($this->aHeaders))
578 {
579 echo '<tr><td colspan="'.$colSpan.'" class="adm-list-table-cell adm-list-table-empty">'.GetMessage("admin_lib_no_data").'</td></tr>';
580 }
581
582 echo '</tbody></table>';
583
584 $this->ShowActionTable();
585
586 echo $this->sEpilogContent;
587 echo '</div>';
588 echo $this->sNavText;
589 }
590
591 public function ShowActionTable()
592 {
593 if (empty($this->arActions) && !$this->bCanBeEdited)
594 return;
595?>
596<div class="adm-list-table-footer" id="<?=$this->table_id?>_footer<?=$this->bEditMode || !empty($this->arUpdateErrorIDs) ? '_edit' : ''?>">
597 <input type="hidden" name="action_button" id="<?=$this->table_id; ?>_action_button" value="" />
598<?
599 if($this->bEditMode || !empty($this->arUpdateErrorIDs))
600 {
601 $this->DisplayEditButtons();
602 }
603 else
604 {
605 $showAll = true;
606 if (isset($this->arActionsParams["disable_action_target"]) && $this->arActionsParams["disable_action_target"] === true)
607 $showAll = false;
608 elseif (isset($this->arActionsParams["disable_action_sub_target"]) && $this->arActionsParams["disable_action_sub_target"] === true)
609 $showAll = false;
610 if ($showAll)
611 {
612?>
613 <span class="adm-selectall-wrap"><input type="checkbox" class="adm-checkbox adm-designed-checkbox" name="action_sub_target" id="<?=$this->table_id;?>_action_sub_target" value="selected" onclick="if(this.checked && !confirm('<?=CUtil::JSEscape(GetMessage("admin_lib_list_edit_for_all_warn"));?>')) {this.checked=false;} <?=$this->table_id;?>.EnableActions();" title="<?=GetMessage("admin_lib_list_edit_for_all");?>" /><label title="<?=GetMessage("admin_lib_list_edit_for_all");?>" for="action_sub_target" class="adm-checkbox-label"><?=GetMessage("admin_lib_list_for_all");?></label></span>
614<?
615 }
616 $this->bCanBeDeleted = array_key_exists("delete", $this->arActions);
617
618 if ($this->bCanBeEdited || $this->bCanBeDeleted)
619 {
620 echo '
621 <span class="adm-table-item-edit-wrap'.(!$this->bCanBeEdited || !$this->bCanBeDeleted ? ' adm-table-item-edit-single' : '').'">';
622 if($this->bCanBeEdited):
623 echo '<a href="javascript:void(0)" class="adm-table-btn-edit adm-edit-disable" hidefocus="true" onclick="this.blur();if('.$this->table_id.'.IsActionEnabled(\'edit\')){BX(\''.$this->table_id.'_action_button\').value=\'edit\'; '.htmlspecialcharsbx($this->ActionPost()).'}" title="'.GetMessage("admin_lib_list_edit").'" id="'.$this->table_id.'_action_edit_button"></a>';
624 endif;
625 if($this->bCanBeDeleted):
626 echo '<a href="javascript:void(0);" class="adm-table-btn-delete adm-edit-disable" hidefocus="true" onclick="this.blur();if('.$this->table_id.'.IsActionEnabled() && confirm((BX(\'action_sub_target\') && BX(\'action_sub_target\').checked ? \''.GetMessage("admin_lib_list_del").'\':\''.GetMessage("admin_lib_list_del_sel").'\'))) {BX(\''.$this->table_id.'_action_button\').value=\'delete\'; '.htmlspecialcharsbx($this->ActionPost()).'}" title="'.GetMessage("admin_lib_list_del_title").'" class="context-button icon action-delete-button-dis" id="'.$this->table_id.'_action_delete_button"></a>';
627 endif;
628 echo '</span>';
629 }
630
631 $onchange = '';
632 if (isset($this->arActionsParams["select_onchange"]))
633 {
634 if (is_array($this->arActionsParams["select_onchange"]))
635 {
636 $onchange = implode(' ', $this->arActionsParams["select_onchange"]);
637 }
638 elseif (is_string($this->arActionsParams["select_onchange"]))
639 {
640 $onchange = $this->arActionsParams["select_onchange"];
641 }
642 }
643 $blockMap = [];
644
645 $list = '';
646 $html = '';
647 $buttons = '';
648 $actionList = array_filter($this->arActions);
649 if (isset($actionList['delete']))
650 {
651 unset($actionList['delete']);
652 }
653
654 $allowedTypes = [
655 'button' => true,
656 'html' => true,
657 'multicontrol' => true
658 ];
659
660 foreach($actionList as $k=>$v)
661 {
662 if(is_array($v))
663 {
664 if (isset($v['type']) && isset($allowedTypes[$v['type']]))
665 {
666 switch ($v["type"])
667 {
668 case 'button':
669 $buttons .= '<input type="button" name="" value="'.htmlspecialcharsbx($v['name']).'" onclick="'.(!empty($v["action"])? htmlspecialcharsbx($v['action']) : 'document.getElementById(\''.$this->table_id.'_action_button\').value=\''.htmlspecialcharsbx($v["value"]).'\'; '.htmlspecialcharsbx($this->ActionPost()).'').'" title="'.htmlspecialcharsbx($v["title"]).'" />';
670 break;
671 case 'html':
672 $html .= '<span class="adm-list-footer-ext">'.$v["value"].'</span>';
673 break;
674 case 'multicontrol':
675 $data = $this->prepareGroupMultiControl($k, $v);
676 if (!empty($data))
677 {
678 $list .= $data['ITEM'];
679 if (isset($data['BLOCK']))
680 {
681 $html .= '<span class="adm-list-footer-ext">'.$data['BLOCK'].'</span>';
682 }
683 if (isset($data['ACTION']))
684 {
685 $blockMap[] = $data['ACTION'];
686 }
687 }
688 break;
689 }
690 }
691 else
692 {
693 $list .= '<option value="'.htmlspecialcharsbx($v['value']).'"'.($v['action']?' custom_action="'.htmlspecialcharsbx($v['action']).'"':'').'>'.htmlspecialcharsex($v['name']).'</option>';
694 }
695 }
696 else
697 {
698 $list .= '<option value="'.htmlspecialcharsbx($k).'">'.htmlspecialcharsex($v).'</option>';
699 }
700 }
701 unset($actionList, $k, $v);
702 unset($allowedTypes);
703
704 if ($buttons != '')
705 echo '<span class="adm-list-footer-ext">'.$buttons.'</span>';
706
707 if ($list != ''):
708?>
709 <span class="adm-select-wrap">
710 <select name="action" id="<?=$this->table_id.'_action'; ?>" class="adm-select"<?=($onchange != '' ? ' onchange="'.htmlspecialcharsbx($onchange).'"':'')?> <?
711 if (!empty($blockMap))
712 {
713?>
714 data-actions="<?=htmlspecialcharsbx(Main\Web\Json::encode($blockMap)); ?>" data-use-actions="Y"
715<?
716 }
717 ?>>
718 <option value=""><?=GetMessage("admin_lib_list_actions")?></option>
719<?=$list?>
720 </select>
721 </span>
722<?
723 if ($html != '')
724 echo $html;
725?>
726 <input type="button" name="apply_sub" id="<?=$this->table_id;?>_apply_sub_button" value="<?=GetMessage("admin_lib_list_apply");?>" onclick="<?=$this->table_id;?>.ExecuteFormAction('ACTION_BUTTON');" disabled="disabled" class="adm-table-action-button" />
727<?
728 endif;
729?>
730 <span class="adm-table-counter" id="<?=$this->table_id?>_selected_count"><?=GetMessage('admin_lib_checked')?>: <span>0</span></span>
731<?
732 }
733?>
734</div>
735<?
736 }
737
738 public function DisplayList($arParams = array())
739 {
740 $menu = new CAdminPopup($this->table_id."_menu", $this->table_id."_menu",false,array('zIndex' => 4000));
741 $menu->Show();
742
743 $tbl = CUtil::JSEscape($this->table_id);
744 $aUserOpt = CUserOptions::GetOption("global", "settings");
745 if (!is_array($aUserOpt))
746 {
747 $aUserOpt = [];
748 }
749 $aUserOpt['context_ctrl'] = (string)($aUserOpt['context_ctrl'] ?? 'N');
750 echo '
751<script>
752var '.$this->table_id.'= new BX.adminSubList("'.$tbl.'", {context_ctrl: '.($aUserOpt["context_ctrl"] === "Y"? "true":"false").'}, "'.$this->GetListUrl(true).'");
753function ReloadSubList()
754{
755 '.$this->ActionAjaxReload($this->GetListUrl(true)).'
756}
757function ReloadOffers()
758{
759 ReloadSubList();
760}
761</script>
762';
763 echo '<div id="'.$this->table_id.'_result_div">';
764 $this->Display();
765 echo '</div>';
766 }
767
768 public function CheckListMode()
769 {
770 global $APPLICATION;
771
772 if ($this->isPageMode())
773 {
774 return;
775 }
776
777 if ($this->isAjaxMode())
778 {
779 ob_start();
780 $this->Display();
781 $string = ob_get_contents();
782 ob_end_clean();
783
784 if ($this->isActionMode())
785 {
786 echo '<html><head></head><body>
787<div id="'.$this->table_id.'_result_frame_div">'.$string.'</div>
788<script>
789';
790 if($this->bEditMode || count($this->arUpdateErrorIDs)>0)
791 echo $this->table_id.'._DeActivateMainForm();';
792 else
793 echo $this->table_id.'._ActivateMainForm();';
794
795 if($this->onLoadScript)
796 echo 'w.eval(\''.CUtil::JSEscape($this->onLoadScript).'\');';
797 echo '</script></body></html>';
798 }
799 else
800 {
801 if($this->onLoadScript)
802 echo '<script>'.$this->onLoadScript.'</script>';
803 echo $string;
804 }
805 define("ADMIN_AJAX_MODE", true);
806 require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_after.php");
807 die();
808 }
809 elseif ($this->isExportMode())
810 {
811 $fname = basename($APPLICATION->GetCurPage(), ".php");
812 // http response splitting defence
813 $fname = str_replace(array("\r", "\n"), "", $fname);
814
815 header("Content-Type: application/vnd.ms-excel");
816 header("Content-Disposition: filename=".$fname.".xls");
817 $APPLICATION->EndBufferContentMan();
818 $this->DisplayExcel();
819 require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_after.php");
820 die();
821 }
822 }
823
824 function SetBaseFieldNames()
825 {
826 $this->arFieldNames = array(
827 array(
828 'NAME' => 'SESSID',
829 'TYPE' => 'HIDDEN',
830 ),
831 );
832 }
833
834 function AddListFieldNames()
835 {
836 $this->arFieldNames[] = array(
837 'NAME' => 'ACTION_BUTTON',
838 'TYPE' => 'HIDDEN',
839 );
840 $this->arFieldNames[] = array(
841 'NAME' => 'SUB_ID[]',
842 'TYPE' => 'CHECKBOX',
843 );
844 }
845
846 function SetListFieldNames($boolClear = true)
847 {
848 $boolClear = ($boolClear === true);
849 if ($boolClear)
850 $this->SetBaseFieldNames();
851 $this->AddListFieldNames();
852 }
853
854 function DeleteFieldNames($arList = array())
855 {
856 if (false == is_array($arList))
857 $arList = array();
858 if (false == empty($arList))
859 {
860 $arTempo = array();
861 foreach ($this->arFieldNames as $arName)
862 {
863 if (!in_array($arName['NAME'],$arList))
864 $arTempo[] = $arName;
865 }
866 $this->arFieldNames = $arTempo;
867 unset($arTempo);
868 }
869 }
870
871 function GetListFieldNames()
872 {
873 return $this->arFieldNames;
874 }
875
876 function AddFieldNames($strFieldName, $strFieldType)
877 {
878
879 }
880
881 public function setDialogParams($params)
882 {
883 if (!is_array($params))
884 return;
885 $this->dialogParams = $params;
886 }
887
888 public function getDialogParams($withRequired = false)
889 {
890 $withRequired = ($withRequired === true);
891 $result = $this->dialogParams;
892 if ($withRequired)
893 {
894 foreach ($this->requiredDialogParams as $key => $value)
895 $result[$key] = $value;
896 unset($key, $value);
897 }
898 return $result;
899 }
900
901 public function setDialogButtons($buttons)
902 {
903 if (!is_array($buttons))
904 return;
905 $this->dialogButtons = $buttons;
906 }
907
908 public function setReadDialogButtons(): void
909 {
910 $this->setDialogButtons(['BX.CAdminDialog.btnCancel']);
911 }
912
913 public function getDialogButtons($jsFormat = false)
914 {
915 $jsFormat = ($jsFormat === true);
916 if ($jsFormat)
917 {
918 return '['.implode(", \r\n", $this->dialogButtons).']';
919 }
920 else
921 {
922 return $this->dialogButtons;
923 }
924 }
925
926 public function getRowAction($url)
927 {
928 return "(new BX.CAdminDialog({
929 'content_url': '".$url."',
930 'content_post': ".CUtil::PhpToJSObject($this->getDialogParams(true), false, true, true).",
931 'draggable': true,
932 'resizable': true,
933 'width': 900,
934 'height': 600,
935 'buttons': ".$this->getDialogButtons(true)."
936 })).Show();";
937 }
938
939 protected function DisplayEditButtons(): void
940 {
941?>
942 <input type="button" name="save_sub" id="<?=$this->table_id;?>_save_sub_button" value="<?=GetMessage("admin_lib_list_edit_save");?>." title="<?=GetMessage("admin_lib_list_edit_save_title");?>" onclick="<?=$this->table_id;?>.ExecuteFormAction('SAVE_BUTTON');" />
943 <input type="button" name="cancel_sub" id="<?=$this->table_id;?>_cancel_sub_button" value="<?=GetMessage("admin_lib_list_edit_cancel");?>" title="<?=GetMessage("admin_lib_list_edit_cancel_title");?>" onclick="<?=$this->ActionAjaxReload($this->GetListUrl(true));?>"/>
944<?
945 }
946
947 private function prepareGroupMultiControl(string $id, array $action)
948 {
949 $result = null;
950
951 if (empty($action['action']) || !is_array($action['action']))
952 return $result;
953
954 $subBlocks = $this->compileActions($action['action']);
955
956 $result = [
957 'ITEM' => '<option value="'.htmlspecialcharsbx($id).'">'.htmlspecialcharsex($action['name']).'</option>'
958 ];
959 if (!empty($subBlocks))
960 {
961 $actionBlockId = $id.'_block';
962
963 $result['BLOCK'] = '<div id="'.htmlspecialcharsbx($actionBlockId).'" style="display: none;">'.
964 implode('', $subBlocks).
965 '</div>';
966
967 $result['ACTION'] = [
968 'VALUE' => $id,
969 'BLOCK' => $actionBlockId
970 ];
971 }
972
973 return $result;
974 }
975
976 private function createGroupSubControl(array $data)
977 {
978 $result = [];
979
980 foreach ($data as $row)
981 {
982 if (empty($row) || !is_array($row) || !isset($row['TYPE']))
983 continue;
984 $item = null;
985 switch ($row['TYPE'])
986 {
987 case Main\Grid\Panel\Types::DROPDOWN:
988 $item = $this->createGroupSubControlDropdown($row);
989 break;
990 case Main\Grid\Panel\Types::TEXT:
991 $item = $this->createGroupSubControlText($row);
992 break;
993 }
994 if (!empty($item))
995 $result[] = $item;
996 unset($item);
997 }
998
999 return (!empty($result) ? $result: null);
1000 }
1001
1006 private function compileActions(array $actions)
1007 {
1008 $result = [];
1009 foreach ($actions as $row)
1010 {
1011 if (empty($row) || !is_array($row))
1012 continue;
1013 if (!isset($row['ACTION']))
1014 continue;
1015 switch ($row['ACTION'])
1016 {
1017 case Main\Grid\Panel\Actions::CREATE:
1018 if (!empty($row['DATA']) && is_array($row['DATA']))
1019 {
1020 $subControl = $this->createGroupSubControl($row['DATA']);
1021 if (!empty($subControl))
1022 {
1023 $result = array_merge($result, $subControl);
1024 }
1025 unset($subControl);
1026 }
1027 break;
1028 }
1029 }
1030 unset($row);
1031 return $result;
1032 }
1033
1034 private function createGroupSubControlDropdown(array $data)
1035 {
1036 $result = null;
1037 if (!isset($data['ID']) || !isset($data['NAME']))
1038 return $result;
1039 if (empty($data['ITEMS']) || !is_array($data['ITEMS']))
1040 return $result;
1041
1042 $items = [];
1043 $subBlocks = [];
1044 $blockMap = [];
1045 $first = true;
1046
1047 foreach ($data['ITEMS'] as $row)
1048 {
1049 if (!isset($row['VALUE']) || !isset($row['NAME']))
1050 continue;
1051
1052 if (!empty($row['ONCHANGE']) && is_array($row['ONCHANGE']))
1053 {
1054 $itemBlocks = $this->compileActions($row['ONCHANGE']);
1055 if (!empty($itemBlocks))
1056 {
1057 $itemBlockId = $data['ID'].'_'.$row['VALUE'].'_block';
1058 $subBlocks[] = '<span class="adm-list-footer-ext"><div id="'.htmlspecialcharsbx($itemBlockId).'" style="display: '.($first ? 'inline-block' : 'none').';">'.
1059 implode('', $itemBlocks).
1060 '</div></span>';
1061 $blockMap[] = [
1062 'VALUE' => $row['VALUE'],
1063 'BLOCK' => $itemBlockId
1064 ];
1065 }
1066 unset($itemBlocks);
1067 }
1068
1069 $items[] = '<option value="'.htmlspecialcharsbx($row['VALUE']).'">'.
1070 htmlspecialcharsex($row['NAME']).
1071 '</option>';
1072
1073 $first = false;
1074 }
1075 unset($row);
1076
1077 if (!empty($items))
1078 {
1079 $result = '<select id="'.htmlspecialcharsbx($data['ID']).'" '.
1080 'name="'.htmlspecialcharsbx($data['NAME']).'"'.
1081 (!empty($blockMap) ? ' data-actions="'.htmlspecialcharsbx(Main\Web\Json::encode($blockMap)).'" data-use-actions="Y"' : '').
1082 'data-action-item="Y" '.
1083 '>';
1084 $result .= implode('', $items);
1085 $result .= '</select>';
1086 if (!empty($subBlocks))
1087 {
1088 $result .= implode('', $subBlocks);
1089 }
1090 }
1091 unset($items);
1092
1093 return $result;
1094 }
1095
1100 private function createGroupSubControlText(array $data)
1101 {
1102 if (!isset($data['ID']) || !isset($data['NAME']))
1103 return null;
1104 return '<span class="adm-input-text-wrap"><input type="text" id="'.htmlspecialcharsbx($data['ID']).'" '.
1105 'name="'.htmlspecialcharsbx($data['NAME']).'" '.
1106 'data-action-item="Y" '.
1107 'value=""></span>';
1108 }
1109}
1110
1111class CAdminSubListRow extends CAdminListRow
1112{
1114 var $pList;
1115
1116 public $arFieldNames = array(); //add
1117 public $boolBX = false; // add
1118
1119 public function __construct($aHeaders,$table_id)
1120 {
1121 parent::__construct($aHeaders,$table_id);
1122 }
1123
1124 public function Display()
1125 {
1126 $sDefAction = $sDefTitle = "";
1127 if (!$this->bEditMode)
1128 {
1129 if (!empty($this->link))
1130 {
1131 if (true == $this->boolBX)
1132 $sDefAction = $this->pList->getRowAction($this->link);
1133 else
1134 $sDefAction = "BX.adminPanel.Redirect([], '".CUtil::JSEscape($this->link)."', event);";
1135 $sDefTitle = $this->title;
1136 }
1137 else
1138 {
1139 foreach ($this->aActions as $action)
1140 if ($action["DEFAULT"] == true)
1141 {
1142 if (true == $this->boolBX)
1143 $sDefAction = $this->pList->getRowAction(CUtil::addslashes($action["ACTION"]));
1144 else
1145 $sDefAction = $action["ACTION"]
1146 ? htmlspecialcharsbx($action["ACTION"])
1147 : "BX.adminPanel.Redirect([], '".CUtil::JSEscape($action["LINK"])."', event)"
1148 ;
1149 $sDefTitle = (!empty($action["TITLE"])? $action["TITLE"]:$action["TEXT"]);
1150 break;
1151 }
1152 }
1153
1154 $sDefAction = htmlspecialcharsbx($sDefAction);
1155 $sDefTitle = htmlspecialcharsbx($sDefTitle);
1156 }
1157
1158 $sMenuItems = '';
1159 if(!empty($this->aActions))
1160 $sMenuItems = htmlspecialcharsbx(CAdminPopup::PhpToJavaScript($this->aActions));
1161
1162?>
1163<tr class="adm-list-table-row<?=(isset($this->aFeatures["footer"]) && $this->aFeatures["footer"] == true? ' footer':'')?><?=$this->bEditMode?' adm-table-row-active' : ''?>"<?=($sMenuItems <> "" ? ' oncontextmenu="return '.$sMenuItems.';"':'');?><?=($sDefAction <> ""? ' ondblclick="'.$sDefAction.'"'.(!empty($sDefTitle)? ' title="'.GetMessage("admin_lib_list_double_click").' '.$sDefTitle.'"':''):'')?>>
1164<?
1165
1166 if (!empty($this->pList->arActions) || $this->pList->bCanBeEdited):
1167 $check_id = RandString(5);
1168?>
1169 <td class="adm-list-table-cell adm-list-table-checkbox adm-list-table-checkbox-hover<?=$this->bReadOnly? ' adm-list-table-checkbox-disabled':''?>"><input type="checkbox" class="adm-checkbox adm-designed-checkbox" name="SUB_ID[]" id="<?=$this->table_id."_".$this->id."_".$check_id;?>" value="<?=$this->id?>" autocomplete="off" title="<?=GetMessage("admin_lib_list_check")?>"<?=$this->bReadOnly? ' disabled="disabled"':''?><?=$this->bEditMode ? ' checked="checked" disabled="disabled"' : ''?> /><label class="adm-designed-checkbox-label adm-checkbox" for="<?=$this->table_id."_".$this->id."_".$check_id;?>"></label></td>
1170<?
1171 endif;
1172
1173 if($this->pList->bShowActions):
1174 if(!empty($this->aActions)):
1175?>
1176 <td class="adm-list-table-cell adm-list-table-popup-block" onclick="BX.adminSubList.ShowMenu(this.firstChild, this.parentNode.oncontextmenu(), this.parentNode);"><div class="adm-list-table-popup" title="<?=GetMessage("admin_lib_list_actions_title")?>"></div></td>
1177<?
1178 else:
1179?>
1180 <td class="adm-list-table-cell"></td>
1181<?
1182 endif;
1183 endif;
1184
1185 end($this->pList->aVisibleHeaders);
1186 $last_id = key($this->pList->aVisibleHeaders);
1187 reset($this->pList->aVisibleHeaders);
1188
1189 $bVarsFromForm = ($this->bEditMode && is_array($this->pList->arUpdateErrorIDs) && in_array($this->id, $this->pList->arUpdateErrorIDs));
1190 foreach($this->pList->aVisibleHeaders as $id=>$header_props)
1191 {
1192 $field = $this->aFields[$id] ?? [];
1193 if ($this->bEditMode && isset($field["edit"]))
1194 {
1195 if ($bVarsFromForm && isset($_REQUEST["FIELDS"]))
1196 {
1197 $val = $_REQUEST["FIELDS"][$this->id][$id] ?? '';
1198 }
1199 else
1200 {
1201 $val = $this->arRes[$id] ?? '';
1202 }
1203
1204 $val_old = $this->arRes[$id] ?? '';
1205
1206 echo '<td class="adm-list-table-cell',
1207 (isset($header_props['align']) && $header_props['align']? ' align-'.$header_props['align']: ''),
1208 (isset($header_props['valign']) && $header_props['valign']? ' valign-'.$header_props['valign']: ''),
1209 ($id === $last_id? ' adm-list-table-cell-last': ''),
1210 '">';
1211
1212 if(is_array($val_old))
1213 {
1214 foreach($val_old as $k=>$v)
1215 echo '<input type="hidden" name="FIELDS_OLD['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']['.htmlspecialcharsbx($k).']" value="'.htmlspecialcharsbx($v).'">';
1216 }
1217 else
1218 {
1219 echo '<input type="hidden" name="FIELDS_OLD['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value="'.htmlspecialcharsbx($val_old).'">';
1220 }
1221 switch($field["edit"]["type"])
1222 {
1223 case "checkbox":
1224 echo '<input type="hidden" name="FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value="N">';
1225 echo '<input type="checkbox" name="FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value="Y"'.($val=='Y' || $val === true?' checked':'').'>';
1226 break;
1227 case "select":
1228 echo '<select name="FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']"'.$this->__AttrGen($field["edit"]["attributes"]).'>';
1229 foreach($field["edit"]["values"] as $k=>$v)
1230 echo '<option value="'.htmlspecialcharsbx($k).'" '.($k==$val?' selected':'').'>'.htmlspecialcharsbx($v).'</option>';
1231 echo '</select>';
1232 break;
1233 case "input":
1234 if(!$field["edit"]["attributes"]["size"])
1235 $field["edit"]["attributes"]["size"] = "10";
1236 echo '<input type="text" '.$this->__AttrGen($field["edit"]["attributes"]).' name="FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value="'.htmlspecialcharsbx($val).'">';
1237 break;
1238 case "calendar":
1239 if(!$field["edit"]["attributes"]["size"])
1240 $field["edit"]["attributes"]["size"] = "10";
1241 echo '<span style="white-space:nowrap;"><input type="text" '.$this->__AttrGen($field["edit"]["attributes"]).' name="FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value="'.htmlspecialcharsbx($val).'">';
1242 echo CAdminCalendar::Calendar(
1243 'FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']',
1244 '',
1245 '',
1246 $field['edit']['useTime']
1247 ).'</span>';
1248 break;
1249 case "file":
1250 echo CFileInput::Show(
1251 'FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']',
1252 $val,
1253 $field["edit"]["showInfo"],
1254 $field["edit"]["inputs"]
1255 );
1256 break;
1257 default:
1258 echo $field["edit"]['value'];
1259 }
1260 echo '</td>';
1261 }
1262 else
1263 {
1264 $val = $this->arRes[$id] ?? '';
1265 if (is_string($val))
1266 {
1267 $val = trim($val);
1268 }
1269
1270 if(isset($field["view"]))
1271 {
1272 switch($field["view"]["type"])
1273 {
1274 case "checkbox":
1275 if($val == 'Y' || $val === true)
1276 $val = htmlspecialcharsex(GetMessage("admin_lib_list_yes"));
1277 else
1278 $val = htmlspecialcharsex(GetMessage("admin_lib_list_no"));
1279 break;
1280 case "select":
1281 if (isset($field["edit"]["values"][$val]))
1282 {
1283 $val = htmlspecialcharsex($field["edit"]["values"][$val]);
1284 }
1285 elseif (isset($field["view"]["values"][$val]))
1286 {
1287 $val = htmlspecialcharsex($field["view"]["values"][$val]);
1288 }
1289 else
1290 {
1291 $val = htmlspecialcharsex($val);
1292 }
1293 break;
1294 case "file":
1295 if ($val > 0)
1296 $val = CFileInput::Show(
1297 'NO_FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']',
1298 $val,
1299 $field["view"]["showInfo"],
1300 $field["view"]["inputs"]
1301 );
1302 else
1303 $val = '';
1304 break;
1305 case "html":
1306 $val = $field["view"]['value'];
1307 break;
1308 default:
1309 $val = htmlspecialcharsex($val);
1310 break;
1311 }
1312 }
1313 else
1314 {
1315 $val = htmlspecialcharsex($val);
1316 }
1317
1318 echo '<td class="adm-list-table-cell',
1319 (isset($header_props['align']) && $header_props['align']? ' align-'.$header_props['align']: ''),
1320 (isset($header_props['valign']) && $header_props['valign']? ' valign-'.$header_props['valign']: ''),
1321 ($id === $last_id? ' adm-list-table-cell-last': ''),
1322 '">';
1323 echo ((string)$val <> ""? $val: '&nbsp;');
1324 if(isset($field["edit"]) && $field["edit"]["type"] == "calendar")
1325 CAdminCalendar::ShowScript();
1326 echo '</td>';
1327 }
1328 }
1329?>
1330</tr>
1331<?
1332 }
1333
1334 function AddFieldNames($strFieldName,$strFieldType = 'HIDDEN')
1335 {
1336 if ($strFieldName <> '')
1337 {
1338 if (false == isset($this->arFieldNames[$strFieldName]))
1339 {
1340 if ($strFieldType == '')
1341 $strFieldType = 'HIDDEN';
1342 $this->arFieldNames[$strFieldName] = mb_strtoupper($strFieldType);
1343 }
1344 }
1345 }
1346
1347 function GetFieldNames()
1348 {
1349 return $this->arFieldNames;
1350 }
1351}
1352
1353class CAdminSubContextMenu extends CAdminContextMenu
1354{
1355 public function __construct($items, $additional_items = array())
1356 {
1357 parent::__construct($items, $additional_items);
1358 }
1359
1360 function Show()
1361 {
1362 $hkInst = CHotKeys::GetInstance();
1363
1364 foreach(GetModuleEvents("main", "OnAdminSubContextMenuShow", true) as $arEvent)
1365 {
1366 ExecuteModuleEventEx($arEvent, array(&$this->items, &$this->additional_items));
1367 }
1368
1369 $bFirst = true;
1370 $bNeedSplitClosing = false;
1371 foreach($this->items as $item)
1372 {
1373 if(!empty($item["NEWBAR"]))
1374 $this->EndBar();
1375
1376 if($bFirst || !empty($item["NEWBAR"]))
1377 $this->BeginBar();
1378
1379 if(!empty($item["NEWBAR"]) || !empty($item['SEPARATOR']))
1380 continue;
1381
1382 if ($item['ICON'] != 'btn_sub_list' && !$bNeedSplitClosing)
1383 {
1384 $this->BeginRightBar();
1385 $bNeedSplitClosing = true;
1386 }
1387
1388 $this->Button($item, $hkInst);
1389
1390 $bFirst = false;
1391 }
1392
1393 if (!((defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1)))
1394 {
1395 if (!empty($this->additional_items))
1396 {
1397 if($bFirst)
1398 {
1399 $this->BeginBar();
1400 }
1401
1402 $this->Additional();
1403 }
1404 }
1405
1406 if ($bNeedSplitClosing)
1407 $this->EndRightBar();
1408
1409 $this->EndBar();
1410 }
1411
1412 function GetClassByID($icon_id)
1413 {
1414 switch ($icon_id)
1415 {
1416 case 'btn_sub_new':
1417 return 'adm-btn-add';
1418 case 'btn_sub_copy':
1419 return 'adm-btn-copy';
1420 case 'btn_sub_delete':
1421 return 'adm-btn-delete';
1422 case 'btn_sub_active':
1423 return 'adm-btn-active';
1424 }
1425
1426 return '';
1427 }
1428
1429 function GetActiveClassByID($icon_id)
1430 {
1431 return 'adm-btn-active';
1432 }
1433}
1434
1435class CAdminSubContextMenuList extends CAdminSubContextMenu
1436{
1437 function BeginBar()
1438 {
1439 echo '<div class="adm-list-table-top">';
1440 }
1441 function BeginRightBar() {}
1442 function EndRightBar() {}
1443
1444 function GetClassByID($icon_id)
1445 {
1446 if (mb_substr($icon_id, 0, 7) == 'btn_sub_new')
1447 return 'adm-btn-save adm-btn-add';
1448 else
1449 return parent::GetClassByID($icon_id);
1450 }
1451
1452 function GetActiveClassByID($icon_id)
1453 {
1454 if (mb_substr($icon_id, 0, 7) == 'btn_sub_new')
1455 return 'adm-btn-save-active';
1456 else
1457 return parent::GetActiveClassByID($icon_id);
1458 }
1459}
1460
1461class CAdminSubForm extends CAdminForm
1462{
1463/*
1464 * list_url - string with params or array:
1465 * LINK
1466 * PARAMS (array key => value)
1467 * POST_PARAMS (array key => value)
1468 */
1469 var $strListUrl = ''; // add
1470 var $strListUrlParams = ''; // add
1471 var $arListUrlParams = array(); // add
1472 var $strListPostParams = '';
1473 var $arListPostParams = array();
1474 var $boolShowSettings = false;
1475
1476 public function __construct($name, $tabs, $bCanExpand = true, $bDenyAutosave = false, $list_url = '', $boolShowSettings = false)
1477 {
1478 global $APPLICATION;
1479
1480 $arJSDescr = array(
1481 'js' => '/bitrix/js/iblock/subelementdet.js',
1482 'css' => '/bitrix/panel/iblock/sub-detail-public.css',
1483 'rel' => array('admin_interface')
1484 );
1485
1486 CJSCore::RegisterExt('subelementdet', $arJSDescr);
1487
1488 CUtil::InitJSCore(array("subelementdet"));
1489
1490 if (is_array($tabs))
1491 {
1492 foreach (array_keys($tabs) as $index)
1493 {
1494 $tabs[$index]['ONSELECT'] = (string)($tabs[$index]['ONSELECT'] ?? '');
1495 }
1496 }
1497
1498 parent::__construct($name, $tabs, $bCanExpand, $bDenyAutosave);
1499
1500 $this->boolShowSettings = ($boolShowSettings === true);
1501 $this->SetShowSettings($this->boolShowSettings);
1502
1503 $this->strListUrlParams = '';
1504 $this->arListUrlParams = array();
1505
1506 if (is_array($list_url) && isset($list_url['LINK']))
1507 {
1508 $this->strListUrl = $list_url['LINK'];
1509 $this->__ParseListUrl(true);
1510 if (true == isset($list_url['PARAMS']))
1511 $this->__SetListUrlParams($list_url['PARAMS']);
1512 }
1513 else
1514 {
1515 $this->strListUrl = $list_url;
1516 $this->__ParseListUrl(true);
1517 }
1518 if ('' == $this->strListUrl)
1519 {
1520 $this->strListUrl = $APPLICATION->GetCurPageParam();
1521 $this->__ParseListUrl(true);
1522 }
1523
1524 if (is_array($list_url) && !empty($list_url['POST_PARAMS']))
1525 $this->__SetListPostParams($list_url['POST_PARAMS'],true);
1526 }
1527
1528 function ShowSettings()
1529 {
1532 global $APPLICATION, $USER;
1533
1534 $APPLICATION->RestartBuffer();
1535
1536 require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php");
1537
1539 $adminFormParams = array(
1540 'tabPrefix' => 'csubedit'
1541 );
1542 require($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/interface/settings_admin_form.php");
1543 require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin_js.php");
1544 die();
1545 }
1546
1547 public function GetListUrl($boolFull = false)
1548 {
1549 return $this->strListUrl.(true == $boolFull && '' != $this->strListUrlParams ? '?'.$this->strListUrlParams : '');
1550 }
1551
1552 public function GetListPostParams($boolType = false, $boolJS = false)
1553 {
1554 $boolType = (true == $boolType ? true : false);
1555 if ($boolType)
1556 {
1557 $boolJS = (true == $boolJS ? true : false);
1558 return ($boolJS ? CUtil::PhpToJsObject($this->arListPostParams) : $this->arListPostParams);
1559 }
1560 else
1561 {
1562 return $this->strListPostParams;
1563 }
1564 }
1565
1566 private function __UpdateListUrlParams()
1567 {
1568 $this->strListUrlParams = '';
1569 if (false == empty($this->arListUrlParams))
1570 {
1571 foreach ($this->arListUrlParams as $key => $value)
1572 $this->strListUrlParams .= $key.'='.$value.'&';
1573 $this->strListUrlParams = mb_substr($this->strListUrlParams, 0, -1);
1574 }
1575 }
1576
1577 private function __ClearListUrlParams()
1578 {
1579 $this->arListUrlParams = array();
1580 $this->strListUrlParams = '';
1581 }
1582
1583 private function __AddListUrlParams($strKey,$strValue)
1584 {
1585 if ('' != $strKey)
1586 {
1587 $this->arListUrlParams[$strKey] = $strValue;
1588 $this->__UpdateListUrlParams();
1589 }
1590 }
1591
1592 private function __DeleteListUrlParams($mxKey)
1593 {
1594 if (true == is_array($mxKey))
1595 {
1596 foreach ($mxKey as $value)
1597 if (('' != $value) && (true == array_key_exists($value,$this->arListUrlParams)))
1598 unset($this->arListUrlParams[$value]);
1599 }
1600 elseif (('' != $mxKey) && (true == array_key_exists($mxKey,$this->arListUrlParams)))
1601 {
1602 unset($this->arListUrlParams[$mxKey]);
1603 }
1604 $this->__UpdateListUrlParams();
1605 }
1606
1607 private function __SetListUrlParams($mxParams,$boolClear = false)
1608 {
1609 if (true == $boolClear)
1610 $this->arListUrlParams = array();
1611
1612 if (!is_array($mxParams))
1613 {
1614 $arParams = array();
1615 parse_str($mxParams,$arParams);
1616 $mxParams = (true == is_array($arParams) ? $arParams : array());
1617 }
1618 foreach ($mxParams as $key => $value)
1619 if ('' != $key)
1620 $this->arListUrlParams[$key] = $value;
1621
1622 $this->__UpdateListUrlParams();
1623 }
1624
1625 private function __ParseListUrl($boolClear = false)
1626 {
1627 $mxPos = mb_strpos($this->strListUrl, '?');
1628 if (false !== $mxPos)
1629 {
1630 $this->__SetListUrlParams(mb_substr($this->strListUrl, $mxPos + 1), $boolClear);
1631 $this->strListUrl = mb_substr($this->strListUrl, 0, $mxPos);
1632 }
1633 }
1634
1635 private function __UpdateListPostParams()
1636 {
1637 $this->strListPostParams = '';
1638 if (false == empty($this->arListPostParams))
1639 {
1640 foreach ($this->arListPostParams as $key => $value)
1641 $this->strListPostParams .= $key.'='.$value.'&';
1642 $this->strListPostParams = mb_substr($this->strListPostParams, 0, -1);
1643 }
1644 }
1645
1646 private function __ClearListPostParams()
1647 {
1648 $this->arListPostParams = array();
1649 $this->strListPostParams = '';
1650 }
1651
1652 private function __AddListPostParams($strKey,$strValue)
1653 {
1654 if ('' != $strKey)
1655 {
1656 $this->arListPostParams[$strKey] = $strValue;
1657 $this->__UpdateListPostParams();
1658 }
1659 }
1660
1661 private function __DeleteListPostParams($mxKey)
1662 {
1663 if (true == is_array($mxKey))
1664 {
1665 foreach ($mxKey as $value)
1666 if (('' != $value) && (true == array_key_exists($value,$this->arListPostParams)))
1667 unset($this->arListPostParams[$value]);
1668 }
1669 elseif (('' != $mxKey) && (true == array_key_exists($mxKey,$this->arListPostParams)))
1670 {
1671 unset($this->arListPostParams[$mxKey]);
1672 }
1673 $this->__UpdateListPostParams();
1674 }
1675
1676 private function __SetListPostParams($mxParams,$boolClear)
1677 {
1678 if (true == $boolClear)
1679 $this->arListPostParams = array();
1680 if (!is_array($mxParams))
1681 {
1682 $arParams = array();
1683 parse_str($mxParams,$arParams);
1684 $mxParams = $arParams;
1685 }
1686 foreach ($mxParams as $key => $value)
1687 if ('' != $key)
1688 $this->arListPostParams[$key] = $value;
1689
1690 $this->__UpdateListPostParams();
1691 }
1692
1693 function ShowTabButtons()
1694 {
1695 $s = '';
1696 if ($this->bShowSettings)
1697 {
1698 $aAdditionalMenu = array();
1699
1700 $this->__AddListUrlParams('mode', 'settings');
1701 $strLink = $this->GetListUrl(true);
1702 $this->__DeleteListUrlParams('mode');
1703
1704 $aAdditionalMenu[] = array(
1705 "TEXT"=>GetMessage("admin_lib_menu_settings"),
1706 "TITLE"=>GetMessage("admin_lib_context_sett_title"),
1707 "ONCLICK"=>$this->name.".ShowSettings('".htmlspecialcharsex(CUtil::JSEscape($strLink))."')",
1708 "ICON"=>"btn_settings",
1709 );
1710
1711 $nameExists = isset($this->session["ADMIN_CUSTOM_FIELDS"])
1712 && is_array($this->session["ADMIN_CUSTOM_FIELDS"])
1713 && array_key_exists($this->name, $this->session["ADMIN_CUSTOM_FIELDS"])
1714 ;
1715 if($this->bCustomFields)
1716 {
1717 if ($nameExists)
1718 {
1719 $aAdditionalMenu[] = array(
1720 "TEXT" => GetMessage("admin_lib_sett_sett_enable_text"),
1721 "TITLE" => GetMessage("admin_lib_sett_sett_enable"),
1722 "ONCLICK" => $this->name.'.EnableSettings();',
1723 "ICON" => 'custom-fields-on'
1724 );
1725 }
1726 else
1727 {
1728 $aAdditionalMenu[] = array(
1729 "TEXT" => GetMessage("admin_lib_sett_sett_disable_text"),
1730 "TITLE" => GetMessage("admin_lib_sett_sett_disable"),
1731 "ONCLICK" => $this->name.'.DisableSettings();',
1732 "ICON" => 'custom-fields-off'
1733 );
1734 }
1735 }
1736 $s .= '<span class="adm-detail-subsettings-cont">';
1737 if (count($aAdditionalMenu) > 1)
1738 {
1739 $sMenuUrl = "BX.adminShowMenu(this, ".htmlspecialcharsbx(CAdminPopupEx::PhpToJavaScript($aAdditionalMenu)).", {active_class: 'bx-settings-btn-active'});";
1740 $s .= '<span id="'.$this->name.'_settings_btn" class="adm-detail-subsettings adm-detail-subsettings-arrow'.($nameExists ? '' : ' adm-detail-subsettings-active').'" onclick="'.$sMenuUrl.'"></span>';
1741 }
1742 else
1743 {
1744 $s .= '<a class="adm-detail-subsettings" href="javascript:void(0)" onclick="'.$aAdditionalMenu[0]['ONCLICK'].';"></a>';
1745 }
1746 $s .= '</span>';
1747 }
1748
1749 return $s.CAdminTabControl::ShowTabButtons();
1750 }
1751
1752 function End()
1753 {
1754 $hkInst = CHotKeys::GetInstance();
1755
1756 if(!$this->bButtons)
1757 {
1758 while ($this->tabIndex < count($this->tabs))
1759 $this->BeginNextTab();
1760
1761 //end previous tab
1762 $this->EndTab();
1763 echo '<div class="adm-detail-content-btns-wrap"><div class="adm-detail-content-btns adm-detail-content-btns-empty"></div></div>';
1764 }
1765 elseif (!$this->bPublicMode)
1766 {
1767 echo '</div></div>';
1768 }
1769
1770 if (!$this->bPublicMode)
1771 {
1772 echo '
1773</div></div>
1774';
1775 }
1776
1777 $Execs = $hkInst->GetCodeByClassName("CAdminSubForm");
1778 echo $hkInst->PrintJSExecs($Execs, $this->name);
1779
1780 echo '
1781
1782<input type="hidden" id="'.$this->name.'_active_tab" name="'.$this->name.'_active_tab" value="'.htmlspecialcharsbx($this->selectedTab).'">
1783
1784<script>';
1785 $s = "";
1786 foreach($this->tabs as $tab)
1787 {
1788 $s .= ($s <> ""? ", ":"").
1789 "{".
1790 "'DIV': '".$tab["DIV"]."' ".
1791 ($tab["ONSELECT"] <> ""? ", 'ONSELECT': '".CUtil::JSEscape($tab["ONSELECT"])."'":"").
1792 "}";
1793 }
1794
1795 echo 'var '.$this->name.' = new BX.adminSubTabControl("'.$this->name.'", "'.$this->unique_name.'", ['.$s.'], "'.CUtil::JSEscape($this->GetListUrl(true)).'",'.$this->GetListPostParams(true,true).');';
1796
1797 if (!$this->bPublicMode)
1798 {
1799 $aEditOpt = CUserOptions::GetOption("edit", $this->unique_name, array());
1800 $aTabOpt = CUserOptions::GetOption("edit", 'admin_tabs', array());
1801
1802 if($this->bCanExpand && count($this->tabs) > 1)
1803 {
1804 if($aEditOpt["expand"] == "on")
1805 {
1806 echo '
1807'.$this->name.'.ToggleTabs();';
1808 }
1809 }
1810
1811 if ($aTabOpt["fix_top"] == "off" && $aEditOpt["expand"] != "on")
1812 {
1813 echo '
1814'.$this->name.'.ToggleFix(\'top\');';
1815 }
1816
1817 if ($aTabOpt["fix_bottom"] == "off")
1818 {
1819 echo '
1820'.$this->name.'.ToggleFix(\'bottom\');';
1821 }
1822 }
1823 else
1824 {
1825 echo 'window.'.$this->name.'.setPublicMode(true); ';
1826 }
1827echo '
1828</script>
1829';
1830 if ($this->bPublicModeBuffer)
1831 {
1832 echo '</div>';
1833 echo '<script>BX.ready(function() {'.$this->publicObject.'.SwapContent(\''.$this->publicModeBuffer_id.'\');});</script>';
1834 }
1835 }
1836
1837 public static function closeSubForm($reload = true, $closeWait = true): void
1838 {
1839 $reload = ($reload !== false);
1840 $closeWait = ($closeWait !== false);
1841 $result = '<script>';
1842 $result .= '
1843 var currentWindow = top.window;
1844 if (top.BX.SidePanel && top.BX.SidePanel.Instance && top.BX.SidePanel.Instance.getTopSlider())
1845 {
1846 currentWindow = top.BX.SidePanel.Instance.getTopSlider().getWindow();
1847 }
1848 ';
1849 if ($closeWait)
1850 $result .= 'currentWindow.BX.closeWait(); ';
1851 $result .= 'currentWindow.BX.WindowManager.Get().AllowClose(); currentWindow.BX.WindowManager.Get().Close();';
1852 if ($reload)
1853 $result .= ' if (!!currentWindow.ReloadSubList) { currentWindow.ReloadSubList(); }';
1854 $result .= '</script>';
1855
1856 CMain::FinalActions($result);
1857 }
1858}
1859
1860class CAdminSubResult extends CAdminResult
1861{
1862 var $list_url;
1863 var $list_url_params;
1864
1865 public function __construct($res, $table_id, $list_url)
1866 {
1867 $this->list_url = $list_url;
1868 $this->list_url_params = '';
1869 $intPos = mb_strpos($this->list_url, '?');
1870 if (false !== $intPos)
1871 {
1872 $this->list_url_params = mb_substr($this->list_url, $intPos + 1);
1873 $this->list_url = mb_substr($this->list_url, 0, $intPos);
1874 }
1875 parent::__construct($res, $table_id);
1876 }
1877
1878 public function NavStart($nPageSize=20, $bShowAll=true, $iNumPage=false)
1879 {
1880 $navResult = new CAdminSubResult(null, '', '');
1881 $nSize = $navResult->GetNavSize($this->table_id, $nPageSize, $this->list_url.('' != $this->list_url_params ? '?'.$this->list_url_params : ''));
1882 unset($navResult);
1883
1884 if(!is_array($nPageSize))
1885 $nPageSize = array();
1886
1887 $nPageSize["nPageSize"] = $nSize;
1888 if (isset($_REQUEST["mode"]) && $_REQUEST["mode"] === "excel")
1889 {
1890 $nPageSize["NavShowAll"] = true;
1891 }
1892
1893 $this->nInitialSize = $nPageSize["nPageSize"];
1894
1895 parent::NavStart($nPageSize, $bShowAll, $iNumPage);
1896 }
1897
1904 public static function GetNavSize($table_id=false, $nPageSize=20, $list_url = '')
1905 {
1906 $list_url = (string)$list_url;
1907 if ($list_url != '')
1908 {
1909 if (!is_array($nPageSize))
1910 $nPageSize = array('nPageSize' => $nPageSize);
1911 $nPageSize['sNavID'] = $list_url;
1912 }
1913 return parent::GetNavSize($table_id, $nPageSize);
1914 }
1915
1916 public function GetNavPrint($title, $show_allways=true, $StyleText="", $template_path=false, $arDeleteParam=false)
1917 {
1918 if($template_path === false)
1919 $template_path = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/admin/templates/navigation.php";
1920
1922 $add_anchor = $this->add_anchor;
1923
1925 $sBegin = GetMessage("nav_begin");
1927 $sEnd = GetMessage("nav_end");
1929 $sNext = GetMessage("nav_next");
1931 $sPrev = GetMessage("nav_prev");
1933 $sAll = GetMessage("nav_all");
1935 $sPaged = GetMessage("nav_paged");
1936
1937 $nPageWindow = $this->nPageWindow;
1938
1939 if(!$show_allways)
1940 {
1941 if ($this->NavRecordCount == 0 || ($this->NavPageCount == 1 && $this->NavShowAll == false))
1942 return '';
1943 }
1944
1945 $sUrlPath = $this->list_url;
1946 $strNavQueryString = $this->list_url_params;
1947 if (strncmp($strNavQueryString, '&', 1) !== 0)
1948 {
1949 $strNavQueryString = '&' . $strNavQueryString;
1950 }
1951 $strNavQueryString = htmlspecialcharsbx($strNavQueryString);
1952
1953 if($template_path!==false && !file_exists($template_path) && file_exists($_SERVER["DOCUMENT_ROOT"].$template_path))
1954 $template_path = $_SERVER["DOCUMENT_ROOT"].$template_path;
1955
1956 if($this->bDescPageNumbering === true)
1957 {
1958 if($this->NavPageNomer + floor($nPageWindow/2) >= $this->NavPageCount)
1959 $nStartPage = $this->NavPageCount;
1960 else
1961 {
1962 if($this->NavPageNomer + floor($nPageWindow/2) >= $nPageWindow)
1963 $nStartPage = $this->NavPageNomer + floor($nPageWindow/2);
1964 else
1965 {
1966 if($this->NavPageCount >= $nPageWindow)
1967 $nStartPage = $nPageWindow;
1968 else
1969 $nStartPage = $this->NavPageCount;
1970 }
1971 }
1972
1973 if($nStartPage - $nPageWindow >= 0)
1974 $nEndPage = $nStartPage - $nPageWindow + 1;
1975 else
1976 $nEndPage = 1;
1977 }
1978 else
1979 {
1980 if($this->NavPageNomer > floor($nPageWindow/2) + 1 && $this->NavPageCount > $nPageWindow)
1981 $nStartPage = $this->NavPageNomer - floor($nPageWindow/2);
1982 else
1983 $nStartPage = 1;
1984
1985 if($this->NavPageNomer <= $this->NavPageCount - floor($nPageWindow/2) && $nStartPage + $nPageWindow-1 <= $this->NavPageCount)
1986 $nEndPage = $nStartPage + $nPageWindow - 1;
1987 else
1988 {
1989 $nEndPage = $this->NavPageCount;
1990 if($nEndPage - $nPageWindow + 1 >= 1)
1991 $nStartPage = $nEndPage - $nPageWindow + 1;
1992 }
1993 }
1994
1995 $this->nStartPage = $nStartPage;
1996 $this->nEndPage = $nEndPage;
1997
1998 if($template_path!==false && file_exists($template_path))
1999 {
2000 ob_start();
2002 include($template_path);
2003 $res = ob_get_contents();
2004 ob_end_clean();
2005 $this->bFirstPrintNav = false;
2006 return $res;
2007 }
2008 else
2009 {
2010 return '';
2011 }
2012 }
2013}
2014
2015class CAdminSubMessage extends CAdminMessage
2016{
2017 public function __construct($message, $exception = false)
2018 {
2019 parent::__construct($message,$exception);
2020 }
2021
2022 public function Show()
2023 {
2024 if (defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1)
2025 {
2026 return '<script>top.BX.WindowManager.Get().ShowError(\''.CUtil::JSEscape(str_replace(array('<br>', '<br />', '<BR>', '<BR />'), "\r\n", htmlspecialcharsback($this->message['DETAILS']? $this->message['DETAILS'] : $this->message['MESSAGE']))).'\');</script>';
2027 }
2028 else
2029 {
2030 if($this->message["MESSAGE"])
2031 $title = '<div class="adm-info-message-title">'.$this->_formatHTML($this->message["MESSAGE"]).'</div>';
2032 else
2033 $title = '';
2034
2035 if($this->message["DETAILS"])
2036 $details = $this->_formatHTML($this->message["DETAILS"]);
2037 else
2038 $details = '';
2039
2040 if($this->message["TYPE"] == "OK")
2041 {
2042 $s = '
2043<div class="adm-info-message-wrap adm-info-message-green">
2044 <div class="adm-info-message">
2045 '.$title.'
2046 '.$details.'
2047 <div class="adm-info-message-icon"></div>
2048 </div>
2049</div>
2050';
2051 }
2052 elseif($this->message["TYPE"] == "PROGRESS")
2053 {
2054 if ($this->message['PROGRESS_ICON'])
2055 $title = '<div class="adm-info-message-icon-progress"></div>'.$title;
2056
2057 $details = str_replace("#PROGRESS_BAR#", $this->_getProgressHtml(), $details);
2058 $s = '
2059<div class="adm-info-message-wrap adm-info-message-gray">
2060 <div class="adm-info-message">
2061 '.$title.'
2062 '.$details.'
2063 <div class="adm-info-message-buttons">'.$this->_getButtonsHtml().'</div>
2064 </div>
2065</div>
2066';
2067 }
2068 else
2069 {
2070 $s = '
2071<div class="adm-info-message-wrap adm-info-message-red">
2072 <div class="adm-info-message">
2073 '.$title.'
2074 '.$details.'
2075 <div class="adm-info-message-icon"></div>
2076 </div>
2077</div>
2078';
2079 }
2080
2081 return $s;
2082 }
2083 }
2084
2085 public static function ShowOldStyleError($message)
2086 {
2087 if(!empty($message))
2088 {
2089 $m = new CAdminSubMessage(array("MESSAGE"=>GetMessage("admin_lib_error"), "DETAILS"=>$message, "TYPE"=>"ERROR"));
2090 echo $m->Show();
2091 }
2092 }
2093
2094 public static function ShowMessage($message)
2095 {
2096 if(!empty($message))
2097 {
2098 $m = new CAdminSubMessage($message);
2099 echo $m->Show();
2100 }
2101 }
2102
2103 public static function ShowNote($message)
2104 {
2105 if(!empty($message))
2106 {
2107 $m = new CAdminSubMessage(array("MESSAGE"=>$message, "TYPE"=>"OK"));
2108 echo $m->Show();
2109 }
2110 }
2111}
$arParams
Определения access_dialog.php:21
$path
Определения access_edit.php:21
return select
Определения access_edit.php:440
<?=$taskID?> selected
Определения access_edit.php:348
const BX_ROOT
Определения bx_root.php:3
global $APPLICATION
Определения include.php:80
change_password_forgot_link login popup forget pas AUTH_GOTO_FORGOT_FORM login btn wrap change_password_button login popup link login popup return auth javascript
Определения change_password.php:57
isActionMode()
Определения admin_list.php:556
isAjaxMode()
Определения admin_list.php:539
ActionAjaxReload($url)
Определения admin_list.php:584
isPageMode()
Определения admin_list.php:523
Определения admin_lib.php:1349
Определения admin_lib.php:1890
$by_initial
Определения admin_lib.php:1894
$table_id
Определения admin_lib.php:1893
$ord_name
Определения admin_lib.php:1892
$order_initial
Определения admin_lib.php:1895
$by_name
Определения admin_lib.php:1891
Display()
Определения subelement.php:445
DisplayList($arParams=array())
Определения subelement.php:738
CheckListMode()
Определения subelement.php:768
GetListUrl($boolFull=false)
Определения subelement.php:177
Определения subelement.php:10
__construct($table_id, $by_initial=false, $order_initial=false, $by_name="by", $ord_name="order", $list_url='')
Определения subelement.php:13
$list_url
Определения subelement.php:11
Show($text, $sort_by, $alt_title=false, $baseCssClass="")
Определения subelement.php:23
$data['IS_AVAILABLE']
Определения .description.php:13
& nbsp
Определения epilog_main_admin.php:38
const BX_PUBLIC_MODE
Определения file_edit.php:2
hidden PROPERTY[<?=$propertyIndex?>][CODE]<?=htmlspecialcharsEx( $propertyCode)?> height
Определения file_new.php:759
if(errorBox) return true
Определения file_new.php:1035
bx popup label bx width30 PAGE_NEW_MENU_NAME text width
Определения file_new.php:677
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
bx_acc_lim_group_list limitGroupList[] multiple<?=$group[ 'ID']?> ID selected margin top
Определения file_new.php:657
Form FILTER_ACTION disabled
Определения options.php:358
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
endif
Определения csv_new_setup.php:990
htmlspecialcharsback($str)
Определения tools.php:2693
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$aUserOpt
Определения prolog_auth_admin.php:23
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
<? endif;?> window document title
Определения prolog_main_admin.php:76
$text
Определения template_pdf.php:79
lang
Определения options.php:182
font style
Определения 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
$title
Определения pdf.php:123
$k
Определения template_pdf.php:567
$url
Определения iframe.php:7