2012-10-25 25 views
0

今天我有一个关于cakePHP cookies的问题。 如何告诉蛋糕php记住所有应用程序控制器中的cookie?CakePHP在所有控制器中读取Cookie

我想要做的简单协议接受。

例如,我有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在协议控制器的行动。 (在协议控制器)我的饼干成分的

定义

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

任何人可以帮助我吗?

回答

1

使用会话。 Cakephp网站在阅读和写作方面有一些很好的信息。请参阅http://book.cakephp.org/2.0/en/development/sessions.html

如果会话为空,还可以将您的会话检入到before_filter()回调中的app_controller.php中以转发所有内容。 http://book.cakephp.org/2.0/en/controllers.html

+0

是啊,我知道,但我还想去做的饼干,因为浏览器记住了很长一段时间... –

+1

这听起来像人登录,如果是真的,你真的应该只是将它保存到个人配置文件,在登录时阅读并保存到会话中。 Cookie方式没有安全性。 –

+0

不,它的唯一必须是一个链接到动作,并且这个动作设置了一个cookie。如果cookie不存在,用户将看到一个条款和条件的页面,并且必须点击接受。 如果我使用会话,并且用户将关闭网页浏览器并再次打开它,他必须再次接受条款和条件,并且这不好 –

2

检查添加到你的AppController :: beforeFilter()

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

确保你不重定向到协议页面,如果你访问它,如果你不这样做,你最终会用重定向循环。将示例中的条件更改为您需要检查用户是否尝试访问协议页面的条件。

另外,还要确保你在你的控制器调用parent :: beforeFilter()beforeFilter()调用。如果您不知道如何调用父级方法或如何正确使用它,请阅读有关phps OOP的信息。 http://php.net/manual/en/language.oop5.php

0

也许在InfopagesController不工作,因为你忘了加载Cookie的组成部分,因为你已经在正确完成AgreementController。

在此之后,在你的AppController :: beforeFilter()检查:

1)什么是控制器;

2)如果控制器不等于“AgreementController”,然后检查是否用户具有该cookie。

您需要检查是否不等于“AgreementController”否则你创造无限的重定向。