Улучшение логики страницы 404

#1 19 января 2016 в 09:12
В общем так. У меня на сайте реализована рассылка сообщений.
Одно из писем имеет ссылку, ведущую на страницу редактирования профиля пользователя. Т.е. site.ru/users/id/edit/theme.
При переходе по ссылке, если пользователь не авторизован — конечно же появляется страница 404. Она говорит, что "Страница не найдена". Для людей, которые связаны мало-мальски с сайтостроением — логика железобетонная: закрытый раздел — нет доступа — 404.

Но обычных пользователей это вводит в заблуждение и об этом мне на сайте часто говорят. Сами представьте, проходите по ссылке в свой профиль на одноклассниках (если не авторизованы), а вам в лоб сообщение — "Страницы нет". Обычно они в таком случае редиректят на страницу входа на сайт.

Решил поправить дело таким образом. Ссылка site.ru/users/1/edit/theme — если пользователь не авторизован, его должно перенаправить на страницу авторизации — после авторизации обратно на site.ru/users/id/edit/theme.

Предполагаю, что прописать это можно в файле systems/controllers/core.php. Не ошибся. Нашел кусок кода отвечающий за ошибку 404
  1.  
  2. /*** Показывает сообщение об ошибке 404 и завершает работу*/
  3. public static function error404(){
  4.  
  5. cmsEventsManager::hook('error_404', self::getInstance()->uri);
  6.  
  7.  
  8. header("HTTP/1.0 404 Not Found");
  9. header("HTTP/1.1 404 Not Found");
  10. header("Status: 404 Not Found");
  11.  
  12. cmsTemplate::getInstance()->renderAsset('errors/notfound');
  13. die();
  14.  
  15. }
  16.  
Тут все и встало, не пойму, как прописать тут условие чтобы при обращении к ссылке site.ru/users/id/edit/theme происходил редирект на страницу /auth/login, а после авторизации обратно на site.ru/users/id/edit/theme

При этом предполагаю, что нужно будет еще править и login.php

Заранее спасибо за участие.
#2 19 января 2016 в 10:22

Но в этом случае любая 404 будет требовать наличия авторизации.

Виктор
Интересное решение.

Хотя… (Если НЕ найдете, как вызвать функцию redirect() из controller.php, потому что я не нашел)
404 из core.php

Виктор

Вы хотите сказать, что этот код не сработает?

  1. if (!cmsUser::isLogged()) { $this->redirect('/auth/login?back='.$_SERVER['REQUEST_URI']); }

Виктор
#3 19 января 2016 в 10:32
Пошел проверять ))) +ище вам!
#4 19 января 2016 в 13:45
Все работает! Спасибо!
#5 19 января 2016 в 14:34
Спасибо также пригодилось!
#6 19 января 2016 в 21:12
Не подскажете где находится шаблон 404 ошибки
#7 19 января 2016 в 22:03
Alekskrug, templates/default/assets/errors/notfound.tpl.php
#8 20 января 2016 в 01:02
Azami, править файл ядра в данном случае необходимости нет. Вы можете перехватить событие "error_404" хуком в любом своём компоненте и сделать в этом хуке все желаемые проверки и редиректы.
В документации есть описание "Обработки событий".
#9 20 января 2016 в 02:53
Создайте в любом компоненте в папке с хуками файл хука с имненем error_404.php c таким содержанием. В содержании Test меняем на имя компонента куда пристроили ну и в манифест его
  1. <?php
  2.  
  3. class onTestError404 extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. if($data) {
  8.  
  9. $item = explode('/', $data);
  10. if($item[0]=='users' && $item[3]=='theme') {
  11.  
  12. $this->redirectTo('auth', 'login?back=/users/'.$item[1].'/edit/theme');
  13.  
  14. }
  15.  
  16. }
  17.  
  18. return $data;
  19.  
  20. }
  21.  
  22. }
должен работать
#10 20 января 2016 в 21:12
Что значит

ну и в манифест его

kreator
#11 20 января 2016 в 21:23
В майле манифеста надо хук прописать чтоб он обрабатываался
#12 20 января 2016 в 21:32
kreator, создал хук с содержанием
  1. <?php
  2.  
  3. class onUsersError404 extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. if($data) {
  8.  
  9. $item = explode('/', $data);
  10. if($item[0]=='users' && $item[3]=='theme') {
  11.  
  12. $this->redirectTo('auth', 'login?back=/users/'.$item[1].'/edit/theme');
  13.  
  14. }
  15.  
  16. }
  17.  
  18. return $data;
  19.  
  20. }
  21.  
Закинул в папку с хуками в \system\controllers\users\hooks
Указал в манифесте
Кидает на 404
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.