Page 1 of 1
404 из страницы админки
Posted: Fri Jan 23, 2009 9:48 am
by von-hamster
Когда пишу свой модуль, который использует роуты, иногда нужна 404 ошибка. Если просто поставить ErrorHandler404(); - то отображается пустая 404 без дизайна. Если в админке задать текст для 404 - то он отображается в дизайне по умолчанию, причем только для страниц не модуля. Добавление в .htaccess
ErrorDocument 404 /e404/ - не помогло.
Мне нужно было:
чтобы отображалась одинаковая 404 со своим дизайном и текстом, желательно, чтобы она была одной из страниц админки (использовать менюшки, ссылки, часть функционала).
Как я сделал (не очень красиво, но работает)...
1. создал новый шаблон для 404.
2. создал страницу в админке, исключил ее из отображаемых в меню (/e404/).
3. отключил галочку (Включить сообщение об ошибке 404:)
4. изменил функцию ErrorHandler404() в lib/misc.functions.php на:
Code: Select all
function ErrorHandler404() {
@ob_end_clean();
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
echo file_get_contents("http://{$_SERVER["HTTP_HOST"]}/e404/");
exit();
}
Теперь все ок!
Почему некрасиво? - для ошибки фактически делается 2 запроса страницы...
Может кому поможет
ЗЫ... Вообще - возможность использования одной из страниц в качестве 404 - неплохо было бы внести в админку, чтобы вместо echo file_get_contents сразу генерить страничку...
Re: 404 из страницы админки
Posted: Fri Jan 23, 2009 7:48 pm
by ZYV
von-hamster wrote: Добавление в .htaccess
ErrorDocument 404 /e404/ - не помогло.
И правильно, т.к. на самом-то деле страница найдена. URL Remote Fopen - это угроза безопасности, лучше, конечно, статический файл сделать. Как покрасивей решить - надо подумать. Может быть отдать 404 и потом Location: /404/ ? Хотя запроса всё равно 2 получается.
Re: 404 из страницы админки
Posted: Mon Jan 26, 2009 6:15 am
by von-hamster
Я имел ввиду, что в этом куске кода вызвать генерацию страницы... Например, в настройках выбрать страницу, которую отображать при 404, а здесь запускать обработку страницы.
Re: 404 из страницы админки
Posted: Wed Jan 28, 2009 1:24 am
by ZYV
А, да, хороший был бы вариант... кто бы патч сделал.
Re: 404 из страницы админки
Posted: Wed Jan 28, 2009 8:57 am
by von-hamster
Патчик прилагаю

Тока без названий пунктов (чтобы их добавить - нужно править языковые файлы).
Как пользовать:
В настройках сайта появятся 2 настройки:
enable404page - включает использование страницы в качестве 404.
selected404page - выбираем страницу из иерархии
Работает только при выключеном "Включить сообщение об ошибке 404"
Если вдруг не загрузится:
1. в admin/siteprefs.php (ревизия 5165, но скорее всего подойдет и для других)
Code: Select all
Ищем:
$enablecustom404 = "0";
if (isset($_POST["enablecustom404"])) $enablecustom404 = "1";
Добавляем после них:
$enable404page = "0";
if (isset($_POST["enable404page"])) $enable404page = "1";
$selected404page = "-1";
if (isset($_POST["selected404page"])) $selected404page = $_POST["selected404page"];
Ищем:
set_site_preference('defaultdateformat', $defaultdateformat);
Добавляем после них:
set_site_preference('enable404page', $enable404page);
set_site_preference('selected404page', $selected404page);
Ищем:
$frontendlang = get_site_preference('frontendlang');
$frontendwysiwyg = get_site_preference('frontendwysiwyg');
$nogcbwysiwyg = get_site_preference('nogcbwysiwyg');
Добавляем после них:
$enable404page = get_site_preference('enable404page');
$selected404page = get_site_preference('selected404page');
Ищем:
<div class="pageoverflow">
<p class="pagetext"><?php echo lang('globalmetadata')?>:</p>
<p class="pageinput"><textarea class="pagesmalltextarea" name="metadata" cols="80" rows="20"><?php echo $metadata?></textarea>
</p>
</div>
Добавляем после них:
<div class="pageoverflow">
<p class="pagetext"><?php echo lang('enable404page') ?>:</p>
<p class="pageinput"><input class="pagenb" type="checkbox" name="enable404page" <?php if ($enable404page == "1") echo "checked=\"checked\""?> /></p>
</div>
<div class="pageoverflow">
<p class="pagetext"><?php echo lang('selected404page')?>:</p>
<p class="pageinput">
<?php
$contentops =& $gCms->GetContentOperations();
echo $contentops->CreateHierarchyDropdown(0, $selected404page, 'selected404page');
?>
</p>
</div>
В lib/misc.functions.php (полностью меняем функцию ErrorHandler404 на)
Code: Select all
function ErrorHandler404()
{
#if ($errno == E_USER_WARNING) {
@ob_end_clean();
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
if ( get_site_preference('enable404page') ) {
global $gCms;
$smarty = $gCms->getSmarty();
$page = get_site_preference('selected404page');
$pageinfo = PageInfoOperations::LoadPageInfoByContentAlias($page);
$contentobj = new ContentBase();
$contentobj->LoadFromId($page, true);
$gCms->variables['pageinfo'] = $pageinfo;
$smarty->assign('content_obj', $contentobj);
echo $smarty->fetch('template:'.$pageinfo->template_id, $page);
} else {
echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<__html><head>
<title>404 Not Found</title>
</head></__body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<__body></__html>';
}
exit();
#}
}
Re: 404 из страницы админки
Posted: Wed Jan 28, 2009 11:02 am
by von-hamster
Очередная попытка выкладывания патча

