【问题标题】:CakePHP wait for alert acceptanceCakePHP 等待警报接受
【发布时间】:2012-12-05 07:26:16
【问题描述】:

我有一个为游戏启动第三方脚本的用户注册页面,我只希望该页面在用户接受许可时完成加载(它将设置一个 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,但它似乎总是两者兼而有之。

更新:

AppController函数

公共函数 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');
}

}

【问题讨论】:

    标签: php function cakephp


    【解决方案1】:

    看起来您正在将 javascript 注入页面,直到完成所有 php 代码后才会呈现。也许在这里尝试使用 javascript 作为您的逻辑。或者 jquery 会超级简单。此外,$this-&gt;User-&gt;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>
    

    【讨论】:

    • 我尝试使用您在上面发布的 beforeFilter 想法,但这只是将每个页面重定向到 /Users/promptEveTrusted 然后我收到太多重定向错误。
    • 注意:我在 if 语句中有一个值来检查当前动作是否是被重定向到的动作。那应该停止重定向。您可能需要稍微考虑一下这个语句。
    • 我正在尝试理解逻辑,但不幸的是不能。很抱歉成为一个痛苦的人。如果未设置变量并且操作不是 promptEveTrusted 则转到该操作。我试图将其更改为 action == 'add',因为我试图仅提示并重定向回添加操作,因为一旦用户接受提示,我想在表单中自动填充其他变量集。对于所有非游戏浏览器,我只会重定向回索引并显示一条消息,说明您必须在游戏浏览器中使用。我可以通过 isset($_SERVER['HTTP_EVE_TRUSTED'])) 判断他们是否使用游戏内浏览器
    • 我认为您确实了解逻辑,只是不了解我试图为您指出的方向。我正在使用新视图创建一个新的控制器函数,只是为了使用 promptEveTrusted 函数处理 HTTP_EVE_TRUSTED 的验证。然后,在前置过滤器中,如果未设置变量,则重定向用户以接受请求。可能是我误解了这个问题。 $this-&gt;action != 'promptEveTrusted' 所做的只是在用户访问该页面后再次阻止重定向。
    • 谢谢!我让它重定向到新函数(我在上面更新了我的 appcontroller 函数)但现在因为 javascript 不在 body onload 标记中,它没有运行。当显示该功能时,我将如何让 javascript 运行?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多