Подключение своих шаблонов для страниц 403 и 404

вт, 24.04.2012 17:33 :: olk

Есть несколько способов создать свои «красивые» страницы для ошибок 403 и 404. Я расскажу как я это делал через переопределение шаблона. 1. В каталоге текущей темы создаем шаблон (файл) для вывода страницы с ошибкой Я его назвал page--error.tpl.php Содержимое файла самое простое:

  1. <?php
  2. /**
  3.  * @file
  4.  * $error_code - Error num (403 or 404)
  5.  * $error_content - HTML error content
  6.  */
  7. ?>
  8. <div class="page clearfix" id="page-<?php print $error_code;?>">
  9. <div class="content-page-<?php print $error_code;?>">
  10. <h2>
  11. <?php print l($site_name, '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE)); ?>
  12. </h2>
  13. <h1><?php print $error_code;?></h1>
  14. <?php print render($error_content); ?>
  15. </div>
  16. </div>

2. В файле template.php создаем (или изменяем) две функции Имя_Вашей_темы_preprocess_html(&$vars) и Имя_Вашей_темы_preprocess_page(&$vars) Моя тема называется olkit, соответственно и функции будут:

  1. function olkit_preprocess_html(&$vars) {
  2.   $header = drupal_get_http_header();
  3.   if (isset($header['status']) && ($header['status']=='403 Forbidden' || $header['status']=='404 Not Found')) {
  4.           $vars['attributes_array']['class'][] = 'page-error';
  5.   }
  6. }
В данной функции я просто добавляю к тэгу body - дополнительный класс page-error, он мне понадобился для дальнейшего оформления страницы посредством CSS, если вам этого не надо, то можно не переопределять данную функцию.

И наконец основная функция, где мы переопределяем шаблон и заполняем необходимые переменные для обработки в шаблоне.

  1. function olkit_preprocess_page(&$vars) {
  2.     $header = drupal_get_http_header();
  3.     if (isset($header['status']) && $header['status']=='403 Forbidden') {
  4.      $vars['theme_hook_suggestions'][0] = "page__error";
  5.      $vars['error_code'] = 403;
  6.      $error_content = "<h6> У вас нет доступа на страницу, которую вы запросили.";
  7.      $error_content .= "Возможно, вы ошиблись при наборе адреса, перешли по неверной ссылке или для доступа к данной странице необходимо зарегистрироваться.</h6>";
  8.      $error_content .= "<ul><li>проверьте правильность написания адреса</li>";
  9.      $error_content .= "<li>воспользуйтесь главной страницей ";
  10.      $error_content .= l('Отель «У старого программиста»', '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE));
  11.      $error_content .= "</li><li>Зарегистрируйтесь на нашем сайте ";
  12.      $error_content .= l('Войти', 'user/login', array('attributes' => array('title' => t('Login')), 'html' => TRUE));
  13.      $error_content .= " | ";
  14.      $error_content .= l('Зарегистрироваться', 'user/register', array('attributes' => array('title' => t('Login')), 'html' => TRUE));
  15.      $error_content .= "</li></ul>";
  16.      $vars['error_content'] = $error_content;
  17.     }
  18.     if (isset($header['status']) && $header['status']=='404 Not Found') {
  19.      $vars['theme_hook_suggestions'][0] = "page__error";
  20.      $vars['error_code'] = 404;
  21.      $error_content = "<h6> Страница, которую вы запросили, отсутствует на нашем сайте.";
  22.      $error_content .= "Возможно, вы ошиблись при наборе адреса или перешли по неверной ссылке.</h6>";
  23.      $error_content .= "<ul><li>проверьте правильность написания адреса</li>";
  24.      $error_content .= "<li>воспользуйтесь главной страницей";
  25.      $error_content .= l('Отель «У старого программиста»', '<front>', array('attributes' => array('title' => t('Home')), 'html' => TRUE));
  26.      $error_content .= "</li></ul>";
  27.      $vars['error_content'] = $error_content;
  28.     }
  29. }
Важный момент: строка $vars['theme_hook_suggestions'][0] = "page__error"; определяет какой файл будет применен в качестве шаблона страницы, при этом имя файл шаблона строиться следующим образом, в значении page__error - подчеркивания заменяются на дифисы и добавляется расширение .tpl.php, таким образом для значения page__error файл должен иметь имя page--error.tpl.php

Далее посредством CSS настраиваем внешний вид страниц. Вот и все, сбрасываем кэш и смотрим что у нас получилось.

Комментарии

А возможно ли, чтобы друпал возвращал HTTP-код ответа сервера 400, а не 200, как это и должно бы быть по логике вещей?

А он и будет 400-ый, заголовок то страницы не меняется

Наверно, проще сделать так, как указал в комментариях web09 на сайте друпал.ру

Не нашел отличий :)

Спасибо за статью! Подскажите, в файле .htaccess ничего менять не нужно? Что-то у меня ничего не получилось (шаблон не подхватывается)

Всё, разобрался. Наверное где-то синтакс. ошибка вкралась :PARDON:

Добавить комментарий
« Добавить комментарий
» Добавить комментарий