当一个用户开始访问joomla网站的时候,那么系统就会创建一个session.即使用户没有登录,系统照样会创建一个session.在PHP中我们通过$_SESSION来操作session,在Joomla中,系统提供一个全局的JSession对象。这个对象通过对$_SESSION的操作进行封装,提供我们更加方便操作session的接口。
session一般的是用来在在不同页面间进行传递从参数的。当我们要读取一个参数,可以使用Jsession对象的get()方法,该方法提供3个参数,一个参数是参数的名称,一个是参数的默认值,一个是参数的命名空间。系统利用命名空间来避免数据的冲突,如果我们不提供命名空间,那么系统会提供一个默认的命名空间“default”.下面是一段典型的从session中读取数据的代码:
<?php
$session = JFactory::getSession();
$value = $session->get("userName","admin");
?>
一般情况下,我们都是从默认的命名空间中读取数据。所以get方法的第二个参数不是命名空间,而是参数的默认值。
JSession提供了一个set()方法来向session中设置变量。一个典型的调用方法如下:
<?php
$session = JFactory::getSession();
$session->set("userName","test","zmax");
?>
上面的代码中,我们在session的zmax空间中设置了一个变量,该变量的名称为userName,该变量的值为test.
由于JSession类能处理的命名空间是有限制的,因此推荐尽量使用默认的命名空间(defaut)来存储。为了方便操作,joomla系统在JSession中还提供了一个特殊的区域"user_state“.
在user-state中存储的是一个JRegistry对象,我们可以在default.registry中访问JRegistry这个对象。请注意,因为这个对象存储在session中,因此是可以跨页面使用的。系统提供两个方法来操作这个对象。getUserState()和getUserStateFromRequest().
我们通过调用getUserState()方法来获取JRegistry这个对象的值。一端典型的代码如下:
<?
$app = JFactory::getAppliction();
$app->getUserState('session.counter');
?>
上面的代码演示了如何获取session.counter的值,这个值代表了用户请求的数量。
如果要设置一个值,我们可以用setUserState()方法来完成。典型的代码:
<?php
$app = JFactory::getApplication();
$app->setUserState('test',"testvalue");
?>
getUserStateFromRequest()方法和getUserState()方法用法类似,但是getUserStateFromRequest方法会首先检查请求页面传递的参数,如果参数参数存在,就会用存数的值更新session中原先的值,最后将更新后的值返回。
getUserStateFromRequest()方法有3个参数,一个是键(一个路径,具体什么意思,暂时还不清楚),一个是变量的名称,一个事变量的默认值。典型的代码如下:
<?php
$app = JFactory::getApplication();
$app->getUserStateFromRequest('com_myextension.list.filter.order','filter_order','name');
?>
一般情况下这个方法通常用在分页中。因为这个方法允许用户修改本身的状态。哦,顺便说一下,没有setUserStateFromRequest()方法。
Joomla的session数据可以存储到多种地方。Joomla用session storage类去储存session数据。现在一般有数据库,Php-eacclerator和PHP-pecl-apc这些方法来存储session数据。
请注意,session数据的大小是由限制的,不能超过65535个字符。
为了方便理解:贴出Jessionl类的get方法的代码:
/**
* Get data from the session store
*
* @param string $name Name of a variable
* @param mixed $default Default value of a variable if not set
* @param string $namespace Namespace to use, default to 'default'
*
* @return mixed Value of a variable
*
* @since 11.1
*/
public function get($name, $default = null, $namespace = 'default')
{
// Add prefix to namespace to avoid collisions
$namespace = '__' . $namespace;
if ($this->_state !== 'active' && $this->_state !== 'expired')
{
// @TODO :: generated error here
$error = null;
return $error;
}
if (isset($_SESSION[$namespace][$name]))
{
return $_SESSION[$namespace][$name];
}
return $default;
}