Joomla系统中模块运行原理研究

2014-12-13 20:10陈玉
软件工程 2014年12期

陈玉

摘  要:本文主要研究Joomla系统中模块的工作原理;文章首先分析模块的结构,然后依次分析模块中XML文件的工作机理,接着分析模块中的入口文件,再接着分析模块中的helper类文件;最后对模块的一些特点作了总结。

关键词:Joomla;内容管理系统;Joomla模块结构;Joomla工作原理

中图分类号:TP311.5           文献标识码:A

1   引言(Introduction)

随着网络应用的快速发展,内容管理系统应用而生。相比传统建站模式,内容管理系统具有许多基于模板的优秀设计,可以加快网站的开发速度及减少开发成本。内容管理系统的基本思想是分离内容的管理和设计,页面存储在模板里,而内容存储在独立的文件中或数据库中[1]。

2  国内外发展概况(Developments at home and

abroad)

国外的内容管理系统有WordPress、Joomla及Drupal等,这些系统应用了非常多的建站新技术,同时每个系统都留有第三方开发接口,可供二次开发,具有较大的灵活性。国内比较有名的内容管理系统,如Discuz、DedeCMS和PHPWind等,这几种系统的优点是访问速度快,缺点是系统集成度高,不能完全实现模块化,不便于二次开发,扩展能力不够强大。

3  Joomla系统中模块具体研究分析(The concrete

study of modules)

本文主要对Joomla系统的模块进行分析研究;在Joomla系统中,模块的典型特点是简洁、轻量级的,模块主要是为用户提供消息和导航选项。针对具体研究实例,文中以Joomla系统中的最新用户模块(Latest user module)进行分析研究,最新用户模块主要功能是显示网站新注册的用户;同时通过调节模块参数可以控制显示的用户数,也可以显示用户相关介绍及联系信息。

模块的具体文件和文件夹结构见表1。

表1 模块结构

Tab.1 The structure of modules

文件 描述

tmpl/default.php 布局文件

helper.php 功能文件

mod_users_latest.php 入口文件

mod_users_latest.xml 安装文件及选项

根据表中模块里的各类文件,下面进行具体分析。

3.1   模块中的XML文件

模块里的xml文件主要包括模块安装和卸载时所用到的文件及文件夹信息,同时也包括模块中一些参数的定义。

<;filename

module="mod_users_latest">;mod_users_latest.php<;/filename>;

<;folder>;tmpl<;/folder>;

<;filename>;helper.php<;/filename>;

<;filename>;index.html<;/filename>;

<;language tag="en- GB">;en- GB.mod_users_latest.ini<;/language>;

<;language tag="en- GB">;en- GB.mod_users_latest.sys.ini<;/language>;

上述代码主要定义模块中所用到的相关文件,而文件夹tmpl下的文件只须定义该文件夹即可;代码中还定义了两个语言文件,这两个语言文件将被安装到Joomla系统的核心语言文件夹下,而不是安装到扩展语言文件夹下;同时在xml文件中还定义了模块中参数的属性,即三个基本属性和五个高级属性,限于篇幅这里在代码中做了省略[2]。

3.2   模块主入口文件

模块在运行时,需要装载一个和该模块文件夹同名的PHP文件,如最新用户模块就会装载modules/mod_users_latest/mod_users_latest.php位置的PHP文件;主入口文件代码片断如下:

require_oncedirname(__FILE__).'/helper.php';

$shownumber=$params->;get('shownumber', 5);

$name=moduserslatestHelper::getUsers($params);

$linknames=$params->;get('linknames', 0);

$moduleclass_sfx=htmlspecialchars($params->;

get('moduleclass_sfx'));

requireJModuleHelper::getLayoutPath('mod_users_latest', $params->;get('layout', 'default'));

上述代码中,require_oncedirname(__FILE__).'/helper.php'语句主要是模块中需要用到helper类,helper类文件主要是为模块提供各类方法,模块的主要处理事宜都集中在helper类中。接下来语句调用getUsers()方法,并将结果存储到变量$linknames中;在这个方法中利用了一个很重要的$params中间变量,该变量在文件中没有声明,到底来自哪里?经过分析后得知结果如此:首先在系统JModuleHelper类的renderModule()方法中,有require $path语句,$path变量中存放模块入口文件的全名(即mod_users_latest.php);其次在PHP中require命令会将所包含文件“粘贴”般的插入当前文件,由于mod_users_latest.php是一般脚本,不包含类文件,所以require命令包含的文件内容也会被立即执行;最后发现,$params在renderModule()里的早些时候已被定义,所以也就找到了$params变量的出处[2]。endprint

