我有一个用户注册页面,可以为游戏启动第三方脚本,我只希望这个页面在用户接受权限时完成加载(它将设置一个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中的公共函数
// 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;
}
如果页面不接受权限,则需要使用会话flash msg设置重定向回索引函数。我尝试在其中调用IGBRequireTrust函数的地方添加一个else,但它似乎总是这两个。
更新:
AppController功能
public function beforeFilter(){ $ this-&gt; Auth-&gt; 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');
}
}
答案 0 :(得分:0)
看起来你正在向页面中注入javascript,直到所有php代码之后才会呈现。也许尝试使用javascript作为你的逻辑。或者jquery会非常简单。此外,$this->User->IGBRequireTrust()
始终返回true。在if语句中输入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>
答案 1 :(得分:0)
我会加载没有http变量的页面,只会显示一条消息(例如,通过javascript)。
如果用户接受了它,则javascript会将其重定向到带有变量的同一页面,然后在设置变量时将加载所需的所有内容。
如果他不接受,它会保留在同一页面中,或者根据您的喜好将其重定向到另一个页面。