.
На ревизии не смотреть - это мои локальные... Патч применяется на последнюю версию из svn, скорее всего подойдет и к другим.
admin/siteprefs.php
Code: Select all
Index: siteprefs.php
===================================================================
--- siteprefs.php (revision 2)
+++ siteprefs.php (revision 39)
@@ -73,6 +73,12 @@
$enablecustom404 = "0";
if (isset($_POST["enablecustom404"])) $enablecustom404 = "1";
+$enable404page = "0";
+if (isset($_POST["enable404page"])) $enable404page = "1";
+
+$selected404page = "-1";
+if (isset($_POST["selected404page"])) $selected404page = $_POST["selected404page"];
+
$xmlmodulerepository = "";
if (isset($_POST["xmlmodulerepository"])) $xmlmodulerepository = $_POST["xmlmodulerepository"];
@@ -212,6 +218,8 @@
}
set_site_preference('defaultdateformat', $defaultdateformat);
+ set_site_preference('enable404page', $enable404page);
+ set_site_preference('selected404page', $selected404page);
set_site_preference('custom404', $custom404);
set_site_preference('custom404template', $custom404template);
set_site_preference('enablesitedownmessage', $enablesitedownmessage);
@@ -237,6 +245,8 @@
$frontendlang = get_site_preference('frontendlang');
$frontendwysiwyg = get_site_preference('frontendwysiwyg');
$nogcbwysiwyg = get_site_preference('nogcbwysiwyg');
+ $enable404page = get_site_preference('enable404page');
+ $selected404page = get_site_preference('selected404page');
$enablecustom404 = get_site_preference('enablecustom404');
$custom404 = get_site_preference('custom404');
$custom404template = get_site_preference('custom404template');
@@ -391,6 +401,19 @@
</p>
</div>
<div class="pageoverflow">
+ <p class="pagetext"><?php echo lang('enable404page') ?>:</p>
+ <p class="pageinput"><input class="pagenb" type="checkbox" name="enable404page" <?php if ($enable404page == "1") echo "checked=\"checked\""?> /></p>
+ </div>
+ <div class="pageoverflow">
+ <p class="pagetext"><?php echo lang('selected404page')?>:</p>
+ <p class="pageinput">
+ <?php
+ $contentops =& $gCms->GetContentOperations();
+ echo $contentops->CreateHierarchyDropdown(0, $selected404page, 'selected404page');
+ ?>
+ </p>
+ </div>
+ <div class="pageoverflow">
<p class="pagetext"><?php echo lang('enablecustom404') ?>:</p>
<p class="pageinput"><input class="pagenb" type="checkbox" name="enablecustom404" <?php if ($enablecustom404 == "1") echo "checked=\"checked\""?> /></p>
</div>
lib/misc.functions.php
Code: Select all
Index: misc.functions.php
===================================================================
--- misc.functions.php (revision 38)
+++ misc.functions.php (revision 40)
@@ -190,6 +190,18 @@
@ob_end_clean();
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
+ if ( get_site_preference('enable404page') ) {
+ global $gCms;
+ unset($_REQUEST['mact']);
+ $smarty = $gCms->getSmarty();
+ $page = get_site_preference('selected404page');
+ $pageinfo = PageInfoOperations::LoadPageInfoByContentAlias($page);
+ $contentobj = new ContentBase();
+ $contentobj->LoadFromId($page, true);
+ $gCms->variables['pageinfo'] = $pageinfo;
+ $smarty->assign('content_obj', $contentobj);
+ echo $smarty->fetch('template:'.$pageinfo->template_id);
+ } else {
echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<__html><head>
<title>404 Not Found</title>
@@ -197,6 +209,7 @@
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<__body></__html>';
+ }
exit();
#}
}
Re: 404 из страницы админки
Posted: Wed Jan 28, 2009 11:08 am
by von-hamster
Если вдруг кто увидел пост, в котором был патч одним файлом - там была ошибка - не работало для роутов. Нужно добавить unset($_REQUEST['mact']);
Re: 404 из страницы админки
Posted: Thu Jan 29, 2009 3:00 pm
by von-hamster
И в догонку - если кто нашел (наткнулся на) ошибки - просьба написать о них...