6

CodeIgniterのテンプレートライブラリhttp://williamsconcepts.com/ci/codeigniter/libraries/template/reference.htmlを使用していますが、カスタムエラーページも実装したいと思います。デフォルトルーターを拡張するMY_Routerを含む1つのメソッド、http://maestric.com/doc/php/codeigniter_404を見つけました、これは404エラーのみを処理します。データベースエラーなどを含むすべてのエラーにシンプルでユーザーフレンドリーなページを表示したいのですが、一部はテンプレートライブラリを使用できるように、また一部は自分自身を送信するための電子メール機能を実装できるように、コントローラーを通過させたいです。発生したエラーに関する情報。

誰かが上記のMY_Routerメソッドの機能をerror_dbなどの他のエラーに拡張することについて質問しましたが、作成者から回答が得られなかったので、上記のメソッドの方針に沿って、誰かがこれを行う方法を知っているかどうかを確認します。それを達成する他の簡単な方法。私は初心者なので、CodeIgniterの基本的な機能についての知識についてはあまり考えないでください:-)

4

4 に答える 4

2

Exceptions クラスの拡張機能を作成しました。この拡張機能では、CI$this->Exceptions->show_error();の関数で使用されるメソッド、witchを置き換えました。show_error()

このカスタム メソッドを呼び出すと、最初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;
	}
	
}

?>

于 2015-05-06T17:10:51.540 に答える
1

カスタム エラー ページを作成する最も簡単な方法は、( 404 の場合)、(データベース エラーの場合)、(その他のほとんどのエラーの場合)/application/views/errors/html/error_*.phpなどのファイルを編集することです。error_404.phperror_db.phperror_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

注意すべきもう1つのこと:

ビューでは、を含むオブジェクトをheader渡しています。エラーページはビューを使用しないため、通常はビューに渡す変数を追加する必要があるため、.$data$data['page_title']$page_title

于 2016-08-24T13:21:23.663 に答える
1

私は次のようにしています: 私は独自のエラー ページを作成し、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 ページは他のページと同じように見えます。

ps CodeIgniter の Web サイトにある素敵なチュートリアルに従ったと思います。

于 2013-09-23T18:22:17.263 に答える