我是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()..或者只是巧合?
提前致谢
答案 0 :(得分:2)
首先请确保您拥有:
Configure::write('Session.save', 'php');
在app/config/core.php
文件中。 Sessions Chapter的CakePHP book给出了一些关于如何配置和使用会话组件的好例子。
此外,如果您要使用会话(即Session
组件),最好提出:
var $components = array('Session');
在AppController
中。通过这种方式,每个控制器都可以使用该组件。
第二,如果您使用CakePHP的Session类来编写会话数据,那么您不应该直接访问该数据(即通过调用$_SESSION['language']
)。这是不好的做法,因为如果你决定使用'database'
作为会话存储,或者如果CakePHP决定会话数据应该加密,那么你的代码就会破坏,你不知道为什么。
简而言之,请在您的代码中使用$this->Session->read('language')
(另外,请查看前面提到的Sessions Chapter,它还提供了一些很好的背景。
此外,由于您要实现的是国际化,在根据我的评论中的粘贴修复您的控制器后,您必须通过阅读CakePHP Internationalization Section来查看本地化的简便方法。有一种方法可以更轻松地执行操作,并在视图中将表示逻辑与演示内容分开 - 但这是另一个问题的材料;)