Форум русской поддержки Joomla!® CMS
11.12.2016, 08:15:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Поговорим о выводе ошибок в Joomla?

 (Прочитано 406 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« : 12.02.2016, 21:45:22 »

Недавний топик побудил меня подумать о стандартном выводе ошибок через файл шаблона error.php. В этой теме приведена ссылка на мануал, в котором, на мой взгляд, описан вредный хак, а не способ реализации: суть заключается в том, что при обращении к файлу error.php вызывается редирект на другую страницу с материалом и отдаётся заголовок с кодом 404. На мой взгляд, этот способ не только корявый в плане реализации, но его так же опасно использовать с точки зрения SEO. К тому же, он не позволяет вывести описание ошибки (потом попробуй угадай).

Признаться, мне было всегда проще сделать HTML версию страницы, чем динамически отображать шаблон с подключенными внешними ресурсами и модулями. После нескольких часов кодинга я разработал свой динамический метод вывода ошибок, который выводит все скрипты, стили, модули — рендерит шаблон через index.php. Хотелось бы поделиться им
« Последнее редактирование: 14.02.2016, 08:44:47 от Филипп Сорокин » Записан
voland
Профи
********

Репутация: +488/-86
Online Online

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #1 : 12.02.2016, 21:50:15 »

Мануал корявый
Роутер еще корявее - вот объясни мне, когда неверный URL ведет на
1) другую страничку (дубль)
2) перехватывается системой и доступен в менеджере перенаправлений
3) не перехватывается плагином перенаправлений но ведет на 404 от движка
4) вообще не видится и отдается ответ напрямую от nginx\apache
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6461



« Ответ #2 : 12.02.2016, 22:01:59 »

Внутри файла error.php можно получить и код ошибки (для дальнейшего формирования нужного хедера) и ее описание:
Код
$error_code = $this->error->getcode();
$error_description = htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8');

а уж получив эти данные, можно что угодно с ними делать и передавать куда и как угодно...
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6461



« Ответ #3 : 12.02.2016, 22:04:32 »

в случае возникновения
4) вообще не видится и отдается ответ напрямую от nginx\apache
вопрос уже не к J ))
Записан
voland
Профи
********

Репутация: +488/-86
Online Online

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #4 : 12.02.2016, 22:24:57 »

в случае возникновения вопрос уже не к J ))
Почему?
Я же использую дефолтный .htaccess!
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #5 : 12.02.2016, 23:33:45 »

Цитировать
вообще не видится и отдается ответ напрямую от nginx\apache
Тоже с этим сталкивался: так и не понял причину.
Записан
voland
Профи
********

Репутация: +488/-86
Online Online

Пол: Мужской
Сообщений: 8736


любит наш народ всякое гавно...


« Ответ #6 : 12.02.2016, 23:34:33 »

Тоже с этим не раз сталкивался: так и не понял причину.
Во-во.
Даешь глубокое исследование!
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #7 : 13.02.2016, 04:12:44 »

Вот и сама реализация:

(Удалено по причине потери актуальности)
« Последнее редактирование: 14.02.2016, 00:40:51 от Филипп Сорокин » Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #8 : 13.02.2016, 18:17:28 »

Кстати, существуют ли способы отрендерить шаблон методами движка?
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #9 : 14.02.2016, 00:37:37 »

Кстати, существуют ли способы отрендерить шаблон методами движка?

Придётся самому отвечать на свой вопрос Azn

Удалось здорово сократить и улучшить код: теперь в шаблоне нет никаких ограничений, т.к. он выполняется в контексте JDocumentHTML, а не в контексте JDocumentError. На дефолтном Protostar работает отлично, все стандартные методы и свойства доступны из псевдопеременной $this.
« Последнее редактирование: 14.02.2016, 08:53:55 от Филипп Сорокин » Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #10 : 14.02.2016, 08:53:03 »

Окончательно закрыл для себя вопрос создания страницы ошибок — теперь эта страница ничем не отличается от обычных страниц, а её контент обрабатывается системными плагинами. Содержимое страницы может быть изменено как угодно, при этом оно не будет зависеть от разметки и оформления шаблона. И что самое главное — для всей этой красоты не нужно устанавливать никаких сторонних расширений — нужно всего лишь создать один файл и изменить другой. Кому интересно — выложил на своём сайте полную реализацию.
Записан
Taatshi
Support Team
*****

