404 из страницы админки

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

404 из страницы админки

Post 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 сразу генерить страничку...
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: 404 из страницы админки

Post by ZYV »

von-hamster wrote: Добавление в .htaccess
ErrorDocument 404 /e404/ - не помогло.
И правильно, т.к. на самом-то деле страница найдена. URL Remote Fopen - это угроза безопасности, лучше, конечно, статический файл сделать. Как покрасивей решить - надо подумать. Может быть отдать 404 и потом Location: /404/ ? Хотя запроса всё равно 2 получается.
unsigned double ZYV;
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: 404 из страницы админки

Post by von-hamster »

Я имел ввиду, что в этом куске кода вызвать генерацию страницы... Например, в настройках выбрать страницу, которую отображать при 404, а здесь запускать обработку страницы.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: 404 из страницы админки

Post by ZYV »

А, да, хороший был бы вариант... кто бы патч сделал.
unsigned double ZYV;
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: 404 из страницы админки

Post 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();
	#}
}
Attachments

[The extension txt has been deactivated and can no longer be displayed.]

von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: 404 из страницы админки

Post 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();
 	#}
 }
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: 404 из страницы админки

Post by von-hamster »

Если вдруг кто увидел пост, в котором был патч одним файлом - там была ошибка - не работало для роутов. Нужно добавить unset($_REQUEST['mact']);
von-hamster
Power Poster
Power Poster
Posts: 339
Joined: Thu Nov 01, 2007 3:11 pm

Re: 404 из страницы админки

Post by von-hamster »

И в догонку - если кто нашел (наткнулся на) ошибки - просьба написать о них...
Post Reply

Return to “Russian - русский”