13 $ID =
'1'.md5(uniqid(rand(),
true));
14 $strContent = serialize(
$params[
'arContent']);
15 $userID =
$USER->GetId();
19 'MODULE_ID' =>
$params[
'module'],
20 'UNDO_TYPE' =>
$params[
'undoType'],
21 'UNDO_HANDLER' =>
$params[
'undoHandler'],
22 'CONTENT' => $strContent,
24 'TIMESTAMP_X' => time(),
41 $cacheId = mb_substr(
$ID, 0, 3);
48 $arUndoCache =
array();
50 foreach ($arUndoList as
$ar)
52 if (!isset($arUndoCache[
$ar[
"ID"]]) && !isset($arUndoCache[
$ar[
"ID"]][
$ar[
"USER_ID"]]))
53 $arUndoCache[
$ar[
"ID"]][
$ar[
"USER_ID"]] =
$ar;
57 $arUndo = $arUndoCache[
$ID][
$USER->GetId()] ??
false;
63 if ($arUndo[
'MODULE_ID'] && $arUndo[
'MODULE_ID'] <>
'')
65 if (!CModule::IncludeModule($arUndo[
'MODULE_ID']))
70 $arParams = unserialize($arUndo[
'CONTENT'], [
'allowed_classes' =>
false]);
73 $p = mb_strpos($arUndo[
'UNDO_HANDLER'],
"::");
76 if (function_exists($arUndo[
'UNDO_HANDLER']))
78 call_user_func($arUndo[
'UNDO_HANDLER'],
array(
$arParams, $arUndo[
'UNDO_TYPE']));
83 $className = mb_substr($arUndo[
'UNDO_HANDLER'], 0,
$p);
84 if (class_exists($className))
86 $methodName = mb_substr($arUndo[
'UNDO_HANDLER'],
$p + 2);
87 if (method_exists($className, $methodName))
89 call_user_func_array(
array($className, $methodName),
array(
$arParams, $arUndo[
'UNDO_TYPE']));
104 $arOrder = $Params[
'arOrder'] ??
array(
'ID' =>
'asc');
107 "ID" =>
array(
"FIELD_NAME" =>
"U.ID",
"FIELD_TYPE" =>
"string"),
108 "MODULE_ID" =>
array(
"FIELD_NAME" =>
"U.MODULE_ID",
"FIELD_TYPE" =>
"string"),
109 "UNDO_TYPE" =>
array(
"FIELD_NAME" =>
"U.UNDO_TYPE",
"FIELD_TYPE" =>
"string"),
110 "UNDO_HANDLER" =>
array(
"FIELD_NAME" =>
"U.UNDO_HANDLER",
"FIELD_TYPE" =>
"string"),
111 "CONTENT" =>
array(
"FIELD_NAME" =>
"U.CONTENT",
"FIELD_TYPE" =>
"string"),
112 "USER_ID" =>
array(
"FIELD_NAME" =>
"U.USER_ID",
"FIELD_TYPE" =>
"int"),
113 "TIMESTAMP_X" =>
array(
"FIELD_NAME" =>
"U.TIMESTAMP_X",
"FIELD_TYPE" =>
"int"),
116 $arSqlSearch =
array();
124 $arSqlSearch[] =
"(U.ID like '".$DB->ForSql(
$val).
"')";
133 foreach ($arOrder as $by =>
$order)
135 $by = mb_strtoupper($by);
138 $strOrderBy .=
$arFields[$by][
"FIELD_NAME"].
' '.(mb_strtolower(
$order) ==
'desc'?
'desc':
'asc').
',';
144 $strOrderBy =
"ORDER BY ".rtrim($strOrderBy,
",");
169 $DB->Query(
"DELETE FROM b_undo WHERE ID='".
$DB->ForSql(
$ID).
"'");
179 $timestamp = mktime(date(
"H"), date(
"i"), 0, date(
"m"), date(
"d") - 1, date(
"Y"));
180 $DB->Query(
"delete from b_undo where TIMESTAMP_X <= ".$timestamp);
184 return "CUndo::CleanUpOld();";
196 if (!$session->isStarted() || !$session->has(
'BX_UNDO_ID'))
199 $ID = $session[
'BX_UNDO_ID'];
200 unset($session[
'BX_UNDO_ID']);
206 $arUndo = $arUndoList[0];
207 $detail =
GetMessage(
'MAIN_UNDO_TYPE_'.mb_strtoupper($arUndo[
'UNDO_TYPE']));
211window.BXUndoLastChanges = function()
213 if (!confirm(\"".GetMessage(
"MAIN_UNDO_ESCAPE_CHANGES_CONFIRM").
"\"))
216 BX.ajax.get(\"/bitrix/admin/public_undo.php?undo=".
$ID.
"&".
bitrix_sessid_get().
"\", null, function(result)
218 if (result && result.toUpperCase().indexOf(\"ERROR\") != -1)
219 BX.admin.panel.Notify(\"".
GetMessage(
"MAIN_UNDO_ESCAPE_ERROR").
"\");
221 window.location = window.location;
226 setTimeout(function()
228 BX.admin.panel.Notify('".$detail.
" <a href=\"javascript: void(0);\" onclick=\"window.BXUndoLastChanges(); return false;\" title=\"".
GetMessage(
"MAIN_UNDO_ESCAPE_CHANGES_TITLE").
"\">".
GetMessage(
"MAIN_UNDO_ESCAPE_CHANGES").
"</a>');
241 private $formId =
'';
242 private $autosaveId =
'';
244 private $bInited =
false;
246 private $bSkipRestore =
false;
248 private static $bAllowed =
null;
249 private static $arImportantParams =
array(
265 'QUESTION_TYPE' => 1,
272 if (
$USER->IsAuthorized())
276 $this->bSkipRestore =
true;
277 $this->autosaveId = preg_replace(
"/[^a-z0-9_]/i",
"",
$_REQUEST[
'autosave_id']);
281 $this->formId = self::_GetFormID();
284 addEventHandler(
'main',
'OnBeforeLocalRedirect',
array($this,
'Reset'));
286 if (!defined(
'BX_PUBLIC_MODE'))
293 public function Init($admin =
true)
297 if (!
$USER->IsAuthorized())
302 $DISABLE_STANDARD_NOTIFY = ($admin?
'false':
'true');
307 <input type=
"hidden" name=
"autosave_id" id=
"autosave_marker_<?=$this->GetID()?>" value=
"<?=$this->GetID()?>"/>
308 <script>window.autosave_<?=$this->
GetID()?> =
new top.BX.CAutoSave({
309 form_marker:
'autosave_marker_<?=$this->GetID()?>',
310 form_id:
'<?=$this->GetID()?>',
311 DISABLE_STANDARD_NOTIFY: <?=$DISABLE_STANDARD_NOTIFY?>
317 $this->bInited =
true;
324 $key = addEventHandler(
'main',
'OnAutoSaveRestore',
array($this,
'Restore'));
326 removeEventHandler(
'main',
'OnAutoSaveRestore',
$key);
333 if (!
$USER->IsAuthorized())
337 $DB->Query(
"DELETE FROM b_undo WHERE ID='".
$DB->ForSQL(
$ID).
"' AND USER_ID='".
$USER->GetID().
"'");
348 if (!
$USER->IsAuthorized())
356 'MODULE_ID' =>
'main',
357 'UNDO_TYPE' =>
'autosave',
358 'UNDO_HANDLER' =>
'CAutoSave::_Restore',
359 'CONTENT' => serialize(
$data),
360 'USER_ID' =>
$USER->GetID(),
361 'TIMESTAMP_X' => time(),
368 $rs =
$DB->QueryBind(
"UPDATE b_undo SET ".$strUpdate.
" WHERE ID = '".
$DB->ForSQL(
$ID).
"'", $arBinds);
369 if (
$rs->AffectedRowsCount() == 0)
384<script>BX.ready(
function(){
385 if (window.autosave_<?=$this->GetID();?>)
387 window.autosave_<?=$this->
GetID();?>.Restore(<?= Json::encode(
$arFields); ?>);
398 if (!$this->autosaveId)
400 $this->autosaveId =
'2'.md5($this->formId.
'|'.
$USER->GetID());
403 return $this->autosaveId;
406 private static function _GetFormID()
411 foreach ($_GET as $param => $value)
413 $param = strtoupper($param);
415 if (substr($param, -2) ==
'ID' || array_key_exists($param, self::$arImportantParams))
424 if (is_array($value))
425 $value = implode(
'|', $value);
427 $url .= urlencode($param).
'='.urlencode($value).
'&';
435 foreach (
GetModuleEvents(
"main",
"OnAutoSaveRestore",
true) as $arEvent)
445 if (!
$USER->IsAuthorized())
448 if (self::$bAllowed ==
null)
450 $arOpt = CUserOptions::GetOption(
'global',
'settings', []);
451 self::$bAllowed = (!isset($arOpt[
'autosave']) || $arOpt[
'autosave'] !=
'N') &&
$APPLICATION->GetCurPage() !=
'/bitrix/admin/update_system.php';
454 return self::$bAllowed;
static _Restore($arFields)
static Init($arExt=array(), $bReturn=false)
static ShowUndoMessage($ID)
static CheckNotifyMessage()
static Add($params=array())
static GetList($Params=array())
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
bx_acc_lim_group_list limitGroupList[] multiple<?=$group[ 'ID']?> ID selected margin top
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
bitrix_sessid_get($varname='sessid')
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']