再回到上述代码片断的$linknames变量,该变量是在执行模块布局的时候用到。下面语句行是取得模块类后缀选项,模块类后缀允许开发者微调模块中的CSS文件。最后一行语句是从模块的参数中取得布局选项。在上述代码开始,也可以用Joomla自带的方法JLoader::register()代替require_once,从而取得更快的执行速度。

3.3   模块中的helper类文件

helper类是模块信息的来源,如下是类中getUsers()方法的代码片断:

static function getUsers($params)

{

$db=JFactory::getDbo();

$query=$db->;getQuery(true);

$result=$db->;loadObjectList();

return (array) $result;

}

上述代码中将方法声明为静态,这样可以通过类名调用。代码首行定义JDatabase对象$db,在Joomla中可以通过JDatabase对象提取数据库中的数据,接下来的语句是定义JDatabaseQuery查询对象,loadObjectList()以数组形式将各行返回。此外,JDatabaseQuery基本上是SQL声明形式的一个镜像,不同于SQL声明,JDatabaseQuery可以以我们想要的任何顺序来书写,而SQL声明则必须以正确的顺序来书写。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL数据库;当使用JDatabaseQuery建立所有的数据查询时,查询都会在这些数据库中完美运行;这些功能主要得益于在各种数据库使用SQL命令时,系统的查询类具有很好的差异适应能力。

3.4   模块中的默认布局文件

默认布局文件代码片断如下:

<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;

<;?phpforeach($names as $name) : ?>;

<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;

代码片断中if声明使用了替换性PHP语法,这种用法一般使用在PHP和HTML混合的布局文件中;在这里if声明主要来判断$names是否为空,这样可以避免在页面上输出空元素。

上述代码中用到了$names变量,$names来自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)语句。接下来的部分用到了foreach循环,该循环是遍历数组元素比较方便的方法,$name变量是数组中的当前元素;假如数组为空,程序将彻底跳转循环。同时在代码中使用echo命令在属性中插入变量,在插入变量时需要注意空格的重要性,即在latestusers和echo命令返回的变量之间是不能有空格的,否则会出错。

4   结论(Conclusion)

最后再对上述各部分做一下总结。首先,模块和Joomla站点的其余部分是无缝接合的;其次,模块完全支持多种语言,模块将根据所建立的两个相应语言文件自动进行显示;第三,模块支持替换式布局和模板布局覆盖,通过使用getLayoutPath()方法来获得布局文件;第四,模块允许用户输入各类参数选项来控制模块的运行[3];第五,模块可以安全防护各类SQL注入和其他站点攻击行为;最后,模块可以做到很好的安装和卸载,更方便站点的维护。

参考文献(References)

[1] 边霞,等.基于MVC的文件备份后台管理系统的设计与实现

[J].计算机工程与设计,2011,32:3195-3198.

[2] 胡建强,马樱,朱顺痣.基于本体的网络化软件需求内容管理

系统的研究与实现[J].计算机应用与软件,2013,30(12):31-34.

[3] 盛安元,黄存东,张前进.基于开源软件Drupal工程实践[J].武

汉工业学院学报,2013,31(2):65-67.

作者简介:

陈  玉(1975-),男,硕士,中级实验师.研究领域:计算机应

用,信息检索.endprint

再回到上述代码片断的$linknames变量,该变量是在执行模块布局的时候用到。下面语句行是取得模块类后缀选项,模块类后缀允许开发者微调模块中的CSS文件。最后一行语句是从模块的参数中取得布局选项。在上述代码开始,也可以用Joomla自带的方法JLoader::register()代替require_once,从而取得更快的执行速度。

3.3   模块中的helper类文件

helper类是模块信息的来源,如下是类中getUsers()方法的代码片断:

static function getUsers($params)

{

$db=JFactory::getDbo();

$query=$db->;getQuery(true);

$result=$db->;loadObjectList();

return (array) $result;

}

上述代码中将方法声明为静态,这样可以通过类名调用。代码首行定义JDatabase对象$db,在Joomla中可以通过JDatabase对象提取数据库中的数据,接下来的语句是定义JDatabaseQuery查询对象,loadObjectList()以数组形式将各行返回。此外,JDatabaseQuery基本上是SQL声明形式的一个镜像,不同于SQL声明,JDatabaseQuery可以以我们想要的任何顺序来书写,而SQL声明则必须以正确的顺序来书写。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL数据库;当使用JDatabaseQuery建立所有的数据查询时,查询都会在这些数据库中完美运行;这些功能主要得益于在各种数据库使用SQL命令时,系统的查询类具有很好的差异适应能力。

3.4   模块中的默认布局文件

默认布局文件代码片断如下:

<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;

<;?phpforeach($names as $name) : ?>;

<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;

代码片断中if声明使用了替换性PHP语法,这种用法一般使用在PHP和HTML混合的布局文件中;在这里if声明主要来判断$names是否为空,这样可以避免在页面上输出空元素。

