Пользовательские страницы ошибок с шаблонами в CodeIgniter - PullRequest
5 голосов
/ 04 октября 2011

Я использую библиотеку шаблонов для CodeIgniter, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html,, и теперь я хочу также реализовать пользовательские страницы ошибок. Я нашел один метод, включающий MY_Router, расширяющий маршрутизатор по умолчанию: http://maestric.com/doc/php/codeigniter_404, но он обрабатывает только 404 ошибки. Я хочу, чтобы все ошибки отображали простую, удобную для пользователя страницу, включая ошибки базы данных и т. Д., И я хочу, чтобы она проходила через контроллер, частично для того, чтобы я мог использовать библиотеку шаблонов, и частично, чтобы я мог также реализовать функцию электронной почты для отправки себе информация об ошибке, произошедшей.

Кто-то спросил о расширении функциональности вышеуказанного метода MY_Router для других ошибок, таких как error_db, но не получил ответа от автора, поэтому я перехожу сюда, чтобы узнать, знает ли кто-нибудь, как это сделать, в духе вышеуказанный метод или любой другой простой способ достижения этого. Обратите внимание, что я новичок, так что не думайте слишком много о моих знаниях основных функций CodeIgniter: -)

Ответы [ 4 ]

2 голосов
/ 06 мая 2015

Я создал расширение для класса Exceptions. В этом расширении я заменил метод $this->Exceptions->show_error();, ведьма используется функцией show_error() CI.

когда я вызываю show_error('User is not logged in', 401);, этот пользовательский метод сначала ищет файл error_ $status_code. В приведенном выше примере он будет искать файл error_401.php.

Если этот файл не существует, он просто загрузит файл error_general.php, как это делает стандартный $this->Exceptions->show_error();.

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

<?php

if(!(isset($UserIsLoggedin))){
  $this->load->view('template/header');
  show_error('User is not logged in', 401);
  $this->load->view('template/footer');
}

?>

Ваш файл error_401.php должен выглядеть следующим образом:

<div id="container">
	<h1><?php echo 'This is an 401 error'; ?></h1>
	<?php echo $message; ?>
</div>

/ приложение / ядро ​​/ MY_Exceptions.php:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions
{
	
	function show_error($heading, $message, $template = 'error_general', $status_code = 500)
	{		
		if((!isset($template)) || ($template == 'error_general')){
			if(file_exists(APPPATH.'errors/error_'.$status_code.'.php')) {
				$template = 'error_'.$status_code;
			}
		}    	
		
		if (!isset($status_code)) $status_code = 500;
		
		set_status_header($status_code);

		$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';

		if (ob_get_level() > $this->ob_level + 1)
		{
			ob_end_flush();
		}
		ob_start();		
				
		include(APPPATH.'errors/'.$template.'.php');
		$buffer = ob_get_contents();
		ob_end_clean();
		return $buffer;
	}
	
}

?>
1 голос
/ 24 августа 2016

Самый простой способ создать пользовательские страницы ошибок - это отредактировать файлы на /application/views/errors/html/error_*.php, например error_404.php (для 404 с), error_db.php (для ошибок базы данных) и error_general.php (для большинства других ошибок).

Поскольку эти страницы находятся в вашем каталоге application, вы можете настроить их под свои нужды.

Если ваш обычный шаблон представления выглядит примерно так:

<?php $this->load->view('includes/header'); ?>
...
...
<?php $this->load->view('includes/footer'); ?>

Вы можете изменить это в ваших /application/views/errors/html/error_*.php файлах, например, так:

<?php
  $page_title = $heading;
  include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'header.php';
?>
<div class="well">
  <h1><?php echo $heading; ?></h1>
  <?php echo $message; ?>
</div>
<?php include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'footer.php'; ?>

Обратите внимание, что мы больше не используем представления, а вместо этого включаем файлы представлений для header & footer.

Еще одна вещь, которую стоит отметить:

В представлении header я передаю объект $data, который включает $data['page_title']. Поскольку страницы ошибок не используют представления, вы должны добавить любые переменные, которые вы обычно передаете в представление, следовательно, наличие $page_title.

1 голос
/ 23 сентября 2013

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

Итак, скажем, мой контроллер по умолчанию - site.php, мой site.php выглядит так:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Site extends CI_Controller {

    public function index()
    {
        $this->load->view('welcome_message');
    }

    public function view($page = "home" , $function = "index")
    {
        do_something();
        if($status == "404")
        {
            $function = "404";
        }
        $this->load->view('templates/header', $data);
        $this->load->view($page.'/'.$function, $data);      
        $this->load->view('templates/footer', $data);
    }




}

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */

Так что я служу home / 404.php всякий раз, когда возникает ошибка. то есть я не позволяю CodeIgniter вызывать show_404();, поэтому страница 404 выглядит как любая другая страница.

p.s. Я предполагаю, что вы следовали хорошему руководству на веб-сайте CodeIgniter.

0 голосов
/ 19 сентября 2017
config/routes.php 

редактировать

$route['404_override'] = '';

введите здесь ваш контроллер, например, Ошибка

создать функцию index и load your view

...