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.'));
            }
        }
    }
}

上面调用的模型中的公共函数

// 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 ,但它似乎总是两者兼而有之。

更新:

应用控制器功能

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

看起来您正在将 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 回答
0

我会在没有 http 变量的情况下加载页面,并且只会显示一条消息(例如,通过 javascript)。

如果用户接受它,那么 javascript 会将他重定向到带有变量的同一页面,然后在设置变量时加载您想要的所有内容。

如果他不接受,它只会保留在同一页面或将他重定向到另一个页面,如您所愿。

于 2012-12-05T11:06:57.703 回答