0

ゲーム用のサード パーティ スクリプトを起動するユーザー登録ページがあります。ユーザーが許可を受け入れた場合にのみ、このページの読み込みを完了させたいと考えています (HTTP 変数が設定されます)。現在、許可を求めていますが、ページをバックグラウンドで読み込んでいます。この変数がまだ設定されているかどうかを再確認するために、ページを「待機」または「再読み込み」するにはどうすればよいですか?

追加のコントローラー関数

public function add() {
    if ($this->User->IGBRequireTrust()) {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }
}

上記で呼び出される Model の public 関数

// Returns TRUE if the user trusts the site, FALSE otherwise.
    public function IGBRequireTrust()
    {
        if($_SERVER['HTTP_EVE_TRUSTED'] != 'yes')
        {
            echo "<script>CCPEVE.requestTrust('http://*.".$_SERVER['HTTP_HOST']."');</script>";
        }
        return true;
    }

ページが許可を受け入れない場合、ページはセッション フラッシュ メッセージ セットを使用してインデックス機能にリダイレクトする必要があります。IGBRequireTrust 関数を呼び出す場所に else を追加しようとしましたが、常に両方を実行しているようです。

アップデート:

AppController 関数

public function beforeFilter() { $this->Auth->allow('index', 'view');

if($this->name == 'Users' && $this->action == 'add'){
    //die('correct controller and action');
    if(isset($_SERVER['HTTP_EVE_TRUSTED'])){
        if($_SERVER['HTTP_EVE_TRUSTED'] != 'yes' && $this->action != 'promptEveTrusted'){
            $this->redirect(array('controller'=>'Users', 'action'=>'promptEveTrusted'));
        }
    } else {
        $this->Session->setFlash(__('Registration is only allowed through the EVE in game browser.'));
        $this->redirect(array('controller'=>'Users', 'action'=>'index'));
    }
//} else {
  //  die('wrong controller and action');
}

}

4

2 に答える 2

0

http 変数なしでページをロードすると、メッセージが表示されるだけです (たとえば、javascript によって)。

ユーザーがそれを受け入れると、JavaScript は変数を使用して同じページにリダイレクトし、変数が設定されたときに必要なものをすべてロードします。

彼がそれを受け入れない場合は、同じページに留まるか、別のページにリダイレクトされます。

于 2012-12-05T11:06:57.703 に答える
0

ページに javascript を挿入しているように見えますが、これはすべての php コードが終わるまでレンダリングされません。ここでは、ロジックとして JavaScript を使用してみてください。またはjqueryは非常に簡単です。また、$this->User->IGBRequireTrust()常に true を返します。if ステートメントに return false を入れます

// Returns TRUE if the user trusts the site, FALSE otherwise.
    public function IGBRequireTrust()
    {
        if($_SERVER['HTTP_EVE_TRUSTED'] != 'yes')
        {
            echo "<script>CCPEVE.requestTrust('http://*.".$_SERVER['HTTP_HOST']."');</script>";
            return false;
        }
        return true;
    }

<script>
var eve_trusted = '<?php echo $_SERVER['HTTP_EVE_TRUSTED']; ?>';
var declined_eve_url = '<?php echo $this->webroot; ?>users/unauthorized';
//Might have to wait for your script injection to load so we will wait for document ready
$(function(){
    if(!eve_trusted) window.location.href = declined_eve_url;
});
</script>

ここでは、js を使用してページの読み込みをキャンセルする方法を説明しますが、メイン スクリプトが読み込まれる順序がわかりません。

または、 AppController.ctp の beforeFilter にロジックを配置することで、これらすべてをクリーンアップできます。

function beforeFilter(){
    if($_SERVER['HTTP_EVE_TRUSTED'] != 'yes' && $this->action != 'promptEveTrusted')
        $this->redirect(array('controller'=>'User', 'action'=>'promptEveTrusted'));
}

//USERS CONTROLLER
function promptEveTrusted(){
    //This will give the user a blank template, comment if you don't wish this
    $this->layout = 'ajax';
}
//views / users / prompt_eve_trusted.ctp
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

<script>
  $(function(){
     CCPEVE.requestTrust('http://*.".$_SERVER['HTTP_HOST']."');
  });
 </script>
于 2012-12-05T10:03:45.577 に答える