0

今日はcakePHPクッキーについて質問があります。すべてのアプリケーションコントローラーでCookieを記憶するようにcakephpに指示するにはどうすればよいですか?

簡単な合意を受け入れたい。

たとえば、私は2つのコントローラーを持っています。契約と情報ページ。ユーザーは、私のアプリで情報ページやその他のものを表示するために同意する必要があります。

これは私の合意コントローラーです(例のみ):

class AgreementController extends AppController {
    var $components = array('Cookie'); 

    public function acceptAgreement(){
        $this->Cookie->write('agreements', 'accepted');
    }
}

これは私のページコントローラーです(例のみ):

class InfopagesController extends AppController {
public function showPage(){
    $cookie = $this->Cookie->read('agreements');
    if($cookie=="accepted"){
        /* CODE TO SHOW PAGE */
    }
    else{
        /* REDIRECT TO AGREEMENTS */
    }
}

Cookieが空の場合、アプリケーションのすべてのコントローラーをアグリーメントコントローラーにリダイレクトしたいのですが、そうしようとしていますが、cakephpはアグリーメントコントローラーのアクションでのみCookieを記憶しています。

私のCookieコンポーネントの定義(合意コントローラー内)

function beforeFilter() {
  $this->Cookie->name = 'regulamin';
  $this->Cookie->time =  3600;
}

誰か助けてもらえますか?

4

3 に答える 3

2

AppController::beforeFilter() にチェックを追加します

   $cookie = $this->Cookie->read('agreements');
   if ($cookie != "accepted" && (get_class($this) != 'YOUR-AGREEMENTS-CONTROLLER' && $this->action != 'AGREEMENTS-ACTION')) {
        /* REDIRECT TO AGREEMENTS */
   }

同意書ページにアクセスした場合は、そのページにリダイレクトしないように注意してください。そうしないと、リダイレクト ループが発生します。ユーザーが契約ページにアクセスしようとしているかどうかを確認するために必要なものに、私の例から条件を変更します。

また、コントローラーの beforeFilter() 呼び出しで、parent::beforeFilter() を呼び出していることを確認してください。親メソッドの呼び出しやこれを正しく使用する方法がわからない場合は、phps OOP について読んでください。http://php.net/manual/en/language.oop5.php

于 2012-10-25T18:30:15.093 に答える
1

セッションを使用します。Cakephp サイトには読み書きに関する良い情報があります。http://book.cakephp.org/2.0/en/development/sessions.htmlを参照してください。

また、セッション チェックを app_controller.php の beforeFilter() コールバックに配置して、セッションが空の場合にすべてをそこに転送します。http://book.cakephp.org/2.0/en/controllers.html

于 2012-10-25T15:41:20.840 に答える
0

AgreementController で正しく行ったように、Cookie コンポーネントをロードするのを忘れたため、InfopagesController が機能しない可能性があります。

この後、 AppController::beforeFilter() チェックで:

1) コントローラーとは何か;

2) コントローラーが「AgreementController」と等しくない場合は、ユーザーが Cookie を持っているかどうかを確認します。

「AgreementController」と等しくないかどうかを確認する必要があります。そうでない場合、無限リダイレクトが作成されます。

于 2012-10-26T12:17:23.903 に答える