上述代码中用到了$names变量,$names来自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)语句。接下来的部分用到了foreach循环,该循环是遍历数组元素比较方便的方法,$name变量是数组中的当前元素;假如数组为空,程序将彻底跳转循环。同时在代码中使用echo命令在属性中插入变量,在插入变量时需要注意空格的重要性,即在latestusers和echo命令返回的变量之间是不能有空格的,否则会出错。

4   结论(Conclusion)

最后再对上述各部分做一下总结。首先,模块和Joomla站点的其余部分是无缝接合的;其次,模块完全支持多种语言,模块将根据所建立的两个相应语言文件自动进行显示;第三,模块支持替换式布局和模板布局覆盖,通过使用getLayoutPath()方法来获得布局文件;第四,模块允许用户输入各类参数选项来控制模块的运行[3];第五,模块可以安全防护各类SQL注入和其他站点攻击行为;最后,模块可以做到很好的安装和卸载,更方便站点的维护。

参考文献(References)

[1] 边霞,等.基于MVC的文件备份后台管理系统的设计与实现

[J].计算机工程与设计,2011,32:3195-3198.

[2] 胡建强,马樱,朱顺痣.基于本体的网络化软件需求内容管理

系统的研究与实现[J].计算机应用与软件,2013,30(12):31-34.

[3] 盛安元,黄存东,张前进.基于开源软件Drupal工程实践[J].武

汉工业学院学报,2013,31(2):65-67.

作者简介:

陈  玉(1975-),男,硕士,中级实验师.研究领域:计算机应

用,信息检索.endprint

再回到上述代码片断的$linknames变量,该变量是在执行模块布局的时候用到。下面语句行是取得模块类后缀选项,模块类后缀允许开发者微调模块中的CSS文件。最后一行语句是从模块的参数中取得布局选项。在上述代码开始,也可以用Joomla自带的方法JLoader::register()代替require_once,从而取得更快的执行速度。

3.3   模块中的helper类文件

helper类是模块信息的来源,如下是类中getUsers()方法的代码片断:

static function getUsers($params)

{

$db=JFactory::getDbo();

$query=$db->;getQuery(true);

$result=$db->;loadObjectList();

return (array) $result;

}

上述代码中将方法声明为静态,这样可以通过类名调用。代码首行定义JDatabase对象$db,在Joomla中可以通过JDatabase对象提取数据库中的数据,接下来的语句是定义JDatabaseQuery查询对象,loadObjectList()以数组形式将各行返回。此外,JDatabaseQuery基本上是SQL声明形式的一个镜像,不同于SQL声明,JDatabaseQuery可以以我们想要的任何顺序来书写,而SQL声明则必须以正确的顺序来书写。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL数据库;当使用JDatabaseQuery建立所有的数据查询时,查询都会在这些数据库中完美运行;这些功能主要得益于在各种数据库使用SQL命令时,系统的查询类具有很好的差异适应能力。

3.4   模块中的默认布局文件

默认布局文件代码片断如下:

<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;

<;?phpforeach($names as $name) : ?>;

<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;

代码片断中if声明使用了替换性PHP语法,这种用法一般使用在PHP和HTML混合的布局文件中;在这里if声明主要来判断$names是否为空,这样可以避免在页面上输出空元素。

上述代码中用到了$names变量,$names来自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)语句。接下来的部分用到了foreach循环,该循环是遍历数组元素比较方便的方法,$name变量是数组中的当前元素;假如数组为空,程序将彻底跳转循环。同时在代码中使用echo命令在属性中插入变量,在插入变量时需要注意空格的重要性,即在latestusers和echo命令返回的变量之间是不能有空格的,否则会出错。

4   结论(Conclusion)

最后再对上述各部分做一下总结。首先,模块和Joomla站点的其余部分是无缝接合的;其次,模块完全支持多种语言,模块将根据所建立的两个相应语言文件自动进行显示;第三,模块支持替换式布局和模板布局覆盖,通过使用getLayoutPath()方法来获得布局文件;第四,模块允许用户输入各类参数选项来控制模块的运行[3];第五,模块可以安全防护各类SQL注入和其他站点攻击行为;最后,模块可以做到很好的安装和卸载,更方便站点的维护。

参考文献(References)

[1] 边霞,等.基于MVC的文件备份后台管理系统的设计与实现

[J].计算机工程与设计,2011,32:3195-3198.

[2] 胡建强,马樱,朱顺痣.基于本体的网络化软件需求内容管理

系统的研究与实现[J].计算机应用与软件,2013,30(12):31-34.

[3] 盛安元,黄存东,张前进.基于开源软件Drupal工程实践[J].武

汉工业学院学报,2013,31(2):65-67.

作者简介:

陈  玉(1975-),男,硕士,中级实验师.研究领域:计算机应

用,信息检索.endprint