Ошибка CodeIgniter 2.1 с show_404 () и 404_override - PullRequest
18 голосов
/ 08 декабря 2011

Я работаю с CodeIgniter уже довольно давно, и в настоящее время я делаю проект для клиента, которому нужна пользовательская страница 404 .Все отлично, и 404_override отлично работает.

Моя проблема возникает, когда посетитель пытается получить доступ к несуществующей статье. Я хотел бы вызвать функцию show_404(), но это показывает мне"out of box" 404 страница, а не та, что написана в 404_override.

Я видел некоторые исправления для более старых версий, но я не могу заставить его работать в 2.1 .Так что, если кто-нибудь сможет мне помочь в этом, я был бы очень благодарен.

Ответы [ 4 ]

23 голосов
/ 08 декабря 2011

Редирект является самым чистым; загрузка представления также может работать.

Проблема здесь в том, что show_404 () обычно вызывается ПОСЛЕ того, как ваш контроллер уже загружен (что-то должно было сказать, что он покажет 404). CI не любит загружать второй контроллер в этой точке, что является основным препятствием.

Лучшим вариантом, вероятно, является расширение функции show_404 () в классе Exceptions для перенаправления на ваш маршрут 404. Без перенаправления вы застрянете с отображением представления или того, что, как вы знаете, имеет все «дополнительные данные», необходимые для вызова 404 (или, я думаю, вы могли бы загрузить его и в классе Exceptions). Это может быть очень сложно в некоторых динамических представлениях.

Вы, очевидно, хотите что-то более продвинутое, чем просто редактирование шаблона 404 в папке ошибок. У меня возникли проблемы при попытке получить доступ к get_instance () из этого файла, так как иногда он загружается до того, как будет создан контроллер. Так что будьте осторожны, если вы попробуете это;)

Обновление: Вот рабочий пример расширения функции show_404 () для загрузки представления

<?php
// application/core/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {

    public function show_404()
    {
        $CI =& get_instance();
        $CI->load->view('my_notfound_view');
        echo $CI->output->get_output();
        exit;
    }
}
2 голосов
/ 19 июня 2014

Мой быстрый подход к решению проблемы - создать функцию в файле автозагрузки помощника в проекте, над которым я работаю. Этот помощник просто перенаправляет на пользовательскую страницу 404. Поэтому я просто звоню show_my_404() вместо show_404()

function show_my_404(){   
    //Using 'location' not work well on some windows systems
    redirect('controller/page404', 'location');  
}
0 голосов
/ 16 января 2014
  function show_404($page = '', $log_error = TRUE)
{
    if ($log_error)
    {
        log_message('error', '404 Page Not Found --> '.$page);
    }
    redirect(base_url().index_page().'/controller/error_page');
           //OR
           //redirect('SOME URL');

    exit;
}
0 голосов
/ 06 августа 2013

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

Так что я провел небольшое исследованиео том, как CI вызывает маршрут '404_override' внутри.Вот решение, которое я нашел:

// Override show_404 method
function show_404(){
    // Load Router and Core classes.
    $RTR =& load_class('Router', 'core');

    // Get class and method for 404 from routes.php
    $x = explode('/', $RTR->routes['404_override']);
    $class = $x[0];
    $method = (isset($x[1]) ? $x[1] : 'index');

    // Get current class and method for callback
    $callback_class = $RTR->fetch_class();
    $callback_method = $RTR->fetch_method();
    // Can also log here, using callback class and method.

    // Create object for callback
    $CI = new $callback_class;
    call_user_func_array(array(&$CI, $method), array_slice(array($class,$method), 2));
} // End!

Добавьте эту функцию в system / core / CodeIgniter.php .Это переопределит функцию show_404 .Вы можете вызвать его с ваших контроллеров, и он вызовет маршрут «404_override», указанный в файле rout.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...