正文:
在joomla中存在一个JRegistry类,这个类可以让我们用名字空间来存储或者返回数据。
数据存储在JRegistry对象中,这些数据按照命名空间来组织。
命名空间是一些独特的树形结构用来分类数据。假设我们需要存储一些动物在一个区域。我们可以用下面的结构:
animal
animal.total
animal.bord
animal.bird.chaffinch
animal.bird.swan
animal.mammal
animal.mamal.badger
animal.mammal.squirrel.red
animal.mammal.squirrel.grey
基于上面的例子。如果我们要知道多少种图案我们已经有的,我们将会使用registry返回animal.mammal.badger的值。
同样的,如果我们要知道有多少哺乳动物,我们返回animal.mammal就行了。
使用这个方式来存储数据的一个不好的地方就是这些数据只能够储存在一个路径上。如果一个数据有多种意义,那么使用这种方法就很难区分了。
JRegistry这类设计的主要目的是用来存储全局配置选项的。JRegistry是一个全局的对象。我们通常引用他为registry或者config.通过JFactory对象类访问。
$registry = & JFactory::getConfig();
JRegistry类有两个重要的方法,getValue()和setValue();这两个函数负责访问和修改registry的数据。下面的代码演示了怎样增减foo.bar到registry中。
$registry = & JFactory::getConfig();
$oldValue = $registry->getValue('foo.bar',0);//第二个参数为如果foo.bar不存在默认的返回值
$registry->setValue('foo.bar',++$oldValue);
网站的设置都在JRegistry的config命名空间中。
保存和加载Registry的值
JRegistry一个很好的功能就是保存和加载数据的能力。这个类支持两种不同的格式,运行时和文件。运行时的表现就是用数组和对象。文件的表现就是INI PHP和XML.
下面的例子演示了怎样去加载INI文件到myExtension的命名空间
$file = JPATH_COMPONENT.DS.'myExtension.ini';
$registry = $ JFactory::getConfig();
$registry ->loadFile($file,'INI','myExtension');
如果我们改变了myExtension命名空间的内容,我们可以将这个改变也保存到INI文件中:
// Jimport JFile
jimport('joomla.filesystem.file');
// Prepare for save
$file = JPATH_COMPONENT.DS.'myExtension.ini';
$registry = & JFactory::getConfig();
$ini = $registry->toString('INI','myExtension');
// save INI file
JFile::write($file,$ini);
导入XML格式的文件和INI的文件完全一样,我们只需要将所有的INI改为XML就可以了。导入PHP文件就稍微有些不一样了。网站的配置文件,configuration.php,就是一个很好的例子用php文件来存储数据。
PHP格式将会保存数据到类中,就拿网站的配置文件为例,这个类叫做JConfig.我们必须提供一个字符串的参数,当我们使用JRegistry的toString()方法将数据保存到文件的时候,这个字符串就是类的名称。
下面的代码演示了我们怎样去导出配置到PHP类中。
// import JFile
jimport('joomla.filesystem.file');
// prepare for save
$file = JPATH_COMPONENT.DS.'myExtension.php';
$registry = & JFactory::getConfig();
$php = $registry->toString('PHP','myExtension',array('class'=>'SomeClass'));
// save PHP file
JFile::write($file,$php);
如果你考虑使用这种机制去存储设置,那么我们需要考虑一下到底使用哪一种方式最好了。PHP和INI存储的最大的深度为0.而XML文件没有深度限制。那就用XML吧。
下面的代码演示了我们怎样表现一颗registry树。在三种不同的格式中。用PHP和INI格式的时候,需要注意数据丢失的问题
// PHP 格式
<?php
class JConfig
{
var $total = '10';
}
?>
// INI格式
total = 10
[bird]
chaffinch =1
swan =2
[mammal]
badger =3
// XML格式
<?xml version ="1.0" ?>
<config>
<group name="bird">
<entry name="chaffinch">1</entry>
<entry name ="swan">2</entry>
</group>
<group name="mammal">
<entry name="badger">3</entry>
<group name="squirrel">
<entry name="red">1</entry>
<entry name="red">1</entry>
</group>
</group>
</group>
</config>