cakephp会议

时间:2011-04-27 21:54:52

标签: php session cakephp

我是Cakephp的初学者,我对会话有很大的问题......

究竟发生了什么

我开始用ajax调用php文件(控制器)来初始化会话 这是来自ajax- url的网址:http://domain.com/things/view/0

我通过调用此url也尝试了没有ajax: http://domain.com/things/view/1

在这两种情况下,会话都是初始化的。 下面是我用来初始化会话的控制器

class ThingsController extends AppController {
    var $name = 'Things';
    var $components = array('Session');
    var $helpers = array('Html', 'Javascript', 'Ajax');
    var $uses = null;

    function index() {

        // preload dynamic data
        $this->set('data1', 'content will update here');
        $this->set('data2', 'here too');

        $this->render('neat');

    }

    function view($id, $idd) {

        if ($idd == 0) {
            $this->Session->write('language', 'ro');
        } else {
            $this->Session->write('language', 'en');
        }

        if (is_numeric($id)) {
            if ($id == 0) {
                $this->Session->write('language', 'ro');
            } else {
                $this->Session->write('language', 'en');
            }
        }


        $this->render('neat');
    } //view()
} //ThingsController

正如您所见if SESSION['language'] == 0 is ro else is en

使用的rooter规则是:

Router::connect('/things/:id/*', array('controller' => 'things', 'action' => 'view', 
'things'), array('pass' => 'id'));

但也没有这条规则的作品:)

现在,关于会话的页面有效:http://domain.com/despre-noi

我用过这个rooter:

Router::connect('/despre-noi/*', array('controller' => 'about', 'action' => 'display', 'about'));

这个控制器

function display() {
    if (isset($_SESSION["language"])) {
        $language = $_SESSION["language"];
        $this->Session->write('language', $_SESSION["language"]);
    } else {
        $this->Session->write('language', 'ro');
        $language = "ro";
    }
    include('views/pages/'.$language.'.ctp');

    $this->layout = 'default';

    $this->About->id = 1;
    $this->set('post1', $this - > About - > read());

}

但是在页面合作伙伴中:http://domain.com/parteneri

我使用过这个rooter的地方:

Router::connect('/parteneri/*', array('controller' => 'partner', 'action' => 'display', 'partner'));

以及下列控制器:

function display() {

    if (isset($_SESSION["language"])) {
        $language = $_SESSION["language"];
        $this->Session->write('language', $_SESSION["language"]);
    } else {
        $this->Session->write('language', 'ro');
        $language = "ro";
    }
    include('views/pages/'.$language.'.ctp');

    $this->layout = 'default';

    $this->set('posts', $this - > Partner - > find('all'));

}

它不起作用..

这2页与我在合作伙伴页面中使用$this->set('posts', $this->Partner->find('all'));然后在视图中使用foreach()的差异类似,我列出了项目,在页面中我读了一行

$this->About->id = 1;
$this->set('post1', $this->About->read());

可能是这个问题... 2个函数read()vs find()..或者只是巧合?

提前致谢

1 个答案:

答案 0 :(得分:2)

首先请确保您拥有:

Configure::write('Session.save', 'php');

app/config/core.php文件中。 Sessions ChapterCakePHP book给出了一些关于如何配置和使用会话组件的好例子。

此外,如果您要使用会话(即Session组件),最好提出:

var $components = array('Session');

AppController中。通过这种方式,每个控制器都可以使用该组件。

第二,如果您使用CakePHP的Session类来编写会话数据,那么您不应该直接访问该数据(即通过调用$_SESSION['language'])。这是不好的做法,因为如果你决定使用'database'作为会话存储,或者如果CakePHP决定会话数据应该加密,那么你的代码就会破坏,你不知道为什么。

简而言之,请在您的代码中使用$this->Session->read('language')(另外,请查看前面提到的Sessions Chapter,它还提供了一些很好的背景。

此外,由于您要实现的是国际化,在根据我的评论中的粘贴修复您的控制器后,您必须通过阅读CakePHP Internationalization Section来查看本地化的简便方法。有一种方法可以更轻松地执行操作,并在视图中将表示逻辑演示内容分开 - 但这是另一个问题的材料;)