Upd: English version of the article: Custom 404 error page in Joomla 2.5.


Тема, вынесенная в заголовок статьи, вроде бы описана и обсуждена в сети множество раз. И тем не менее, как это зачастую бывает, информация в каждом источнике неполна. Общая картина складывается из разрозненных сведений, а некоторые частные глюки, с которыми мне пришлось столкнуться, не освещены вообще, - по крайней мере, я такового освещения не нашел и придумал свое решение. Поэтому цель данной статьи (как и всех прочих) - собрать воедино инфу из инета, структурировать, дополнить собственным опытом и передать на суд сетевой общественности.

Дефолтная джумловская страница 404 не вписана в шаблон и загромождена кучей малоинтересной для посетителя технической информации:

default-page-404

Единственная ссылка на домашнюю страницу может даже не броситься в глаза. Заблудший гость с матами закрывает ваш сайт, фактически на нем не побывав. Нужно немедленно исправить этот балаган.

Цель: создать информативную страницу (в случае мультиязычности - для каждого из языков), сохранив структуру сайта, но при этом сделать ее отдельной - убрать навигацию Предыдущая - Следующая, не выводить хлебные крошки, кнопки соцсетей, но оставить комментарии. Также убираем всю инфу об авторе, дате создания, количестве просмотров (последнюю - особенно! ;)). При этом в адресной строке должен оставаться неверный адрес, вбитый посетителем.

К слову, некто Артемий Лебедев настаивает, что, цитирую, "нельзя допускать, чтобы несуществующую страницу путали с обычной. Поэтому на странице с ошибкой не должно быть основного меню сайта, верстки и цветов типовой страницы". Ну, не знаю. Можно, конечно, отвязать модуль главного меню по тому же принципу, что описан здесь для модуля навигатора, а также соорудить отдельный шаблон для страницы ошибки. Я предпочел этого не делать, поэтому в дальнейшем останавливаться на этом не буду.

Итак, перейдем к процессу. Отмечу лишь, что, как автор двуязычного сайта на момент написания (а в дальнейшем не исключаю добавления новых языков), код страницы ошибки я сваял с учетом многоязычности. Описывать процесс буду только для одного языка (в моем примере - русского), для возможных остальных он должен быть просто повторен с заменой суффикса ru на соответствующий.

Поэтапно и пошагово:

Этап 1: Создание и подключение страниц 404 для каждого языка сайта.

  1. Создаем категорию 404-ru. Язык категории, соответственно - Русский. Сохраняем.
  2. Создаем новый материал. Название на каждом из языков можно задавать просто 404, разниться они будут идентификаторами материалов. Категорию для данного выбираем 404-ru. Язык - опять же Русский. В текст материала вносим симпатичное и информативное содержимое, создать которое вам помогает ваша креативная фантазия. Во вкладке Параметры отображения материала | Article Options - скрываем все, что можно:
  3. article-options

  4. Жмем Сохранить | Save. Генерируется ID материала - запоминаем его:

article-id

  1. Редактируем джумловский файл ошибки 404. Его расположение: [корень_сайта]\templates\system\error.php. Удаляем содержимое файла и копируем в него следующий код:
<?php
defined('_JEXEC') or die;
$errpages_by_lang = array(
  array('language'=>'ru-Ru', 'lang'=>'ru', 'page'=>'80'),
  array('language'=>'en-Gb', 'lang'=>'en', 'page'=>'448')
);
$cur_language = JFactory::getDocument()->language;
$sef_is_on = &JFactory::getConfig()->sef == 1;
for ($i=0, $n=sizeof($errpages_by_lang); $i<$n; $i++) {
  if (strtolower($errpages_by_lang[$i]['language']) == strtolower($cur_language) || $i == $n-1) {
    if ($sef_is_on)
      echo file_get_contents(JURI::root().$errpages_by_lang[$i]['lang'].'/'.$errpages_by_lang[$i]['page']);
    else
      echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id='.$errpages_by_lang[$i]['page'].'&lang='.$errpages_by_lang[$i]['lang']);
    break;
  }
}
?>

Ключ 'page' в массиве каждого языка содержит ID материала. Заменяете в нем мой (80) на ваш, запомненный на предыдущем этапе. Остановлюсь подробнее, какие значения присваиваются ключам 'language' и 'lang'. Идем в меню Расширения | Extensions -> Менеджер языков | Language Manager -> Языки контента | Content. Там кликаем на соответствующий язык, открывая тем самым страницу редактирования языка. В типичном виде она выглядит так:

content-language

Из нее и заполняем массив. Ключ 'language' принимает значение параметра Тег языка | Language Tag, 'lang' соответствует параметру Код языка для URL | URL Language Code. При необходимости отредактируйте значения этих двух ключей для каждого языка в соответствии с вашими настройками.

Сохраняем изменения в файле error.php. Если сайт одноязычный - следующий пункт пропускайте.

  1. Повторяем все вышеописанные действия для остальных языков сайта. При этом, чтобы не выставлять настройки по-новой, удобно воспользоваться опцией копирования материалов:

copy-article

Редактирование файла ошибки, понятно, включает теперь только добавление (или изменение) массива нового языка как элемента массива языков и редактирование ключей. 448 - ID моей английской страницы 404, меняете как и прежде на свой. Ну и с тегами языка соответственно.

Итак, страницы 404 для всех языков сайта созданы и подключены. Для тестирования наберем в адресной строке проводника что-нибудь вроде http://ogri.me/несуществующая страница. Редирект на нашу кастомную страницу ошибки работает. Переходим к следующему этапу.

Этап 2: Настройка интерфейса страниц 404.

  1. Навигации нет как класса, поскольку наш материал - единственный в категории. Но вот хлебные крошки здесь абсолютно ни к чему. Как убрать их с определенной страницы, подробно описано в статье Joomla 2.5: Убираем хлебные крошки с выбранных страниц как раз на примере страницы ошибки 404.
  2. Оставить ли кнопки социальных сетей - каждый решает для себя сам. Возможно, вы сделаете настолько красивую 404-ю страницу, что восторженный посетитель захочет запостить линк на нее как на образец. Я же предпочитаю убрать и их, чтобы заблудившийся читатель моего ресурса не задерживался здесь, а поскорее переходил к основному контенту. Поскольку, как я уже писал, я встраиваю соцкнопки ручками, так же ручками я их выборочно отключаю. Методика описана в статье Кнопки социальных сетей в Joomla 2.5. Выборочное размещение. Кто использует плагины от сторонних производителей, должен найти в них соответствующую опцию (буде таковая есть) или влезть в код и внести свои изменения.
  3. А вот комментарии подключить, на мой взгляд, полезно. В тексте страницы также можно предложить промахнувшемуся страницей путешественнику высказать в них свое "фе". В JComments - просто добавляем категории 404-ru и 404-en раздельно по языкам в список Настройки | Settings -> Общие | General -> Категории | Categories -> Включить комментарии в категориях | Choose categories for JComments to work in. Как в других компонентах комментариев - не знаю, не пользовался и не планирую: JComments - однозначно лучший.

Теперь отдельно - об одном неприятном моменте, с которым я столкнулся во время тестирования, и упоминание о котором не встречал в статьях на данную тему. Если в неверном адресе страницы присутствует одинарная кавычка, вылетает Fatal error типа "Неотработанное исключение". Возможно, в новых версиях Джумлы это поправят, а пока пришлось вставить костыль, благо сообщение о фатальной ошибке вполне информативно и наводит на файл (\libraries\joomla\environment\uri.php) и номер строки в нем (194), где собака порылась. Открываем файл на редактирование, находим следующий фрагмент кода:

// Check for quotes in the URL to prevent injections through the Host header
if ($theURI !== str_replace(array("'", '"', '<', '>'), '', $theURI))
{
    throw new InvalidArgumentException('Invalid URI detected.');
}

Из него ясно, что в случае, когда URL включает одинарные или двойные кавычки, а также символы < или >, обрамляющие теги в маркапе HTML, генерируется то самое исключение. При этом, когда я пробовал вбивать ", < или >, меня вообще выбрасывало в Error 403 - Access forbidden. Я заменил вышеприведенный кусок кода на единственную строку:

$theURI = str_replace(array("'", '"', '<', '>'), '', $theURI);

То есть вместо проверки на вредные символы и выбрасывания исключения просто удалил их из адреса. Теперь даже при наличии их в URL откроется наша кастомная 404-я страница. При этом в адресной строке браузера всё введенное пользователем остается без изменения, что хорошо: он даже не догадывается о наших манипуляциях.

Вот теперь созданная и настроенная страница 404 приняла божеский вид. Промазавший по клавише или перешедший по мертвой ссылке посетитель не чувствует себя заблудившимся, а ваш сайт имеет все шансы заманить его на свои просторы. Главное теперь, чтобы информация на этих просторах была интересной и познавательной. Ну, тут уж вам и карты в руки.

Комментарии  