Репутация: +430/-3
Offline Offline

Пол: Женский
Сообщений: 4718

Мама, я снова верстал во сне...


« Ответ #11 : 14.02.2016, 10:56:03 »

А зачем обрабатывать 404-ю плагинами?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7786



« Ответ #12 : 14.02.2016, 11:22:59 »

честно говоря вообще не понимаю, зачем это Azn разве что из спортивного интереса... что не так было с базовым error.php?
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #13 : 14.02.2016, 15:17:36 »

А зачем обрабатывать 404-ю плагинами?
Потому что плагинами обрабатываются все страницы. Чем 404 хуже? Системный плагин SEF, для примера, надо запустить, чтобы скорректировать ссылки? Надо. В предыдущей версии парсил регулярками -- не понравилось. Решил плагином =)

Цитировать
честно говоря вообще не понимаю, зачем это Azn разве что из спортивного интереса... что не так было с базовым error.php?
Что конкретно вы не понимаете? Если вы будете использовать базовый error.php, то при любом изменении шаблона нужно отдельно менять дизайн, раскладку в error.php, потому что базовый error.php к шаблону не относится.

Короче, народ не понял ничего Azn Мда...
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2247


« Ответ #14 : 14.02.2016, 15:39:52 »

Если вы будете использовать базовый error.php, то при любом изменении шаблона нужно отдельно менять дизайн, раскладку в error.php, потому что базовый error.php к шаблону не относится.
Зачем дизайн менять? Вот часто используемый известный вариант error.php с подгрузкой статьи "404":
Показать текстовый блок
Что в этом варианте вас не устроило?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7786



« Ответ #15 : 14.02.2016, 15:44:58 »

Что конкретно вы не понимаете?
та не, я ниче Azn я вообще за любой кипиш кроме голодовки Azn просто тут так сказать глубину мысли не познал Azn например

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

потом
базовый error.php к шаблону не относится
это как? как это не относится? может мы о разных error.php? я о том, который в корне шаблона.

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

поэтому не то, чтобы
Короче, народ не понял ничего Azn Мда...
задумку поняли. не поняли - зачем? Azn
Показать текстовый блок
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #16 : 14.02.2016, 15:50:48 »

Зачем дизайн менять? Вот часто используемый известный вариант error.php с подгрузкой статьи "404":
Показать текстовый блок
Что в этом варианте вас не устроило?

fsv, ну я уже написал в начале. Во-первых, не известно, как поисковики к этому отнесутся: пользователю отдаётся 404 ошибка, а его самого перебрасывает на другую страницу. Возможна пессимизация. Во-вторых, при перенаправлении теряется контекст JDocumentError — мы уже не сможем работать с объектом ошибки, например, для того, чтобы вывести описание. Ну и последнее: это не всегда работает корректно, и я считаю, что это хак.

Цитировать
а в вашем решении разве не надо менять дизайн?
Нет. Дизайн и раскладка берётся из шаблона со всеми стилями, скриптами, модулями. По-сути, мой вариант — это обычная страница, только позиция компонента (который отсутствует при ошибке), замещается телом ошибки.

Цитировать
дальше, обработка плагинами. ну тут вопрос спорный... я наверное все таки склоняюсь в сторону, что 404 не нужно обрабатывать плагинами. потому что 404 рисуется раз и навсегда, и я бы не хотел чтобы при установке какого либо плагина, который нужен во фронте, 404 поломалась по недосмотру из-за него.
Вы отдаёте заголовок 404 и после этого можете менять страницу ошибки как захочется — боту главное получить заголовок.
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2247


« Ответ #17 : 14.02.2016, 15:55:23 »

fsv, ну я уже написал в начале. Во-первых, не известно, как поисковики к этому отнесутся: пользователю отдаётся 404 ошибка, а его самого перебрасывает на другую страницу.
кого куда перебрасывает?
Записан
vipiusss
Профи
********

Репутация: +261/-8
Offline Offline

Пол: Мужской
Сообщений: 4573


Skype: renor_


« Ответ #18 : 14.02.2016, 16:03:36 »

пока почитал, подумал: а не хотите в теме всё не расказывать и этим самым обламать и туда: в комм раздел? и там писать
может не прав, что подумал.имхо.
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7786



« Ответ #19 : 14.02.2016, 16:14:51 »

