2011-07-21 29 views
0

メンテナンスページを設定しようとしています。サイトが無効になっているときに、要求されたページが何であっても表示されるようにしています。CakePHPのメンテナンスページにリダイレクトされません。

私は現在$this->cakeError()でこれをやってみました:app_controller.php

function beforeFilter(){ 
.... 
if($this->__get_config('maintenance_status') == 1){ 
     $this->cakeError('maintenance', array('message' => $this->__get_config('maintenance_message')));  
    } 
.... 
} 

app_error.phpで:

function maintenance($message){ 
    $this->controller->set('message', $message['message']); 
    ($this->controller->RequestHandler->isAjax()) ? $this->_outputMessage('ajax_maintenance') : $this->_outputMessage('maintenance'); 
} 

問題が言うこれ、致命的なエラーが発生したということです:Call to a member function isAjax() on a non-objectを。しかし、私は明らかにRequestHandlerコンポーネントをapp_controller.phpに設定しました。さらに、私は別のコントローラ内からこのエラーを呼び出そうとしましたが、それは私に致命的なエラーを与えません。

何が問題なのですか?私がコンポーネントを初期化したことを認識しないのはなぜですか?

+0

どこ正確で上記のリンクでそれについての詳細を読むことができます'AppController'は呼び出されたエラーですか? – cspray

+0

'beforeFilter()'メソッドにあります。この変更を反映するために投稿を編集しました。 – linkyndy

答えて

0

From the CakePHP book

ユーザーにエラーページを表示し、私はあなたには、いくつかのエラーを呼び出していると仮定しています

アプリケーション内の任意のさらなる処理を停止します。このメソッドを呼び出しますコールバックはAppControllerです。

この場合、コンポーネントがインスタンス化される前にスクリプトの実行が停止する可能性があります。これは確かにあなたのエラーを引き起こすでしょう。

ここで、このエラーは、問題をどのように処理しているかを再評価する良い機会だと思います。これは本当にエラーですか?メンテナンスステータスが設定されているので、と表示されます。このページが表示されます。それはエラーではありません。さらに、メンテナンスをオンにしたことを伝えるログに10,000個のメッセージが必要なのは確かです。

これは、いくつかのコントローラコールバックと少しのコードを利用することで、よりうまく解決できると思います。

私は_get_config()が何であるかわからないので、このコールバックで呼び出すことができるカスタムユーザー関数だと思います。

コントローラコールバックbeforeFilter()を使用します。今

class AppController extends Controller { 

    public function beforeFilter() { 
     if ($this->_get_config('maintenance_status') === 1) { 
      $this->redirect('/maintenance'); 
     } 
    } 

} 

、あなただけのセットアップ正しくメンテナンスメッセージが表示され、エラー・ログ内のメンテナンス時にすべてのそれらの接続試行をログに記録しません独自のビューに添付メンテナンスコントローラを、することができます。

+0

ありがとうございます。これは私が前に試したやり方であり、うまくいかなかったので、2回目の試みは 'cakeError()'で行われました。私の最初の試みでは、 'MaintenanceController'を作成し、' maintenance() 'メソッドを追加し、そのビュー' maintenance.ctp'を作成しました。 'app_controller.php'の' beforeFilter() 'メソッドで、' if($ this-> get_config( 'maintenance_status')== 1){ \t \t \t $ this-> redirect(array ( 'コントローラ' => '保守'、 'アクション' => '保守')); \t \t \t} 'しかし、私のブラウザは「ページが正しくリダイレ​​クトされていません」と私にはわからないのです。 – linkyndy

+0

error_logにリダイレクトが機能しない理由は何ですか? 'maintenance'の' maintenance'ディレクトリに 'views'の中に' maintenance.ctp'がありますか? – cspray

+0

申し訳ありませんが、error_logはどこで探すべきですか? :) – linkyndy

0

Configure :: read( "System.maintenance")またはそれに類するものを使う方がやや良いでしょう。チャールズは言ったように、また

(私はシステムメンテナンスのフラグなどのようなものの名前空間であること、私のコンフィグデータを名前空間に傾向がある) - 予想されるイベントのエラー・ページを使用しないでください。エラーは、ユーザに通知することであり、アプリケーションが予期しない失敗についての通知などを処理するためです。メンテナンスページは単に/ app/views/pages /フォルダ内のビューファイルです。設定キーがtrue/1に設定されている場合は、それにリダイレクトします。

0

あなたのアプローチは知的だと思われますが、あなたはそれを少し過ぎ去っているかもしれません。

私は現在開発中のサイトで同様の設定をしており、認証コンポーネントを使用して私の世話をします。

私は、サイトのステータスが0(オフライン)の場合にアプリケーションを強制的に使用する新しいオフラインレイアウトをセットアップしました。ステータスが0の場合、app_controllerはサイト全体へのアクセスを拒否します。アクセスは、使用してサイト全体に付与されます -

$this->Auth->deny('*'); 
$this->layout = "offline"; 

また、このレイアウトでは、私は、ユーザーがmessage.Ifユーザーが(開発今のところ、すべてのユーザー)を認証することができますクリックすると表示された隠しログインフォームを持っていますデフォルトテンプレート。

Click Here

コードのいくつか...それはあなたを助けるかもしれないが、それをチェックアウトしますが、

function beforeFilter(){ 
// Site Offline = 0 , Site Online = 1 
if($this->Configuration->get_site_status() == 1){ 
     // Allow access to the site to all users and perform all required 
     // beforeFilter code 
}else{ 
    ... 
    // If site is OFFLINE but User is logged in allow access. 
    // Later I will need to change it to only allow admin access if logged in as I am still developing 
    // Everyone else will be denied access even if they are able to authenticate   
    if(!$this->Auth->user() == null){ 
     $this->layout = 'default'; 
     $this->Auth->allow('*'); 
    }else{   
     $this->layout = 'offline'; 
     $this->Auth->deny('*'); 
    } 
    ... 
    } 
}