Карина
+2 # Карина 30.10.2013 11:02
Ув. автор, у меня к вам такой вопрос.
Когда вы попадаете на страницу 404, и не уходя с нее пытаетесь авторизоваться на сайте, выдается ошибка "Неверный параметр" на белом экране.
Как решить эту ошибку?
(На вашем сайте она тоже есть.)
Ответить | Ответить с цитатой | Цитировать
Ogri
+3 # Ogri 30.10.2013 16:31
Ув. Карина, вы правы. Есть такой эффект. Может быть, выберу время - поковыряю. Пока же отвязал модуль авторизации от страниц ошибок вручную. Возможно, это самое лучшее и простое решение замеченного вами побочного эффекта. Обязательно дополню статью, спасибо вам за внимательность и наводку.
Ответить | Ответить с цитатой | Цитировать
Сергей
0 # Сергей 17.06.2014 04:46
Здравствуйте.
Я просто скопировал главную страницу в файл error.php, получилось сообщение об ошибке не нарушая общий вид сайта, можно посмотреть: http://sohranay.ru или http://stroydostavka54.ru
Ответить | Ответить с цитатой | Цитировать
Мария
-2 # Мария 17.06.2014 04:57
Спасибо за статью . Познавательно ! А вот здесь можно посмотреть интересное решение для 404 страницы http://kvinta-a.ru/stranitsa-404/
Ответить | Ответить с цитатой | Цитировать
Андрей
0 # Андрей 23.07.2014 14:46
В коде не хватает запятой после определения второго языка.
Ответить | Ответить с цитатой | Цитировать
Ogri
+1 # Ogri 23.07.2014 15:11
После последнего элемента массива запятая, как известно, является опциональной.
Ответить | Ответить с цитатой | Цитировать
jeriki
0 # jeriki 28.05.2015 04:36
Здравствуйте! Все сделала по инструкции и все работает. Спасибо большое! Но есть один нюанс. У меня отображается сначала заголовок Материалы, а лишь потом написанный текст. Joomla 2.5.6. В параметрах отображения материала все скрыто. Как это можно исправить? Заранее благодарю за ответ:)
Ответить | Ответить с цитатой | Цитировать
Ogri
+1 # Ogri 28.05.2015 11:32
У меня тоже такое было. Нашел тогда в Сети решение: в файле \languages\ru-RU.ini находим строку JGLOBAL_ARTICLES="Материалы" и заменяем на JGLOBAL_ARTICLES="". То же для остальных языков в случае мультиязычного сайта. Так и тянул, восстанавливая это изменение после каждого обновления языковых пакетов. Как перешел на третью Джумлу, надобность в редактировании ru-RU.ini пропала сама собой - видимо, это был баг, который разработчики исправили в новой версии CMS.

Вы ипользуете Joomla 2.5.6 сейчас, когда последний билд второй с половиной Джумлы - 2.5.28 (и он последний во всех смыслах - разработка и поддержка 2.5 прекращены с декабря прошлого года). Значит, вы не обновляетесь. Понятно, что почти в каждом обновлении разработчики, исправляя старые баги, вносят новые, зачастую еще более жестокие. В 2.5.17 они напортачили с роутером и не исправляли в нескольких следующих. После обновлений приходилось возвращать роутер из 2.5.16, иначе сбивались многие ссылки. Обновления - головняк тот еще, но без них еще хуже: уязвимости в безопасности старых версий давно известны, трояны, их использующие, толпами кишат в Сети. Рано или поздно вас хакнут, как дважды хакнули меня в свое время.

Я бы на вашем месте обновился как минимум до 2.5.28, а как максимум - перешел бы на третью Джумлу. В Инете полно информации на эту тему, я сам сейчас готовлю статью по миграции с 2.5 на последний билд тройки. Попробуйте для начала 2.5.28. Естественно, прежде чем переносить изменения на реальный хостинг, тестируйте тщательно на локальном.
Ответить | Ответить с цитатой | Цитировать
jeriki
0 # jeriki 02.06.2015 08:55
Спасибо большое! Рекомендация помогла:) Все получилось) А вот идею обновления я вынашиваю, но все пока что не решусь:) Одно лечим - другое калечим :lol: . Именно это и пугает.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 03.06.2015 01:45
Совершенно верно. Но рано или поздно придется. Переходите от вынашивания к планированию :-)
Ответить | Ответить с цитатой | Цитировать
Иван
0 # Иван 22.06.2016 03:54
Такая же проблема была в Joomla 3.4.3
Предложенное решение отлично работает.
Спасибо!
Ответить | Ответить с цитатой | Цитировать
appleflower
0 # appleflower 14.08.2015 14:40
Здравствуйте Олег. У меня вопрос по поводу модуля JCOMMENTS. Установила на joomla 2.5.4 настроила. Но при заполнении формы на странице кнопка "Отправить" не работает. И комментарии не появляется. Помогите, в чем может быть проблема?
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 15.08.2015 05:04
Здравствуйте. Проблема может быть в чем угодно. Навскидку сказать не могу. Могу зайти через TeamViewer и попробовать разобраться. Если согласны, пишите в личку. Верхнее меню, обратная связь.
Ответить | Ответить с цитатой | Цитировать
Ирина
0 # Ирина 06.03.2016 15:43
Спасибо, за статью.! В очередной раз воспользовалась инструкцией на очередном сайте и все Ок? 404 страница работает!
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 06.03.2016 17:00
Ирина, на здоровье! Но публиковать в таком контексте адрес сайта не стану - ваша благодарность очень явно выглядит лишь поводом разместить ссылку. Поэтому убил ее, уж извините.
Ответить | Ответить с цитатой | Цитировать
Иван
0 # Иван 22.06.2016 02:52
Ув. автор, спасибо за интересный вариант решения данной проблемы.
Но, столкнулся с одной проблемкой - как настроить тайтл этой страницы?
Joomla 3.4.3
http://restoraneva.ru/
Ответить | Ответить с цитатой | Цитировать

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


© 2011-2017 ogri.me
Использование и перепечатка материалов сайта разрешены и приветствуются. Прямая индексируемая ссылка на используемую статью или, на худой конец, на сам сайт была бы хорошей наградой автору за его нелегкий труд.