Цитировать
Нет. Дизайн и раскладка берётся из шаблона со всеми стилями, скриптами, модулями. По-сути, мой вариант — это обычная страница, только позиция компонента (который отсутствует при ошибке), замещается телом ошибки.
понял наконец-то Azn уж извините, вообще не думал о таком варианте. считаю его неверным.

Цитировать
пользователю отдаётся 404 ошибка, а его самого перебрасывает на другую страницу.
никуда никого не перебрасывает. все 1:1 как и в вашем варианте, за исключением того, что ваш вариант экономнее по ресурсам сервера.
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #20 : 14.02.2016, 17:06:23 »

кого куда перебрасывает?
А, простите. Не увидел: там file_get_contents. Похожий способ просто есть, но только с перенаправлением.

Цитировать
никуда никого не перебрасывает. все 1:1 как и в вашем варианте, за исключением того, что ваш вариант экономнее по ресурсам сервера.
Ну я бы не сказал, что один в один. Мы теряем контекст JDocumentError, мы не можем вывести описание ошибки и использовать методы этого объекта. Гибкость также теряется: если сайт мультиязычный, то для каждого типа ошибки мы должны наплодить по 2-3 материала на разных языках. Наконец имеется лишний запрос (это, конечно, не очень существенно, но, я считаю, что криво).

А если материал вдруг удалить, то вообще будет полное разочарование Azn
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2247


« Ответ #21 : 14.02.2016, 17:51:08 »

Мы теряем контекст JDocumentError, мы не можем вывести описание ошибки и использовать методы этого объекта.
Код
if ($this->error->getCode() == '404') 
{
echo $this->error->getMessage(). '<br>';
echo '<pre>'.print_r($this, true).'</pre>';   // JDocumentError Object
}

А если материал вдруг удалить, то вообще будет полное разочарование Azn
если у бабушки..., то это уже дедушка
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7786



« Ответ #22 : 14.02.2016, 17:57:25 »

теряется контекст JDocumentError - это имеется в виду когда делаем file_get_contents. это же уже не 404.

в целом так и есть, предложенный вариант более гибок чем file_get_contents. кто любит так делать 404 - можно советовать Azn
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #23 : 14.02.2016, 17:58:34 »

fsv

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

Цитировать
если у бабушки..., то это уже дедушка
Ну... это отсылки к рыжему и конопатому. А вот при недоступности страницы реально может случиться что-то вроде бесконечного перенаправления, только в 100 раз хуже. Как откроет бот удалённую страницу — и конец настанет вашему серверу Azn
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2247


« Ответ #24 : 14.02.2016, 18:45:38 »

теряется контекст JDocumentError - это имеется в виду когда делаем file_get_contents. это же уже не 404.
да, в file_get_contents не будет ошибки. При ответе не об этом думал, потому что…

Ну и как вы сделаете это в материале? Представьте, что у вас SQL ошибка, нужно вывести описание, а вы цепляете другой материал и выводите страницу данного материала. Где вы будете выводить там описание и как?
… я не буду выводить все подряд ошибки. Это вредно для здоровья. Для юзера хватит стандартных фраз в материале, никто письма вам писать не будет. Ошибка – в логах.
И да, имея текст ошибки в переменной, в чем проблема его использовать на подгруженной в другую переменную странице? Извращение какое-то, но это так, теоретически...

Да я не против. Подобные раскопки на самом деле очень полезны. Всегда что-то нужное вынесешь. Только по этой теме – я так пока повторять не готов.
Записан
Филипп Сорокин
Живу я здесь
******

Репутация: +121/-4
Offline Offline

Пол: Мужской
Сообщений: 1471


« Ответ #25 : 14.02.2016, 20:45:21 »

Описание определенных ошибок можно сделать доступным для супер-администраторов. Все в одном файле, не нужно создавать никакие материалы. Вот вы говорите, что это извращение - выводить красиво отформатированное описание ошибки в позиции компонента, а я считаю извращением при отладке лезть в логи. Обновил страницу - лезь опять в логи. Зачем? Логи проверять, конечно, полезно, но не в этом случае. Ещё я считаю извращением подгружать какие-то переменные в других пространствах имён. А при запросе к другому материалу подгружать в этом материале переменные - это настоящее извращение.
« Последнее редактирование: 14.02.2016, 20:49:21 от Филипп Сорокин » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet