page--404.tpl.php для Drupal 7

Ср, 16/05/2012 - 08:14

Чтобы создать свою кастомную страницу ошибки предлагаю следующий вариант:

1. В файл template.php добавляем код:

<?php
function MyTheme_preprocess_page(&$variables$hook) {   
  
$status drupal_get_http_header("status");  
  if(
$status == "404 Not Found") {      
    
$variables['theme_hook_suggestions'][] = 'page__404';
  }
  
    if(
$status == "403 Forbidden") {      
    
$variables['theme_hook_suggestions'][] = 'page__403';
  }
}
?>

2. Создаем файлы page--404.tpl.php & page--403.tpl.php и пичкаем их нужным вам кодом.
3. Profit.

0 Спасибо

Комментарии

Аватар пользователя Geldora
4 года 11 months назад Geldora #

Вроде как этот темплейт включен по умолчанию в Др.7. Не?

0 Спасибо
Аватар пользователя TurboPixel
4 года 11 months назад TurboPixel #

У меня без него не заводился.

0 Спасибо
Аватар пользователя drupby
4 года 11 months назад drupby #
TurboPixel написал:
Вроде как этот темплейт включен по умолчанию в Др.7. Не?

серьёзно? а я смотрю и не нахожу .
только про шаблоны страниц с ошибками уже писали http://www.drupal.ru/node/80502 .Зачем плодить дубли?

0 Спасибо
Аватар пользователя web09
4 года 9 months назад web09 #
drupby написал:
TurboPixel написал:
Вроде как этот темплейт включен по умолчанию в Др.7. Не?

серьёзно? а я смотрю и не нахожу .
только про шаблоны страниц с ошибками уже писали http://www.drupal.ru/node/80502 .Зачем плодить дубли?

Да, темплейта нет, но есть возможность создать ноды и переадресовать на них при 404 и 403 ошибке: Конфигурация - Информация о сайте

Кстати, можно ведь темизировать отдельную ноду, соответственно это будет то же самое что и page--404.tpl.php

0 Спасибо
Аватар пользователя petrovnn
4 года 9 months назад petrovnn #
web09 написал:
Да, темплейта нет, но есть возможность создать ноды и переадресовать на них при 404 и 403 ошибке: Конфигурация - Информация о сайте
Кстати, можно ведь темизировать отдельную ноду, соответственно это будет то же самое что и page--404.tpl.php

Совершенно верно. Более того, вариант, который предложил web09 гораздо лучше тем, что при создании шаблона ноды нам не придется плодить дубли шаблона page.tpl.php, в котором у нас между прочим шапка, подвал, меню и сайдбар, которые в случае правок придется править на всех этих шаблонах, что не есть гут. Другое дело, если ваша 404 содержит только сообщение об ошибке - тогда да, но я предпочитаю всегда оставлять всю навигацию, чтобы уменьшить показатель отказов. Если юзер увидит страницу на которой только сообщение об ошибки и никакой навигации по сайту - скорее всего он просто закроет вкладку

0 Спасибо
Аватар пользователя TurboPixel
4 года 9 months назад TurboPixel #
web09 написал:
Да, темплейта нет, но есть возможность создать ноды и переадресовать на них при 404 и 403 ошибке: Конфигурация - Информация о сайте
Кстати, можно ведь темизировать отдельную ноду, соответственно это будет то же самое что и page--404.tpl.php

Нет, это не будет page--404.tpl.php. Это будет стандартный page.tpl.php. В дизайне же page.tpl.php и страницы ошибки зачастую отличаются. Так что без отдельного темплейта не обойтись.

0 Спасибо
Аватар пользователя web09
4 года 9 months назад web09 #
TurboPixel написал:
Нет, это не будет page--404.tpl.php. Это будет стандартный page.tpl.php. В дизайне же page.tpl.php и страницы ошибки зачастую отличаются. Так что без отдельного темплейта не обойтись.

Если темизировать например page--node--50.tpl.php и в 50 ноде вывести ошибку 404 получим тот же результат на выходе, при чем стандартами друпала без допиливания

Как вы его темизируете не столь важно

0 Спасибо
Аватар пользователя petrovnn
4 года 9 months назад petrovnn #

я тоже не вижу смысла писать препроцесс для определения шаблона 404. Разве что для прокачки скилов - да, но для использования в каждом проекте есть более простое решение, о котором говорит web09.

На странице /admin/config/system/site-information можно задать две любые текстовые страницы, чтобы они играли роль 404 и 403, и переопределить их шаблоном page--node--50.tpl.php и page--node--51.tpl.php (в зависимости от того какие у вас будут NID для этих текстовых страниц)

Можно переопределить шаблон ноды (node) для этих страниц, а можно шаблон всей страницы (page)

0 Спасибо
Аватар пользователя TurboPixel
4 года 9 months назад TurboPixel #

Да, такой вариант тоже имеет место жить. Я как-то даже не задумывался :) Кому как удобнее.

0 Спасибо
Аватар пользователя mNigma@drupal.org
4 года 2 months назад mNigma@drupal.org #

Чет у меня такой вариант не работает. Что-то еще нужно сделать?
Скопировал код и не досмотрел, что у меня не $variables а $vars.

0 Спасибо
Аватар пользователя vkapas
3 года 1 month назад vkapas #

Подскажите, люди добрые, недобитому гуманитарию: из-за чего вышеописанный способ работает только на странице www.site.ru/404?

Проблема возникает при использовании темы  Bootstrap Barrio.

1. Я добавил авторский код в template.php.
Правда, не понял, с чем это связано, но код вызывал ошибку 500, пока я не добавил нижнее подчёркивание перед названием темы:

<?php
function _bootstrap_barrio_preprocess_page(&$variables$hook) {   
  
$status drupal_get_http_header("status");  
  if(
$status == "404 Not Found") {      
    
$variables['theme_hook_suggestions'][] = 'page__404';
  }
  
    if(
$status == "403 Forbidden") {      
    
$variables['theme_hook_suggestions'][] = 'page__403';
  }
}
?>

В самом template.php есть варианты как без _:
function bootstrap_barrio_preprocess_page(&$variables) {
так и с ним:
function _bootstrap_barrio_block_list($region) {

2. Создал в /sites/all/themes/bootstrap_barrio/templates кастомный шаблон page--404.tpl.php.

3. После чего на всех несуществующих страницах по-прежнему показывается стандартный шаблон 404-й ошибки. На всех, кроме одной страницы: www.site.ru/404 (и, кстати, кастомный шаблон на этой странице работает и без добавления кода ТС в template.php).

Что я делаю не так?

0 Спасибо
Аватар пользователя drupby
3 года 1 month назад drupby #
vkapas написал:
Правда, не понял, с чем это связано, но код вызывал ошибку 500, пока я не добавил нижнее подчёркивание перед названием темы:

потому что эта функция уже задекларирована - не нужно было ее по новой создавать , надо найти существующую и туда добавить код

0 Спасибо
Аватар пользователя vkapas
3 года 1 month назад vkapas #

Ура! Заработало, спасибо! :-)

В принципе, я догадывался, что проблема именно в этом, но не знал, как правильно впихнуть нужный мне код в уже существующий.

Я привёл вот это

<?php
function bootstrap_barrio_preprocess_page(&$variables) {
  
$variables['content_width'] = _bootstrap_barrio_content_width();
  
$variables['sidebar_first_width'] = 'col-md-' theme_get_setting('sidebar_first_width');
  
$variables['sidebar_second_width'] = 'col-md-' theme_get_setting('sidebar_second_width');
  if (
theme_get_setting('collapse')) {
    
$variables['collapse'] = 'collapse navbar-collapse';
  }
  else {
    
$variables['collapse'] = 'not-collapse';
  }
  if (!
theme_get_setting('print_content') && drupal_is_front_page()) {
    
$variables['print_content'] = FALSE;
  }
  else {
    
$variables['print_content'] = TRUE;
  }
}
?>

к этому виду

<?php
function bootstrap_barrio_preprocess_page(&$variables) {  
  
$status drupal_get_http_header("status");  
  if(
$status == "404 Not Found") {      
    
$variables['theme_hook_suggestions'][] = 'page__404';
  }
  
    if(
$status == "403 Forbidden") {      
    
$variables['theme_hook_suggestions'][] = 'page__403';
  }
  
$variables['content_width'] = _bootstrap_barrio_content_width();
  
$variables['sidebar_first_width'] = 'col-md-' theme_get_setting('sidebar_first_width');
  
$variables['sidebar_second_width'] = 'col-md-' theme_get_setting('sidebar_second_width');
  if (
theme_get_setting('collapse')) {
    
$variables['collapse'] = 'collapse navbar-collapse';
  }
  else {
    
$variables['collapse'] = 'not-collapse';
  }
  if (!
theme_get_setting('print_content') && drupal_is_front_page()) {
    
$variables['print_content'] = FALSE;
  }
  else {
    
$variables['print_content'] = TRUE;
  }
}
?>

Подскажите, пжста, правильно ли я сделал?

0 Спасибо
Аватар пользователя W_A_S_A_B_I
2 года 7 months назад W_A_S_A_B_I #
vkapas написал:
Ура! Заработало, спасибо! :-)

В принципе, я догадывался, что проблема именно в этом, но не знал, как правильно впихнуть нужный мне код в уже существующий.

Я привёл вот это

<?php
function bootstrap_barrio_preprocess_page(&$variables) {
  
$variables['content_width'] = _bootstrap_barrio_content_width();
  
$variables['sidebar_first_width'] = 'col-md-' theme_get_setting('sidebar_first_width');
  
$variables['sidebar_second_width'] = 'col-md-' theme_get_setting('sidebar_second_width');
  if (
theme_get_setting('collapse')) {
    
$variables['collapse'] = 'collapse navbar-collapse';
  }
  else {
    
$variables['collapse'] = 'not-collapse';
  }
  if (!
theme_get_setting('print_content') && drupal_is_front_page()) {
    
$variables['print_content'] = FALSE;
  }
  else {
    
$variables['print_content'] = TRUE;
  }
}
?>

к этому виду

<?php
function bootstrap_barrio_preprocess_page(&$variables) {  
  
$status drupal_get_http_header("status");  
  if(
$status == "404 Not Found") {      
    
$variables['theme_hook_suggestions'][] = 'page__404';
  }
  
    if(
$status == "403 Forbidden") {      
    
$variables['theme_hook_suggestions'][] = 'page__403';
  }
  
$variables['content_width'] = _bootstrap_barrio_content_width();
  
$variables['sidebar_first_width'] = 'col-md-' theme_get_setting('sidebar_first_width');
  
$variables['sidebar_second_width'] = 'col-md-' theme_get_setting('sidebar_second_width');
  if (
theme_get_setting('collapse')) {
    
$variables['collapse'] = 'collapse navbar-collapse';
  }
  else {
    
$variables['collapse'] = 'not-collapse';
  }
  if (!
theme_get_setting('print_content') && drupal_is_front_page()) {
    
$variables['print_content'] = FALSE;
  }
  else {
    
$variables['print_content'] = TRUE;
  }
}
?>

Подскажите, пжста, правильно ли я сделал?

Мужик спасибо!!! ты не представляешь как помог

0 Спасибо