来源:百度文库 编辑:偶看新闻 时间:2024/10/02 17:48:55
joomla源代码探析
(2011-07-29 14:57:33)
转载▼标签:joomla 杂谈分类: PHP joomla源代码探析(1):准备工作
用Joomla 建站一段时间了,由于采用了1.5RC3版,建站过程中发现了不少的问题,为了解决这些问题,看了不少的源代码,打算写一下源代码的学习过程。
首先是准备工作,源代码的学习过程其实也是一个不断测试代码的过程,所以:
1、搭建一个测试网站,我建议在本机上架一个WAMP环境,嘿嘿,为什么选择WAMP,主要个人习惯了,做了6年的linux下的程序员,还是不习惯emacs,呵呵,windows下的编辑器好用。
2、搭建测试网站建议直接采用SVN下来的代码,在windows上装一个tortoiseSVN,就可以了,joomla SVN reposity的地址是 http://joomlacode.org/svn/joomla/development/trunk
3、编辑器,我觉得挺重要的,我推荐使用 UE Studio ,用上你就知道了,能自动根据源码中的内容,生成类和函数的标签,你就不需要寻找document的生成器了。
4、搭建完成后,用UE建一个project ,导入源代码,时间有点点长,它在分析代买生成TAG,生成后,你就点击“标签”,就可以看到全部的类和函数,习惯了VC的编辑环境的人,肯定喜欢这个。
5、搜寻代码学习的资源,目前我也没找到,我只在http://dev.joomla.org 上查看了framework的文章,中文资源似乎就更少了,我是说1.5版的,1.0版的有几个中文网站谈到部分的代码问题,但是我没仔细看过质量到底如何。
到现在位置,已经建立了研究环境,下一步就是“开始”
joomla源代码探析(2):目录结构
测试网站搭建完毕,首先来熟悉一下,1.5RC3版的目录结构:
1、componets 所有安装的组件的,前端用户界面相关程序都在这里,每个组件一个子目录,通常是com_***
2、plugins 所有的插件,涉及的程序文件和模板文件,资源等等
3、modules 所以安装的模块相关的程序和资源
4、includes 涉及重要的类,定义等等
5、 languages,下面是所有的语言文件,新的规范是一种语言一个目录,比如英文就是en-GB,中文简体就是zh-CN,目录下是相应的语言定义文件,命名规则是 语种.组件名字(插件名字).ini ,比如 zh-CN.com_showcase.ini zh-CN.plg-***.ini等等。
6、templates 没说的,一种模板一个目录
7、library 最重要的目录之一了,下面都是重要的类文件,子目录结构对应类名称,比如
jimport( 'joomla.environment.uri' );
那么对应的是 joomla/environment/uri.hp 文件
其他的cache,logs目录就不说了,以后用的到。
joomla源代码探析(3):万源之源
万源之源,这个名字非常有意思,老是让我想起小时候,玩的那种圆圆的纸牌,在土地中玩的,用自己的纸牌把别人的打翻了就赢了别人的,大部分都是纸壳剪的,偶尔也有用油毡纸,或者石棉纸做的,通常把这种好的牌或者那种连赢了几次的纸牌作为自己的镇家宝贝,在牌背面上写上“保家之宝”,也有“宝家之宝”,我曾经留了几张一直到高三毕业。哈哈哈!现在不知道去那里了,也许父母还留着吧。
documentroot/index.php ,以及 templateindex.php ,可以称为万源之源,因为可以说所有的页面都是这两个文件的成果。
/index.php 是所有页面程序的起点,让我们来看看这个文件到底做了什么?
define( '_JEXEC', 1 ); //标志这是一个跟文件
define('JPATH_BASE', dirname(__FILE__) ); //取得Document root,就是 /index.php所在的绝对路径
define( 'DS', DIRECTORY_SEPARATOR ); // 定义目录分隔符
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); //defines.php定义了一些目录变量,以后详细的写
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
//framework.php是另一个非常重要的文件,在framework.php读入了config.php中定义的变量,同时
//framework中引入了一些的基础类,例如JFactory,JUser等等
//全局对象,工厂类JFactory,JFactory符合设计模式中的工厂模式,基本生成的对象大部分是单例模式,接下来我详细描述JFactory,JFactory 在/libraries/joomla/factory.php中定义,
$mainframe =& JFactory::getApplication('site');
//取得JApplication 对象,JApplication是一个工厂类,提供了一些指定对象的生成,并提供了一系列的api函数
//application初始化过程,设置语言,并缺的editor的设置,并生成Juser对象
$mainframe->initialise();
//引入system 组的插件
JPluginHelper::importPlugin('system');
// 触发初始化完毕后定义的pluging响应事件
$mainframe->triggerEvent('onAfterInitialise');
//route()函数,根据url生成进行解析,设置JRequest
$mainframe->route();
// authorization
$Itemid = JRequest::getInt( 'Itemid');
$mainframe->authorize($Itemid);
//触发route后plugin
JDEBUG ? $_PROFILER->mark('afterRoute') : null;
$mainframe->triggerEvent('onAfterRoute');
//根据JRequest的的option参数,dispatch到那个组件,也就决定页面的内容部分是那个组件生成
$option = JRequest::getCmd('option');
$mainframe->dispatch($option);
//触发dispatch后的plugin
JDEBUG ? $_PROFILER->mark('afterDispatch') : null;
$mainframe->triggerEvent('onAfterDispatch');
//页面的渲染过程,生成整个页面html
$mainframe->render();
// trigger the onAfterDisplay events
JDEBUG ? $_PROFILER->mark('afterRender') : null;
$mainframe->triggerEvent('onAfterRender');
echo JResponse::toString($mainframe->getCfg('gzip'));
以上是 /index.php的内容,从这个index.php的引出了几个重要的文件需要我们去注意
/includes/defines.php
/includes/framework.php
/libraries/joomla/application.php
/libraries/joomla/factory.php
接下来我们主要看看这些文件。
joomla源代码探析(4):defines.php
其实这个文件没什么好说的,主要就是定义一些路径,贴出来,主要是以后文件中提这些路径的时候,有一个印象
$parts = explode( DS, JPATH_BASE );
//Defines
define( 'JPATH_ROOT', implode( DS, $parts ) );
define( 'JPATH_SITE', JPATH_ROOT );
define( 'JPATH_CONFIGURATION', JPATH_ROOT );
define( 'JPATH_ADMINISTRATOR', JPATH_ROOT.DS.'administrator' );
define( 'JPATH_XMLRPC', JPATH_ROOT.DS.'xmlrpc' );
define( 'JPATH_LIBRARIES', JPATH_ROOT.DS.'libraries' );
define( 'JPATH_PLUGINS', JPATH_ROOT.DS.'plugins' );
define( 'JPATH_INSTALLATION', JPATH_ROOT.DS.'installation' );
define( 'JPATH_THEMES' , JPATH_BASE.DS.'templates' );
define( 'JPATH_CACHE', JPATH_BASE.DS.'cache');
这些路径在以后的文件中经常用到。
joomla源代码探析(5):framework.php
/include/framework.php 这个文件在index.php中是最早引入的文件之一,这个文件主要实现了一些基本类的引入,下面我们逐一看一下:
require_once( JPATH_LIBRARIES . DS . 'loader.php' ); //loader.php 是一个载入类的基本工作,最重要的是Jimport
比如 jimport( 'joomla.environment.response' ); 实际上就include_once /libaries/jooma/environment/response.php
require_once( JPATH_CONFIGURATION . DS . 'configuration.php' ); //引入了configuration.php
jimport( 'joomla.base.object' );
jimport( 'joomla.environment.request' );
JRequest::clean(); //清空Jrequest
// System configuration
$CONFIG = new JConfig(); //读取配置文件,生成Jconfig对象
if (JDEBUG) {
jimport( 'joomla.utilities.profiler' );
$_PROFILER =& JProfiler::getInstance( 'Application' );
}
以上这段主要是如果配置处于debug状态,那么就生成$_PROFILER,这个对象主要要用来,记录页面执行到某一节点的执行时间,内存状态调试信息。
jimport( 'joomla.environment.response' );
jimport( 'joomla.application.menu' ); //needs to be loaded later
jimport( 'joomla.user.user');
jimport( 'joomla.environment.uri' );
jimport( 'joomla.factory' );
jimport( 'joomla.methods' );
jimport( 'joomla.html.html' ); //needs to be loaded later
jimport( 'joomla.utilities.array' ); //needs to be loaded later
jimport( 'joomla.utilities.error' );
jimport( 'joomla.utilities.utility' );
jimport( 'joomla.utilities.string' ); //needs to be loaded later
jimport( 'joomla.filter.output' );
jimport( 'joomla.version' ); //needs to be loaded later
jimport( 'joomla.event.*');
这些引入的类中,比较重要的是 factory user menu ,需要仔细研究一下,其他的用的时候,再仔细看文档就行啦,
当然,methods也包含了很多基本的函数和类,尤其是需要了解SEF的时候。
接下来,我们将仔细看看/index.php中 $mainframe =& JFactory::getApplication('site') 这句话到底完成了什么工作。
Joomla源代码解析(6):JDocument 类的几个常用的方法
在google搜索我的网站就会发现一些,因为没有注意meta和title 所有的开源项目相关的页面title和meta都一样,对用户很不友好,根本无法分清那个链接是说什么内容的,那么这里就需要JDocuement类来解决问题
用法很简单,首先取得document对象 $document =& JFactory::getDocument();
然后:
$document->setTitle(*****);
$document->setDescription(*****); //添加 meta
$document->addStyleSheet(*****) //添加CSS文件
$document->addScript(*****) //添加js脚本
$document->setLanguage(***) //设置语言文件
其他还有一些 setModifiedDate 等,其他基本就不常用了,记住这些就行啦!
Joomla源代码解析(7):JFactory 类
JFactory类,正如其名,这是一个工厂类,应该是简单工厂模式的标准实现。这个类几个重要的函数分别返回几个重要的实例。
1、getACL 调用_createACL 返回 joomla.user.authorization 的实例,数据来源
2、getApplication 调用 joomla.application.application 的实例获取函数JApplication::getInstance,也就是我们在index.php中提到的 $mainframework
3、getConfig 调用 _createConfig 返回 joomla.registry.registry 实例,返回配置参数
4、getDBO 调用 _createDBO,返回数据连接JDatabase的实例,这个是以后扩展模块要经常用到的
5、getDocument 调用 _createDocument 根据请求的格式,返回JDocumentRaw或者JDocumentHtml实例
6、返回 Juser 实例
7、getLanguage 调用 _createLanguage 返回 joomla.i18n.language的实例,以后在多语言环境经常用到。
其他的比如getMailer,getCache 等就不在写了
Joomla源代码解析(8):JDatabase 类
这是数据库connector类,封装了与数据库操作的一系列操作。目前有两个子类,JDatabaseMysql,JDatabaseMysqli,这个类为以后扩展到其他数据库留出了接口。
关于一些具体函数没有什么特殊的,基本对应mysql的函数的一些特征,对于这个类应用基本都是首先 setquery ,然后load
或者直接执行 executequery ,主要还是不要混淆load开头的几个函数的具体功能:
1、loadObject 以对象的形式返回结果集的第一行数据
2、loadObjectList 对应上一个函数,返回一个对象的集合
3、loadResult 返回第一行的第一个字段或者NULL
4、loadResultArray 返回某一字段的数据到一个数组中
5、loadRow 返回第一行数据,应该是数组形式
6、loadRowList 对应上一个函数,返回行数据的集合
还有一个函数很重要就是 setUTF ,这个函数决定了数据库能显示中文。
Joomla源代码解析(9):JUser 类
user 类处理所有程序中与用户交互的相关事情。
这个类的构造函数调用load函数,输入的参数是用户id,可以初始化用户的相关信息,这些信息包括 aid ,gid,usertype,username,name,id等等,这些信息在扩展中经常用到。
同时,在程序中,用刚刚说过的getUser,取得当前登录用户实例。具体用法如下:
$user =& JFactory::getUser();
$userId = (int) $user->get('id');
根据gid 可以判断用户的相关的组以及组权限。
了解了Juser类,还需要了解一下 JUserHelper类,这个类包括了与用户活动相关的几个函数,比如获得随机密码以及取得加密密码等。
同样 getUserId 根据用户名取得用户ID 也是经常用到的。
Joomla源代码解析(10):JPath JFile JFolder