71 $this->request = Main\Context::getCurrent()->getRequest();
74 $this->table_id = preg_replace(
'/[^a-z0-9_]/i',
'',
$table_id);
84 $this->isPublicMode =
$mode;
85 foreach (array_keys($this->aRows) as $index)
87 $this->aRows[$index]->setPublicModeState(
$mode);
104 $showAll = $this->request->get(
'showallcol');
105 if ($showAll !==
null && $showAll !==
'')
107 $this->session[
'SHALL'] = $showAll ===
'Y';
109 $showAll = isset($this->session[
'SHALL']) && $this->session[
'SHALL'];
111 $aOptions = CUserOptions::GetOption(
"list", $this->table_id,
array());
113 $aColsTmp = explode(
",", $aOptions[
"columns"] ??
'');
115 $userColumns =
array();
116 foreach ($aColsTmp as $col)
122 $userColumns[$col] =
true;
127 $userVisibleColumns =
array();
128 foreach ($aParams as $param)
130 $param[
'default'] = (bool)($param[
'default'] ??
false);
131 $param[
"__sort"] = -1;
132 $this->aHeaders[$param[
"id"]] = $param;
136 || isset($userColumns[$param[
"id"]])
139 $this->arVisibleColumns[] = $param[
"id"];
140 $userVisibleColumns[$param[
"id"]] =
true;
145 $aAllCols = ($this->
isConfigMode() ? $this->aHeaders :
null);
149 foreach ($aCols as
$i => $col)
150 if (isset($this->aHeaders[$col]))
151 $this->aHeaders[$col][
"__sort"] =
$i;
156 foreach($this->aHeaders as $id=>$arHeader)
158 if (isset($userVisibleColumns[$id]))
159 $this->aVisibleHeaders[$id] = $arHeader;
161 unset($userVisibleColumns);
175 require(
$_SERVER[
"DOCUMENT_ROOT"].
"/bitrix/modules/main/include/prolog_admin_js.php");
176 require(
$_SERVER[
'DOCUMENT_ROOT'].
"/bitrix/modules/main/interface/settings_admin_list.php");
177 require(
$_SERVER[
"DOCUMENT_ROOT"].
"/bitrix/modules/main/include/epilog_admin_js.php");
183 if (isset($this->aHeaders[$id]) && !isset($this->aVisibleHeaders[$id]))
185 $this->arVisibleColumns[] = $id;
186 $this->aVisibleHeaders[$id] = $this->aHeaders[$id];
223 $queryString =
DeleteParam([self::MODE_FIELD_NAME]);
224 if ($queryString !==
'')
226 $queryString =
'&' . $queryString;
229 if (isset(
$config[
'settings']))
232 "TEXT" =>
GetMessage(
"admin_lib_context_sett"),
233 "TITLE" =>
GetMessage(
"admin_lib_context_sett_title"),
234 "ONCLICK" => $this->table_id .
".ShowSettings('" . CUtil::JSEscape(
235 $link .
"?" . static::getModeConfigUrlParam() . $queryString
237 "GLOBAL_ICON" =>
"adm-menu-setting",
246 $link .
"?" . static::getModeExportUrlParam() . $queryString
248 "GLOBAL_ICON"=>
"adm-menu-excel",
256 if (!empty($menu) || !empty($additional))
271 if(!is_array(
$f) || !is_array($f_old))
274 foreach(
$f as
$k=>$v)
278 if(!is_array($f_old[
$k]))
282 foreach($v as $k2 => $v2)
284 if($f_old[
$k][$k2] !== $v2)
286 unset($f_old[
$k][$k2]);
288 if(!empty($f_old[
$k]))
294 if(isset($f_old[
$k]) && is_array($f_old[
$k]))
298 elseif(!isset($f_old[
$k]) || $f_old[
$k] !== $v)
319 foreach($arrays as
$i => $array)
321 if(is_array($array[
"FIELDS"]))
323 foreach($array[
"FIELDS"] as $id=>
$fields)
328 foreach($keys as
$key)
330 if(($c = substr(
$key,0,1)) ==
'~' || $c ==
'=')
332 unset($arrays[
$i][
"FIELDS"][$id][
$key]);
346 foreach ($keys as
$key)
348 if (($c = substr(
$key,0,1)) ==
'~' || $c ==
'=')
371 foreach (array_keys(
$_REQUEST[
'FIELDS']) as $id)
373 if (empty($id) || !$this->
IsUpdated($id))
390 if (!empty($_FILES[
'FIELDS']) && is_array($_FILES[
'FIELDS']))
392 CFile::ConvertFilesToPost($_FILES[
'FIELDS'],
$_REQUEST[
'FIELDS']);
419 $this->arEditedRows = $arID;
420 $this->bEditMode =
true;
447 return (isset(
$_REQUEST[
'action_target']) &&
$_REQUEST[
'action_target'] ===
'selected');
487 $this->mode = self::MODE_PAGE;
488 $mode = $this->request->get(self::MODE_FIELD_NAME);
542 return (
$mode === self::MODE_LIST ||
$mode === self::MODE_ACTION);
572 if ($this->isPublicMode)
574 $selfFolderUrl = (defined(
"SELF_FOLDER_URL") ? SELF_FOLDER_URL :
"/bitrix/admin/");
581 return "BX.adminPanel.Redirect([], '".static::getUrlWithLanguage(
$url).
"', event);";
586 return $this->table_id.
".GetAdminList('".static::getUrlWithLanguage((
string)
$url).
"');";
589 public function ActionPost(
$url =
false, $action_name =
false, $action_value =
'Y')
594 $url = static::getUrlWithLanguage((
string)
$url,
false);
596 if (!str_contains(
$url, self::MODE_FIELD_NAME .
'='))
598 $url .=
'&' . static::getModeActionUrlParam();
601 $res =
'BX(\'form_'.$this->table_id.
'\').action=\
''.CUtil::AddSlashes(
$url).
'\';
';
605 return $res.'; BX.submit(document.forms.form_
'.$this->table_id.', \
''.CUtil::JSEscape($action_name).
'\', \
''.CUtil::JSEscape($action_value).
'\');
';
607 return $res.'; BX.submit(document.forms.form_
'.$this->table_id.');
';
610 public function ActionDoGroup($id, $action_id, $add_params='')
614 return $this->table_id.".GetAdminList('
".CUtil::AddSlashes($APPLICATION->GetCurPage())."?ID=
".CUtil::AddSlashes($id)."&action_button=
".CUtil::AddSlashes($action_id)."&
lang=
".LANGUAGE_ID."&
".bitrix_sessid_get().($add_params<>""?"&
".CUtil::AddSlashes($add_params):"")."');";
617 public function InitFilter($arFilterFields)
619 //Filter by link from favorites. Extract fields.
620 if(isset($_REQUEST['adm_filter_applied
']) && intval($_REQUEST['adm_filter_applied
']) > 0)
622 $dbRes = \CAdminFilter::GetList(array(), array('ID
' => intval($_REQUEST['adm_filter_applied
'])));
624 if($row = $dbRes->Fetch())
626 $fields = unserialize($row['FIELDS
'], ['allowed_classes
' => false]);
628 if(is_array($fields) && !empty($fields))
630 foreach($fields as $field => $params)
632 if(isset($params['value
']))
634 if(!isset($params['hidden
']) || $params['hidden
'] != 'true')
636 $GLOBALS[$field] = $params['value
'];
638 if($GLOBALS['set_filter
'] != 'Y
')
639 $GLOBALS['set_filter
'] = 'Y
';
647 $sTableID = $this->table_id;
648 global $del_filter, $set_filter, $save_filter;
649 if($del_filter <> "")
650 DelFilterEx($arFilterFields, $sTableID);
651 elseif($set_filter <> "")
653 InitFilterEx($arFilterFields, $sTableID, "set");
656 InitFilterEx($arFilterFields, $sTableID, "get");
658 foreach ($arFilterFields as $f)
660 $fperiod = $f."_FILTER_PERIOD";
661 $fdirection = $f."_FILTER_DIRECTION";
662 $fbdays = $f."_DAYS_TO_BACK";
664 global $$f, $$fperiod, $$fdirection, $$fbdays;
666 $this->filter[$f] = $$f;
667 if (isset($$fperiod))
668 $this->filter[$fperiod] = $$fperiod;
669 if (isset($$fdirection))
670 $this->filter[$fdirection] = $$fdirection;
672 $this->filter[$fbdays] = $$fbdays;
675 return $this->filter;
678 public function IsDefaultFilter()
681 $sTableID = $this->table_id;
682 return $set_default=="Y"
684 !isset($this->session["SESS_ADMIN"][$sTableID])
685 || empty($this->session["SESS_ADMIN"][$sTableID])
690 public function &AddRow($id = false, $arRes = Array(), $link = false, $title = false)
692 $row = new CAdminListRow($this->aHeaders, $this->table_id);
694 $row->arRes = $arRes;
696 $row->title = $title;
697 $row->pList = &$this;
701 if($this->bEditMode && in_array($id, $this->arEditedRows))
702 $row->bEditMode = true;
703 elseif(!empty($this->arUpdateErrorIDs) && in_array($id, $this->arUpdateErrorIDs))
704 $row->bEditMode = true;
707 $row->setPublicModeState($this->getPublicModeState());
709 $this->aRows[] = &$row;
713 public function AddFooter($aFooter)
715 $this->aFooter = $aFooter;
718 public function NavText($sNavText)
720 $this->sNavText = $sNavText;
729 public function setNavigation(\Bitrix\Main\UI\PageNavigation $nav, $title, $showAllways = true, $post = false)
735 $APPLICATION->IncludeComponent(
736 "bitrix:main.pagenavigation",
739 "NAV_OBJECT" => $nav,
742 "SHOW_ALWAYS" => $showAllways,
744 "TABLE_ID" => $this->table_id,
752 $this->NavText(ob_get_clean());
755 public function Display()
760 foreach(GetModuleEvents("main", "OnAdminListDisplay", true) as $arEvent)
761 ExecuteModuleEventEx($arEvent, array(&$this));
763 // Check after event handlers
764 if (!is_array($this->arActions))
766 $this->arActions = [];
768 if (!is_array($this->arActionsParams))
770 $this->arActionsParams = [];
774 foreach ($this->arFilterErrors as $err)
775 $errmsg .= ($errmsg<>''? '<br>
': '').$err;
776 foreach ($this->arUpdateErrors as $err)
777 $errmsg .= ($errmsg<>''? '<br>
': '').$err[0];
778 foreach ($this->arGroupErrors as $err)
779 $errmsg .= ($errmsg<>''? '<br>
': '').$err[0];
781 CAdminMessage::ShowMessage(array("MESSAGE"=>GetMessage("admin_lib_error"), "DETAILS"=>$errmsg, "TYPE"=>"ERROR"));
783 $successMessage = '';
784 for ($i = 0, $cnt = count($this->arActionSuccess); $i < $cnt; $i++)
785 $successMessage .= ($successMessage != '' ? '<br>
' : '').$this->arActionSuccess[$i];
786 if ($successMessage != '')
787 CAdminMessage::ShowMessage(array("MESSAGE" => GetMessage("admin_lib_success"), "DETAILS" => $successMessage, "TYPE" => "OK"));
789 echo $this->sPrologContent;
791 if($this->sContent===false)
794<div class="adm-list-table-wrap<?=$this->context ? '' : ' adm-list-table-without-header
'?><?= empty($this->arActions) && !$this->bCanBeEdited ? ' adm-list-table-without-footer
' : ''?>">
799 $this->context->Show();
801 if ($this->isAjaxDebug())
803 echo '<form method=
"POST" '
804 .($this->bMultipart?' enctype=
"multipart/form-data" ':'')
805 .' onsubmit=
"CheckWin();ShowWaitWindow();" target=
"frame_debug" id=
"form_'.$this->table_id.'" name=
"form_'.$this->table_id.'" '
806 .'action=
"'.htmlspecialcharsbx($APPLICATION->GetCurPageParam(
807 static::getModeActionUrlParam(),
808 [self::MODE_FIELD_NAME]
814 echo '<form method=
"POST" '
815 .($this->bMultipart?' enctype=
"multipart/form-data" ':'')
816 .' onsubmit=
"return BX.ajax.submitComponentForm(this, \''.$this->table_id.'_result_div\', true);" '
817 .'id=
"form_'.$this->table_id.'" name=
"form_'.$this->table_id.'" '
818 .'action=
"'.htmlspecialcharsbx($APPLICATION->GetCurPageParam(
819 static::getModeActionUrlParam(),
820 [self::MODE_FIELD_NAME, "action
", "action_button
"]
825 if($this->bEditMode && !$this->bCanBeEdited)
826 $this->bEditMode = false;
828 if($this->sContent!==false)
830 echo $this->sContent;
835 $bShowSelectAll = (!empty($this->arActions) || $this->bCanBeEdited);
836 $this->bShowActions = false;
837 foreach($this->aRows as $row)
839 if(!empty($row->aActions))
841 $this->bShowActions = true;
847 echo bitrix_sessid_post();
848 //echo $this->sNavText;
852<table class="adm-list-table" id="<?=$this->table_id;?>">
854 <tr class="adm-list-table-header">
858 <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" 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>
863 if($this->bShowActions):
865 <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>
870 foreach($this->aVisibleHeaders as $header):
871 $bSort = $this->sort && !empty($header["sort"]);
872 $header['
title'] = (string)($header['title'] ?? '');
875 $attrs = $this->sort->Show($header["content"], $header["sort"], $header["title"], "adm-list-table-cell");
877 $attrs = 'class=
"adm-list-table-cell"';
881 <div class="adm-list-table-cell-inner"><?=$header["content"]?></div>
891 if(!empty($this->aRows)):
892 foreach($this->aRows as $row)
896 elseif(!empty($this->aHeaders)):
898 <tr><td colspan="<?=$colSpan?>" class="adm-list-table-cell adm-list-table-empty"><?=GetMessage("admin_lib_no_data")?></td></tr>
905 $this->ShowActionTable();
907// close form and div.adm-list-table-wrap
909 echo $this->sEpilogContent;
914 echo $this->sNavText;
917 public function DisplayExcel()
925 <meta
http-equiv=
"Content-Type" content=
"text/html; charset='.LANG_CHARSET.'">
927 td {mso-number-format:\@;}
928 .number0 {mso-number-format:0;}
929 .number2 {mso-number-format:Fixed;}
934 echo "<table border=\"1\">";
937 foreach($this->aVisibleHeaders as $header)
940 echo $header["content"];
946 foreach($this->aRows as $row)
949 foreach($this->aVisibleHeaders as $id=>$header_props)
951 $field = $row->aFields[$id];
952 if(!is_array($row->arRes[$id]))
953 $val = trim($row->arRes[$id]);
955 $val = $row->arRes[$id];
957 switch($field["view"]["type"])
961 $val = htmlspecialcharsex(GetMessage("admin_lib_list_yes"));
963 $val = htmlspecialcharsex(GetMessage("admin_lib_list_no"));
966 if (isset($field["edit"]["values"][$val]))
968 $val = htmlspecialcharsex($field["edit"]["values"][$val]);
970 elseif (isset($field["view"]["values"][$val]))
972 $val = htmlspecialcharsex($field["view"]["values"][$val]);
976 $val = htmlspecialcharsex($val);
980 $arFile = CFile::GetFileArray($val);
981 if(is_array($arFile))
982 $val = htmlspecialcharsex((new Uri($arFile["SRC"]))->toAbsolute()->getUri());
987 $val = trim(strip_tags($field["view"]['value
'], "<br>"));
990 $val = htmlspecialcharsex($val);
995 if ($header_props['align'])
996 echo ' align=
"'.$header_props['align'].'"';
997 if ($header_props['valign
'])
998 echo ' valign=
"'.$header_props['valign'].'"';
999 if ($header_props['align'] === "right" && preg_match("/^([1-9][0-9]*|[1-9][0-9]*[.,][0-9]+)\$/", $val))
1000 echo ' class=
"number0"';
1002 echo ($val<>""? $val: '&
nbsp;
');
1009 echo '</body></html>
';
1012 public function AddGroupActionTable($arActions, $arParams=array())
1014 if (!is_array($arActions))
1018 if (!is_array($arParams))
1022 //array("action"=>"text", ...)
1023 //OR array(array("action" => "custom JS", "value" => "action", "type" => "button", "title" => "", "name" => ""), ...)
1024 $this->arActions = $arActions;
1025 //array("disable_action_target"=>true, "select_onchange"=>"custom JS")
1026 $this->arActionsParams = $arParams;
1029 public function ShowActionTable()
1031 if (empty($this->arActions) && !$this->bCanBeEdited)
1034<div class="adm-list-table-footer" id="<?=$this->table_id?>_footer<?=$this->bEditMode || !empty($this->arUpdateErrorIDs) ? '_edit
' : ''?>">
1035 <input type="hidden" name="action_button" id="<?=$this->table_id; ?>_action_button" value="" />
1037 if($this->bEditMode || !empty($this->arUpdateErrorIDs)):
1038 $this->DisplayEditButtons();
1039 else: //($this->bEditMode || count($this->arUpdateErrorIDs)>0)
1040 if (!isset($this->arActionsParams["disable_action_target"]) || $this->arActionsParams["disable_action_target"] !== true):
1042 <span class="adm-selectall-wrap"><input type="checkbox" class="adm-checkbox adm-designed-checkbox" name="action_target" value="selected" id="action_target" 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 for="action_target" class="adm-checkbox adm-designed-checkbox-label"></label><label title="<?=GetMessage("admin_lib_list_edit_for_all")?>" for="action_target" class="adm-checkbox-label"><?=GetMessage("admin_lib_list_for_all");?></label></span>
1046 $this->bCanBeDeleted = array_key_exists("delete", $this->arActions);
1048 if ($this->bCanBeEdited || $this->bCanBeDeleted)
1051 <span
class=
"adm-table-item-edit-wrap'.(!$this->bCanBeEdited || !$this->bCanBeDeleted ? ' adm-table-item-edit-single' : '').'">
1053 if($this->bCanBeEdited)
1055 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\')){document.forms[\'form_'.$this->table_id.'\'].elements[\'action_button\'].value=\'edit\'; '.
1056 htmlspecialcharsbx($this->ActionPost(false, 'action_button', 'edit')).'}" title=
"'.GetMessage("admin_lib_list_edit
").'" id=
"action_edit_button"></a>
';
1058 if($this->bCanBeDeleted)
1060 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((document.getElementById(\'action_target\') && document.getElementById(\'action_target\').checked? \''.GetMessage("admin_lib_list_del
").'\':\''.GetMessage("admin_lib_list_del_sel
").'\'))) {document.forms[\'form_'.$this->table_id.'\'].elements[\'action_button\'].value=\'delete\'; '.
1061 htmlspecialcharsbx($this->ActionPost(false, 'action_button', 'delete')).'}" title=
"'.GetMessage("admin_lib_list_del_title
").'" class=
"context-button icon action-delete-button-dis" id=
"action_delete_button"></a>
';
1069 if (isset($this->arActionsParams["select_onchange"]))
1071 if (is_array($this->arActionsParams["select_onchange"]))
1073 $onchange = implode(' ', $this->arActionsParams["select_onchange"]);
1075 elseif (is_string($this->arActionsParams["select_onchange"]))
1077 $onchange = $this->arActionsParams["select_onchange"];
1084 $actionList = array_filter($this->arActions);
1085 if (isset($actionList['delete']))
1087 unset($actionList['delete']);
1095 foreach($actionList as $k=>$v)
1099 if (isset($v['type
']) && isset($allowedTypes[$v['type
']]))
1104 $buttons .= '<input type=
"button" name=
"" value=
"'.htmlspecialcharsbx($v['name']).'" onclick=
"'.(!empty($v["action
"])? htmlspecialcharsbx($v['action']) : 'document.forms[\'form_'.$this->table_id.'\'].elements[\'action_button\'].value=\''.htmlspecialcharsbx($v["value
"]).'\'; '.htmlspecialcharsbx($this->ActionPost()).'').'" title=
"'.htmlspecialcharsbx($v["title"]).'" />
';
1107 $html .= '<span
class=
"adm-list-footer-ext">
'.$v["value"].'</span>
';
1113 $list .= '<option value=
"'.htmlspecialcharsbx($v['value']).'"'.($v['action
']?' custom_action=
"'.htmlspecialcharsbx($v['action']).'"':'').'>
'.htmlspecialcharsex($v['name
']).'</option>
';
1118 $list .= '<option value=
"'.htmlspecialcharsbx($k).'">
'.htmlspecialcharsex($v).'</option>
';
1121 unset($actionList, $k, $v);
1122 unset($allowedTypes);
1125 echo '<span
class=
"adm-list-footer-ext">
'.$buttons.'</span>
';
1129 <span class="adm-select-wrap">
1130 <select name="action" id="<?=$this->table_id.'_action
'; ?>" class="adm-select"<?=($onchange != '' ? ' onchange=
"'.htmlspecialcharsbx($onchange).'"':'')?>>
1131 <option value=""><?=GetMessage("admin_lib_list_actions")?></option>
1139 <input type="submit" name="apply" value="<?=GetMessage("admin_lib_list_apply")?>" onclick="if(this.form.action[this.form.action.selectedIndex].getAttribute('custom_action
')){eval(this.form.action[this.form.action.selectedIndex].getAttribute('custom_action
'));return false;}" disabled="disabled" class="adm-table-action-button" />
1141 endif; //(strlen($list) > 0)
1143 <span class="adm-table-counter" id="<?=$this->table_id?>_selected_count"><?=GetMessage('admin_lib_checked
')?>: <span>0</span></span>
1145 endif; // ($this->bEditMode || count($this->arUpdateErrorIDs)>0):
1151 public function DisplayList($arParams = array())
1153 $menu = new CAdminPopup($this->table_id."_menu", $this->table_id."_menu");
1156 if ($this->isAjaxDebug())
1161 window.open(
"about:blank",
"frame_debug");
1167 echo '<iframe src=
"javascript:\'\'" id=
"frame_'.$this->table_id.'" name=
"frame_'.$this->table_id.'" style=
"width:1px; height:1px; border:0px; position:absolute; left:-10px; top:-10px; z-index:0;"></iframe>
';
1170 $aUserOpt = CUserOptions::GetOption("global", "settings");
1171 if (!is_array($aUserOpt))
1175 $aUserOpt['context_ctrl
'] = (string)($aUserOpt['context_ctrl
'] ?? 'N
');
1176 $aUserOpt['context_menu
'] = (string)($aUserOpt['context_menu
'] ?? 'Y
');
1178 if (!is_array($arParams))
1179 $arParams = array();
1181 if (!isset($arParams['FIX_HEADER
']))
1182 $arParams['FIX_HEADER
'] = true;
1183 if (!isset($arParams['FIX_FOOTER
']))
1184 $arParams['FIX_FOOTER
'] = true;
1185 if (!isset($arParams['context_ctrl
']))
1186 $arParams['context_ctrl
'] = ($aUserOpt["context_ctrl"] === "Y");
1187 if (!isset($arParams['context_menu
']))
1188 $arParams['context_menu
'] = ($aUserOpt["context_menu"] !== "N");
1190 $tbl = CUtil::JSEscape($this->table_id);
1193window['<?=$tbl?>
'] = new BX.adminList('<?=$tbl?>
', <?= Json::encode($arParams) ?>);
1194BX.adminChain.addItems("<?=$tbl?>_navchain_div");
1198 echo '<div
id=
"'.$this->table_id.'_result_div" class=
"adm-list-table-layout">
';
1203 public function AddUpdateError($strError, $id = false)
1205 $this->arUpdateErrors[] = Array($strError, $id);
1206 $this->arUpdateErrorIDs[] = $id;
1209 public function AddGroupError($strError, $id = false)
1211 $this->arGroupErrors[] = Array($strError, $id);
1212 $this->arGroupErrorIDs[] = $id;
1215 public function AddActionSuccessMessage($strMessage)
1217 $this->arActionSuccess[] = $strMessage;
1220 public function AddFilterError($strError)
1222 $this->arFilterErrors[] = $strError;
1225 public function BeginPrologContent()
1230 public function EndPrologContent()
1232 $this->sPrologContent .= ob_get_contents();
1236 public function BeginEpilogContent()
1241 public function EndEpilogContent()
1243 $this->sEpilogContent .= ob_get_contents();
1247 public function BeginCustomContent()
1252 public function EndCustomContent()
1254 $this->sContent = ob_get_contents();
1258 public function CreateChain()
1260 return new CAdminChain($this->table_id."_navchain_div", false);
1266 public function ShowChain($chain)
1268 $this->BeginPrologContent();
1270 $this->EndPrologContent();
1273 public function CheckListMode()
1276 global $APPLICATION;
1278 if ($this->isPageMode())
1283 if ($this->isAjaxMode())
1287 $string = ob_get_contents();
1290 if ($this->isActionMode())
1293<html><head></head><body><?=$string?><script>
1294 var topWindow = (window.BX||window.parent.BX).PageObject.getRootWindow();
1295 topWindow.bxcompajaxframeonload = function() {
1296 topWindow.BX.adminPanel.closeWait();
1297 topWindow.<?=$this->table_id?>.Destroy(false);
1298 topWindow.<?=$this->table_id?>.Init();
1300 if(isset($this->onLoadScript)):
1302 topWindow.BX.evalGlobal('<?=CUtil::JSEscape($this->onLoadScript)?>
');
1307topWindow.BX.ajax.UpdatePageData({});
1308</script></body></html>
1313 if(isset($this->onLoadScript)):
1315<script><?=$this->onLoadScript?></script>
1321 define("ADMIN_AJAX_MODE", true);
1322 require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_after.php");
1325 elseif ($this->isExportMode())
1327 $fname = basename($APPLICATION->GetCurPage(), ".php");
1328 // http response splitting defence
1329 $fname = str_replace(array("\r", "\n"), "", $fname);
1331 header("Content-Type: application/vnd.ms-excel");
1332 header("Content-Disposition: filename=".$fname.".xls");
1333 $APPLICATION->EndBufferContentMan();
1334 $this->DisplayExcel();
1335 require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_after.php");
1340 protected function DisplayEditButtons(): void
1343 <input type="hidden" name="save" id="<?=$this->table_id?>_hidden_save" value="Y">
1344 <input type="submit" class="adm-btn-save" name="save" value="<?=GetMessage("admin_lib_list_edit_save")?>" title="<?=GetMessage("admin_lib_list_edit_save_title")?>" />
1345 <input type="button" onclick="BX('<?=$this->table_id?>_hidden_save
').name='cancel
'; <?=htmlspecialcharsbx($this->ActionPost(false, 'action_button
', ''))?> " name="cancel" value="<?=GetMessage("admin_lib_list_edit_cancel")?>" title="<?=GetMessage("admin_lib_list_edit_cancel_title")?>" />
1349 protected function isAjaxDebug(): bool
1352 $this->request->get('ajax_debugx
') === 'Y
'
1353 || (isset($this->session['AJAX_DEBUGX
']) && $this->session['AJAX_DEBUGX
'])
1357 protected static function getUrlWithLanguage(string $url, bool $safeMode = true): string
1359 if (!str_contains($url, 'lang=
'))
1361 $url .= (!str_contains($url, '?
') ? '?
' : '&
')
1362 .'lang=
'.LANGUAGE_ID
1367 ? CUtil::addslashes($url)
1372 protected static function getModeUrlParam(string $mode): string
1374 return self::MODE_FIELD_NAME . '=
' . $mode;
1377 protected static function getModeActionUrlParam(): string
1379 return static::getModeUrlParam(self::MODE_ACTION);
1382 protected static function getModeConfigUrlParam(): string
1384 return static::getModeUrlParam(self::MODE_CONFIG);
1387 protected static function getModeExportUrlParam(): string
1389 return static::getModeUrlParam(self::MODE_EXPORT);
1392 protected static function getModeParam(string $mode): array
1394 return [self::MODE_FIELD_NAME => $mode];
1397 protected static function getModeExportParam(): array
1399 return static::getModeParam(self::MODE_EXPORT);
1405 var $aHeaders = array();
1406 var $aHeadersID = array();
1407 var $aFields = array();
1408 var $aActions = array();
1410 var $indexFields = 0;
1413 var $bReadOnly = false;
1414 var $aFeatures = array();
1415 var $bEditMode = false;
1429 public function __construct(&$aHeaders, $table_id)
1431 $this->aHeaders = $aHeaders;
1432 $this->aHeadersID = array_keys($aHeaders);
1433 $this->table_id = $table_id;
1435 $this->setPublicModeState(defined('PUBLIC_MODE
') && PUBLIC_MODE == 1);
1440 public function setPublicModeState(bool $mode): void
1442 $this->isPublicMode = $mode;
1445 public function getPublicModeState(): bool
1447 return $this->isPublicMode;
1450 public function setConfig(array $config): void
1452 $this->config = $config;
1455 public function getConfig(): array
1457 return $this->config;
1460 public function getConfigValue(string $index)
1462 return $this->config[$index] ?? null;
1465 function SetFeatures($aFeatures)
1467 //array("footer"=>true)
1468 $this->aFeatures = $aFeatures;
1471 function AddField($id, $text, $edit=false, $isHtml = true)
1473 $this->aFields[$id] = array();
1474 if ($edit !== false)
1476 $this->aFields[$id]["edit"] = array("type" => "input", "value" => $edit);
1477 $this->pList->bCanBeEdited = true;
1479 $type = $isHtml ? "html" : "text";
1480 $this->aFields[$id]["view"] = array("type" => $type, "value" => $text);
1488 function AddCheckField($id, $arAttributes = Array())
1490 if($arAttributes!==false)
1492 $this->aFields[$id]["edit"] = Array("type"=>"checkbox", "attributes"=>$arAttributes);
1493 $this->pList->bCanBeEdited = true;
1495 $this->aFields[$id]["view"] = Array("type"=>"checkbox");
1504 function AddSelectField($id, $arValues = Array(), $arAttributes = Array())
1506 if($arAttributes!==false)
1508 $this->aFields[$id]["edit"] = Array("type"=>"select", "values"=>$arValues, "attributes"=>$arAttributes);
1509 $this->pList->bCanBeEdited = true;
1511 $this->aFields[$id]["view"] = Array("type"=>"select", "values"=>$arValues);
1519 function AddInputField($id, $arAttributes = Array())
1521 if ($arAttributes !== false)
1523 $arAttributes['
size'] = (int)($arAttributes['size'] ?? 0);
1524 $this->aFields[$id]["edit"] = Array("type"=>"input", "attributes"=>$arAttributes);
1525 $this->pList->bCanBeEdited = true;
1535 function AddCalendarField($id, $arAttributes = Array(), $useTime = false)
1537 if ($arAttributes!==false)
1539 $arAttributes['
size'] = (int)($arAttributes['size'] ?? 0);
1540 $this->aFields[$id]["edit"] = array("type"=>"calendar", "attributes"=>$arAttributes, "useTime" => $useTime);
1541 $this->pList->bCanBeEdited = true;
1550 function AddMoneyField($id, $arAttributes = [])
1552 if($arAttributes!==false)
1554 $this->aFields[$id]["edit"] = Array("type"=>"money", "attributes"=>$arAttributes);
1555 $this->pList->bCanBeEdited = true;
1559 function AddViewField($id, $sHTML)
1561 $this->aFields[$id]["view"] = Array("type"=>"html", "value"=>$sHTML);
1564 function AddEditField($id, $sHTML)
1566 $this->aFields[$id]["edit"] = Array("type"=>"html", "value"=>$sHTML);
1567 $this->pList->bCanBeEdited = true;
1575 function AddViewFileField($id, $showInfo = false)
1577 static $fileman = 0;
1579 CModule::IncludeModule('fileman
');
1581 $this->aFields[$id]["view"] = array(
1583 "showInfo" => $showInfo,
1586 'medialib
' => false,
1587 'file_dialog
' => false,
1590 'description
' => false,
1601 function AddFileField($id, $showInfo = false, $inputs = array())
1603 $this->aFields[$id]["edit"] = array(
1605 "showInfo" => $showInfo,
1606 "inputs" => $inputs,
1608 $this->pList->bCanBeEdited = true;
1609 $this->AddViewFileField($id, $showInfo);
1612 function AddActions($aActions)
1614 if (is_array($aActions))
1615 $this->aActions = $aActions;
1618 function __AttrGen($attr)
1621 foreach($attr as $name=>$val)
1622 $res .= ' '.htmlspecialcharsbx($name).'=
"'.htmlspecialcharsbx($val).'"';
1627 function VarsFromForm()
1629 return ($this->bEditMode && is_array($this->pList->arUpdateErrorIDs) && in_array($this->id, $this->pList->arUpdateErrorIDs));
1634 // Check after grid event handlers
1635 if (!is_array($this->aActions))
1637 $this->aActions = [];
1640 $sDefAction = $sDefTitle = "";
1642 if(!$this->bEditMode)
1644 if(!empty($this->link))
1646 $sDefAction = $this->getActionLink($this->link);
1647 $sDefTitle = $this->title;
1651 foreach($this->aActions as $action)
1653 if (isset($action["DEFAULT"]) && $action["DEFAULT"] == true)
1655 $sDefAction = $this->getActionsItemLink($action);
1656 $sDefTitle = (!empty($action["TITLE"])? $action["TITLE"] : $action["TEXT"]);
1662 $sDefAction = htmlspecialcharsbx($sDefAction);
1663 $sDefTitle = htmlspecialcharsbx($sDefTitle);
1667 if(!empty($this->aActions))
1668 $sMenuItems = htmlspecialcharsbx(CAdminPopup::PhpToJavaScript($this->aActions));
1670<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.'"':''):'')?>>
1673 if (!empty($this->pList->arActions) || $this->pList->bCanBeEdited):
1674 $check_id = RandString(5);
1676 <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="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>
1680 if($this->pList->bShowActions):
1681 if(!empty($this->aActions)):
1683 <td class="adm-list-table-cell adm-list-table-popup-block" onclick="BX.adminList.ShowMenu(this.firstChild, this.parentNode.oncontextmenu(), this.parentNode);"><div class="adm-list-table-popup" title="<?=GetMessage("admin_lib_list_actions_title")?>"></div></td>
1687 <td class="adm-list-table-cell"></td>
1692 end($this->pList->aVisibleHeaders);
1693 $last_id = key($this->pList->aVisibleHeaders);
1694 reset($this->pList->aVisibleHeaders);
1696 $bVarsFromForm = ($this->bEditMode && is_array($this->pList->arUpdateErrorIDs) && in_array($this->id, $this->pList->arUpdateErrorIDs));
1697 foreach($this->pList->aVisibleHeaders as $id=>$header_props)
1699 $field = $this->aFields[$id] ?? [];
1700 if ($this->bEditMode && isset($field["edit"]))
1702 if ($bVarsFromForm && isset($_REQUEST["FIELDS"]))
1704 $val = $_REQUEST["FIELDS"][$this->id][$id] ?? '';
1708 $val = $this->arRes[$id] ?? '';
1711 $val_old = $this->arRes[$id] ?? '';
1713 echo '<td
class=
"adm-list-table-cell',
1714 (isset($header_props['align']) && $header_props['align']? ' align-'.$header_props['align']: ''),
1715 (isset($header_props['valign']) && $header_props['valign']? ' valign-'.$header_props['valign']: ''),
1716 ($id === $last_id? ' adm-list-table-cell-last': ''),
1719 if(is_array($val_old))
1721 foreach($val_old as $k=>$v)
1722 echo '<input type=
"hidden" name=
"FIELDS_OLD['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']['.htmlspecialcharsbx($k).']" value=
"'.htmlspecialcharsbx($v).'">
';
1726 echo '<input type=
"hidden" name=
"FIELDS_OLD['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value=
"'.htmlspecialcharsbx($val_old).'">
';
1728 switch($field["edit"]["type"])
1731 echo '<input type=
"hidden" name=
"FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value=
"N">
';
1732 echo '<input type=
"checkbox" name=
"FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value=
"Y"'.($val=='Y
' || $val === true?' checked
':'').'>
';
1735 echo '<
select name=
"FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']"'.$this->__AttrGen($field["edit"]["attributes"]).'>
';
1736 foreach($field["edit"]["values"] as $k=>$v)
1737 echo '<option value=
"'.htmlspecialcharsbx($k).'" '.($k==$val?' selected':'').'>
'.htmlspecialcharsbx($v).'</option>
';
1741 if(!$field["edit"]["attributes"]["size"])
1742 $field["edit"]["attributes"]["size"] = "10";
1743 echo '<input type=
"text" '.$this->__AttrGen($field["edit"]["attributes"]).' name=
"FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value=
"'.htmlspecialcharsbx($val).'">
';
1746 if(!$field["edit"]["attributes"]["size"])
1747 $field["edit"]["attributes"]["size"] = "10";
1748 echo '<span
style=
"white-space:nowrap;"><input type=
"text" '.$this->__AttrGen($field["edit"]["attributes"]).' name=
"FIELDS['.htmlspecialcharsbx($this->id).']['.htmlspecialcharsbx($id).']" value=
"'.htmlspecialcharsbx($val).'">
';
1749 echo CAdminCalendar::Calendar(
1750 'FIELDS[
'.htmlspecialcharsbx($this->id).'][
'.htmlspecialcharsbx($id).']
',
1753 $field['edit
']['useTime
']
1757 echo CFileInput::Show(
1758 'FIELDS[
'.htmlspecialcharsbx($this->id).'][
'.htmlspecialcharsbx($id).']
',
1760 $field["edit"]["showInfo"],
1761 $field["edit"]["inputs"]
1765 echo $field["edit"]['value
'];
1771 $val = $this->arRes[$id] ?? '';
1772 if (is_string($val))
1777 if(isset($field["view"]))
1779 switch($field["view"]["type"])
1782 if($val == 'Y
' || $val === true)
1783 $val = htmlspecialcharsex(GetMessage("admin_lib_list_yes"));
1785 $val = htmlspecialcharsex(GetMessage("admin_lib_list_no"));
1788 if (isset($field["edit"]["values"][$val]))
1790 $val = htmlspecialcharsex($field["edit"]["values"][$val]);
1792 elseif (isset($field["view"]["values"][$val]))
1794 $val = htmlspecialcharsex($field["view"]["values"][$val]);
1798 $val = htmlspecialcharsex($val);
1803 $val = CFileInput::Show(
1804 'NO_FIELDS[
'.htmlspecialcharsbx($this->id).'][
'.htmlspecialcharsbx($id).']
',
1806 $field["view"]["showInfo"],
1807 $field["view"]["inputs"]
1813 $val = $field["view"]['value
'];
1816 $val = htmlspecialcharsex($val);
1822 $val = htmlspecialcharsex($val);
1825 echo '<td
class=
"adm-list-table-cell',
1826 (isset($header_props['align']) && $header_props['align']? ' align-'.$header_props['align']: ''),
1827 (isset($header_props['valign']) && $header_props['valign']? ' valign-'.$header_props['valign']: ''),
1828 ($id === $last_id? ' adm-list-table-cell-last': ''),
1830 echo ((string)$val <> ""? $val: '&
nbsp;
');
1831 if(isset($field["edit"]) && $field["edit"]["type"] == "calendar")
1832 CAdminCalendar::ShowScript();
1845 protected function getActionLink($url)
1847 global $adminSidePanelHelper;
1848 if (is_object($adminSidePanelHelper) && $adminSidePanelHelper->isPublicSidePanel())
1849 return "BX.adminSidePanel.onOpenPage('
".CUtil::JSEscape($url)."');";
1850 return "BX.adminPanel.Redirect([], '".CUtil::JSEscape($url)."', event);";
1857 protected function getActionsItemLink(array $item)
1859 return (!empty($item["ACTION"])
1861 : $this->getActionLink($item["LINK"])
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
GetSystemContextMenu(array $config=[])
__construct($table_id, $sort=false)
setPublicModeState(bool $mode)
ConvertFilesToEditFields()
AddVisibleHeaderColumn($id)
GetVisibleHeaderColumns()
ShowSettings($aAllCols, $aCols, $aOptions)
ActionPost($url=false, $action_name=false, $action_value='Y')
SetContextMenu(array $menu=[], array $additional=[], array $config=[])
AddAdminContextMenu($aContext=array(), $bShowExcel=true, $bShowSettings=true)
InitContextMenu(array $menu=[], array $additional=[])
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
<? if( $useEditor3):?>< tr class="heading">< td colspan="2"><? echo GetMessage("FILEMAN_OPTION_SPELL_SET");?></td ></tr ><? if(function_exists( 'pspell_config_create')):$use_pspell_checked=(COption::GetOptionString( $module_id, "use_pspell", "Y")=="Y") ? "checked" :"";?>< tr >< td valign="top">< label for="use_pspell"><?echo GetMessage("FILEMAN_OPTION_USE_PSPELL");?></label >< br >< a title="<?echo GetMessage("FILEMAN_OPTION_ADDISH_DICS_TITLE");?> http
Form FILTER_ACTION disabled
$_SERVER["DOCUMENT_ROOT"]
check_bitrix_sessid($varname='sessid')
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
GetMessage($name, $aReplace=null)
$GLOBALS['____1690880296']
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
<? endif;?> window document title
if(empty($signedUserToken)) $key
foreach($aAllCols as $header) $bEmptyCols