分享

joomla源代码探析

 sumi2005 2011-12-22

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:///svn/joomla/development/trunk

3、编辑器,我觉得挺重要的,我推荐使用 UE Studio ,用上你就知道了,能自动根据源码中的内容,生成类和函数的标签,你就不需要寻找document的生成器了。

4、搭建完成后,用UE建一个project ,导入源代码,时间有点点长,它在分析代买生成TAG,生成后,你就点击标签,就可以看到全部的类和函数,习惯了VC的编辑环境的人,肯定喜欢这个。

5、搜寻代码学习的资源,目前我也没找到,我只在http://dev. 上查看了framework的文章,中文资源似乎就更少了,我是说1.5版的,1.0版的有几个中文网站谈到部分的代码问题,但是我没仔细看过质量到底如何。

到现在位置,已经建立了研究环境,下一步就是开始



joomla源代码探析(2):目录结构

测试网站搭建完毕,首先来熟悉一下,1.5RC3版的目录结构:

1componets 所有安装的组件的,前端用户界面相关程序都在这里,每个组件一个子目录,通常是com_***

2plugins 所有的插件,涉及的程序文件和模板文件,资源等等

3modules 所以安装的模块相关的程序和资源

4includes 涉及重要的类,定义等等

5、 languages,下面是所有的语言文件,新的规范是一种语言一个目录,比如英文就是en-GB,中文简体就是zh-CN,目录下是相应的语言定义文件,命名规则是 语种.组件名字(插件名字).ini ,比如 zh-CN.com_showcase.ini zh-CN.plg-***.ini等等。

6templates 没说的,一种模板一个目录

7library 最重要的目录之一了,下面都是重要的类文件,子目录结构对应类名称,比如

jimport( 'joomla.environment.uri' );

    那么对应的是 joomla/environment/uri.hp 文件

其他的cache,logs目录就不说了,以后用的到。



joomla源代码探析(3):万源之源

    万源之源,这个名字非常有意思,老是让我想起小时候,玩的那种圆圆的纸牌,在土地中玩的,用自己的纸牌把别人的打翻了就赢了别人的,大部分都是纸壳剪的,偶尔也有用油毡纸,或者石棉纸做的,通常把这种好的牌或者那种连赢了几次的纸牌作为自己的镇家宝贝,在牌背面上写上保家之宝,也有宝家之宝,我曾经留了几张一直到高三毕业。哈哈哈!现在不知道去那里了,也许父母还留着吧。

documentroot/index.php ,以及 templateindex.php ,可以称为万源之源,因为可以说所有的页面都是这两个文件的成果。

/index.php 是所有页面程序的起点,让我们来看看这个文件到底做了什么?



define( '_JEXEC', );   //标志这是一个跟文件

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符合设计模式中的工厂模式,基本生成的对象大部分是单例模式,接下来我详细描述JFactoryJFactory /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);

//触发routeplugin
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搜索我的网站就会发现一些,因为没有注意metatitle 所有的开源项目相关的页面titlemeta都一样,对用户很不友好,根本无法分清那个链接是说什么内容的,那么这里就需要JDocuement类来解决问题

用法很简单,首先取得document对象 $document =& JFactory::getDocument();

然后:
$document->setTitle(*****);

$document->setDescription(*****); //添加 meta

$document->addStyleSheet(*****) //添加CSS文件

$document->addScript(*****) //添加js脚本

$document->setLanguage(***)  //设置语言文件

其他还有一些 setModifiedDate 等,其他基本就不常用了,记住这些就行啦!



Joomla源代码解析(7)JFactory 类 

JFactory类,正如其名,这是一个工厂类,应该是简单工厂模式的标准实现。这个类几个重要的函数分别返回几个重要的实例。

1getACL 调用_createACL 返回 joomla.user.authorization 的实例,数据来源

2getApplication 调用 joomla.application.application 的实例获取函数JApplication::getInstance,也就是我们在index.php中提到的 $mainframework

3getConfig 调用 _createConfig 返回 joomla.registry.registry 实例,返回配置参数

4getDBO 调用 _createDBO,返回数据连接JDatabase的实例,这个是以后扩展模块要经常用到的

5getDocument 调用 _createDocument 根据请求的格式,返回JDocumentRaw或者JDocumentHtml实例

6、返回 Juser 实例

7getLanguage 调用 _createLanguage 返回 joomla.i18n.language的实例,以后在多语言环境经常用到。

其他的比如getMailergetCache 等就不在写了



Joomla源代码解析(8)JDatabase 

这是数据库connector类,封装了与数据库操作的一系列操作。目前有两个子类,JDatabaseMysql,JDatabaseMysqli,这个类为以后扩展到其他数据库留出了接口。

关于一些具体函数没有什么特殊的,基本对应mysql的函数的一些特征,对于这个类应用基本都是首先 setquery ,然后load

或者直接执行 executequery ,主要还是不要混淆load开头的几个函数的具体功能:

1loadObject 以对象的形式返回结果集的第一行数据

2loadObjectList 对应上一个函数,返回一个对象的集合

3loadResult 返回第一行的第一个字段或者NULL

4loadResultArray 返回某一字段的数据到一个数组中

5loadRow 返回第一行数据,应该是数组形式

6loadRowList 对应上一个函数,返回行数据的集合

还有一个函数很重要就是 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 类 

这几个类都是filesystem包中的重要类,具体的使用看我在模块快速生成器中的代码,函数意义都非常明确:

  if(JFolder::exists($targetpath)) JFolder::delete($targetpath);
  JFolder::create($targetpath);
  JFolder::create($targetpath.DS.'tmpl');


  以上是目录使用的例子

  $sfile=$sourcepath.DS.'index.html';
  $tfile=$targetpath.DS.'index.html';
  JFile::copy($sfile,$tfile);
  $files[]=$tfile;
  文件拷贝

  $sfile=$sourcepath.DS.'helper.php';
  $data=JFile::read($sfile);
   $tfile $targetpath.'/helper.php';
  JFile::write($tfile,$data);
  $files[]=$tfile;
  unset($data);

文件读取和写入



Joomla源代码解析(11)JHtml 类 

JHtml 没有几个函数,但是在组成页面已经模板书写过程中经常用到,比如:

JHTML::_('date', $this->item->date, JText::_('DATE_FORMAT_LC5'))

以及在后台管理中常用到的

来看看这几个函数:

calendar 显示一个日历插件

date 显示格式化日期

iframe 插入一个iframe

image  插入一个图片

link 插入一个超链

以上是常用的函数,函数的以用方式就如例子。



Joomla源代码解析(12)JToolBarHelper JToolBar 

这个两个类是后台管理过程经常用到的,比如:

  JToolBarHelper::title(   JText::_( '{{component}} Manager' ), 'generic.png' );

  JToolBarHelper::deleteList();

  JToolBarHelper::editListX();

  JToolBarHelper::addNewX();

这几句就添加了三个按钮,添加,删除,修改

其实还有几个常用的

preview  //预览

publish //发布

cancel //取消

比较常用的就这几个了,主要是在后台管理toolbar上的按钮。相关按钮的动作对应后台管理的task,相应的对做要在controller中生命。



Joomla源代码解析(13)JText

Joomla 最常用的类之一,使用方式JTEXT::_('JJJJJ')

JJJJJ对应语言文件中的相应字符串。

为了实现多语言这个是常用的。当然如果你以utf-8字符集存储php文件,对于中文就不用考虑那么多了,不过不够规范喓。

要是只是自己用,也无所谓啦,开发要快点。

呵呵!推荐还是用吧!



Joomla源代码解析(14)JRequest

这是另一个Joomla扩展中最常用的类,这个类封装了客户端提交的请求相关的信息,通过这个类你可以得到用户提交的相关信息和数据,有几个重要的函数:

首先是get($hash),我们看看部分源码就知道,get得到什么了

  switch ($hash)
  {
   case 'GET' :
    $input $_GET;
    break;

   case 'POST' :
    $input $_POST;
    break;

   case 'FILES' :
    $input $_FILES;
    break;

   case 'COOKIE' :
    $input $_COOKIE;
    break;

   case 'ENV'    :
    $input &$_ENV;
    break;
   
   case 'SERVER'    :
    $input &$_SERVER;
    break;

   default:
    $input $_REQUEST;
    break;
  }

我们通过get('post') 等取得用户提交的数据数组。

还有getVar ,取得某一request变量

getURI ,返回请求的URI

setVarset 则对应着getVar get

在程序中使用的方式是:JRequest::getVar('','');



Joomla源代码解析(15):组件是如何被调用并渲染的

Joomla代码中, 组件是如何被调用并渲染的呢?

在描述 /index.php的时候,我们看到根据option参数,$mainframework->dispatch(),就进入了组件的调用并渲染的过程,我们来看看JSite dispatch都做了什么工作。

dispatch 最关键的是这几句话:

  $document->setTitle( $params->get('page_title') );   //设置标题
  $document->setDescription( $params->get('page_description') );  //设置meta

  $contents JComponentHelper::renderComponent($component);
  $document->setBuffer( $contents, 'component');

可以看到最为关键的是 JComponentHelper::renderComponent($component);

再看看这一行程序完成了那些工作

  $task JRequest::getString( 'task' );

  // Build the component path
  $name preg_replace('/[^A-Z0-9_\.-]/i', '', $name);
  $file substr( $name, );

  // Define component path
  define( 'JPATH_COMPONENT',     JPATH_BASE.DS.'components'.DS.$name);
  define( 'JPATH_COMPONENT_SITE',    JPATH_SITE.DS.'components'.DS.$name);
  define( 'JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR.DS.'components'.DS.$name);

  // get component path
  if $mainframe->isAdmin() && file_exists(JPATH_COMPONENT.DS.'admin.'.$file.'.php') {
   $path JPATH_COMPONENT.DS.'admin.'.$file.'.php';
  else {
   $path JPATH_COMPONENT.DS.$file.'.php';
  }

这部分实际上确定了那个compoent下的组件文件被引入,并取得了task,中间一部分兼容代码就不看了

我们来看关键代码:

  ob_start();
  require_once $path;
  $contents ob_get_contents();
  ob_end_clean();

这部分代码就是包含了组件的开始文件,而这个文件,我们在组件开发的时候用到的。这个文件引入了controller 文件,并根据task决定进入那个分支。

再深入下去就是组件的整个生成过程,以后再看了。



Joomla源代码解析(16)JTable是什么

JTable是什么?肯定不是对应html中的table ,在做com_helloworld的时候,没有仔细理解,后来一位同事问我Jmodel,JTable,JDatabase有什么区别?一时语塞

JTable 是数据库中数据表在程序中的表达,不知道这句话怎么说,其实JTable更对应着表中的一行,以及相应的操作。Joomla中的JTable**对应中数据库中 **表,我们在使用的时候要针对我们自己所使用的表扩展自己的JTable.我们需要关注的是JTable的函数checkin,checkout ,着两个函数对更新的数据进行合法性检查,我个人觉得对于数据完整性的检查应该放在Jtablecheck中。

Jtable 比较常用的函数,看名字就明白了,记住几个吧:

delete,store,bind,load,setError等,具体还是需要用的时候看看源代码吧。



Joomla源代码解析(17)JModel是什么

我们经常提到MVC模式,JModelJoomlaMVC组件中是重要的一个环节,JModelMVC中的数据视图层,我们需要明白的是 JModel不同于JTable,数据视图是由一个或者几个table构成,或者多条数据记录构成的数据集合,以及数据集合的相关操作,对于JModel 我们不必了解太多的具体函数,在组件开发过程中,通常都要继承JModel,在子类中完成数据集合的生成以及相关的操作,保存,删除。

我个人倾向对于几个表之间的数据完整性,要在JModel中验证,而对于单一表的数据完整性要通过JTable check函数完成。

同事对于那些有逻辑操作的验证则最好在MVC的 controller层完成。


Joomla源代码解析(18)Jview 

MVC模式中,重要的一环,JView 和 tmpl目录中的模板,共同决定了,页面html的代码,Jview是在Jmodeltemplate之间的桥梁。我们扩展做自己的组件,都需要扩展Jview的子类。这个类其实需要看看它的变量和函数也就理解:

跟数据相关的部分: 

_defaultModel  默认的model ,可以通过 setModel 进行设置。同时function &get 可以从指定的model调用函数返回相应的数据

_models 存贮model的数组,getModel,可以从中返回指定的Model

assign assignref,数据赋值函数,这两个函数的任务是赋值变量给模板。

跟模板相关部分:

loadTemplatesetLayoutsetLayoutExt 看名字就知道了

还有一个函数:display  ,大部分的view子类都要继承这个。


Joomla源代码解析(19)JController

同样 JController MVC中重要的起点,正式这个类决定的动作的下一步流向,我们来看看表格提交数据的典型的controller的代码:

function edit()
{
  JRequest::setVar( 'view', 'hello' );
  JRequest::setVar( 'layout', 'form'  );
  JRequest::setVar('hidemainmenu', 1);

  parent::display();
}


function save()
{
  $model $this->getModel('hello');

  if ($model->store($post)) {
   $msg JText::_( 'Greeting Saved!' );
  else {
   $msg JText::_( 'Error Saving Greeting' );
  }

  // Check the table in so it can be edited.... we are done with it anyway
  $link 'index.php?option=com_hello';
  $this->setRedirect($link, $msg);
}


function remove()
{
  $model $this->getModel('hello');
  if(!$model->delete()) {
   $msg JText::_( 'Error: One or More Greetings Could not be Deleted' );
  else {
   $msg JText::_( 'Greeting(s) Deleted' );
  }

  $this->setRedirect( 'index.php?option=com_hello', $msg );
}


function cancel()
{
  $msg JText::_( 'Operation Cancelled' );
  $this->setRedirect( 'index.php?option=com_hello', $msg );
}

实际上 controller 跟提交的task参数,调用controller中的不同的函数,当然默认会调用display ,我觉得还需要记住的就是

getModel ,和setRedirect ,其余函数用到再看就可以了。



Joomla源代码解析(20)MVC组件的执行

以前的文章中,我们曾经说过 $mainframework->dispatch 是如何最终调用组件的,通过这个dispatch,最终 include 相应组件目录下的 组件名称.php 文件,现在我们来看看,这个文件是怎么按部就班的联系了MVC模式相关的各个文件。

require_once (JPATH_COMPONENT.DS.'controller.php');

// Require specific controller if requested
if($controller JRequest::getVar('controller')) {
require_once (JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php');
}

// Create the controller
$classname 'HelloController'.$controller;
$controller new $classname( );

// Perform the Request task
$controller->execute( JRequest::getVar('task'));

// Redirect if set by the controller
$controller->redirect();

其实就是根据request提交的controller参数,创建相应的JController对象,然后由controoler对象执行相应的任务。

这样我们就完全理解了,一个组件是如何被调用,MVC组件是如何执行,并最后返回html代码的。


Joomla源代码解析(21):模块是如何被调用执行并渲染?

以前的文章中,关于/index.php我们已经分析完了 $mainframe->dispatch()是引入了组件,并被执行。我们知道对于Joomla,一个页面只能有一个或者0个组件,而上,下左右的碎片都是modulemodule是页面丰富的有效补充。比如我们知道菜单是  mod_mainmenu,footermod_footer等等,那么这些module是怎么被引入的,并最后执行的?

秘密都在$mainframe->render()这个函数上,我们看看这个函数都做了什么工作。

以下是JSite render 函数的内容

  $document =& JFactory::getDocument();
  $user     =& JFactory::getUser();

  // get the format to render
  $format $document->getType();

  switch($format)
  {
   case 'feed' :
   {
    $params array();
   break;

   case 'html' :
   default     :
   {
    $template $this->getTemplate();
    $file   JRequest::getCmd('tmpl', 'index');

    if ($this->getCfg('offline') && $user->get('gid') '23' {
     $file 'offline';
    }
    if (!is_dir( JPATH_THEMES.DS.$template && !$this->getCfg('offline')) {
     $file 'component';
    }
    $params array(
     'template'  => $template,
     'file'  => $file.'.php',
     'directory' => JPATH_THEMES
    );
   break;
   }

  $data $document->render( $this->getCfg('caching'), $params);
  JResponse::setBody($data);

其实重要的部分是引入了相应的模板文件(templateindex.php),并调用了 JDocumentHtml的 render 函数。

看到这里,我们终于明白了,模板的index.php原来是这个时候被引入的。

我们再看看 JDocumentHtml render函数。

这个函数中最重要的两句程序是

  $data $this->_loadTemplate($directory.DS.$template, $file); 载入模板文件
  $data $this->_parseTemplate($data); 解析模板

再继续看看解析模板是什么过程:

  $replace array();
  $matches array();
  if(preg_match_all('##iU', $data, $matches))
  {
   $matches[0] array_reverse($matches[0]);
   $matches[1] array_reverse($matches[1]);
   $matches[2] array_reverse($matches[2]);

   $count count($matches[1]);

   for($i 0; $i $count; $i++)
   {
    $attribs JUtility::parseAttributes( $matches[2][$i] );
    $type  $matches[1][$i];

    $name  isset($attribs['name']) $attribs['name'] null;
    $replace[$i] $this->getBuffer($type, $name, $attribs);
   }

   $data str_replace($matches[0], $replace, $data);
  }

  return $data;
}

对了,就是这部分,对模板中 JDOC标签进行了解析,获得了相应的module名称和参数,并调用getBuffer函数执行。

至此 调用 $renderer->render($name, $attribs, $result); 



Joomla源代码解析(22):模块是如何被调用执行并渲染

上一文章中提到了getBuffer函数,在函数中实际上调用了render ,这个对象是JDocumentRendererModule 类的实例,我们看看JDocumentRendererModule render函数。

  if (!is_object($module))
  {
   $module =& JModuleHelper::getModule($module);

   if (!is_object($module))
   {
    if (is_null($content)) {
     return '';
    else {
     
     $tmp $module;
     $module new stdClass();
     $module->params null;
     $module->module $tmp;
     $module->id 0;
     $module->user 0;
    }
   }
  }

  // get the user and configuration object
  $user =& JFactory::getUser();
  $conf =& JFactory::getConfig();

  // set the module content
  if (!is_null($content)) {
   $module->content $content;
  }

  //get module parameters
  $mod_params new JParameter( $module->params );

  $contents '';
  if ($mod_params->get('cache', 0) && $conf->getValue( 'config.caching' ))
  {
   $cache =& JFactory::getCache( $module->module );

   $cache->setLifeTime( $mod_params->get( 'cache_time', $conf->getValue( 'config.cachetime' 60 );
   $cache->setCacheValidation(true);

   $contents  $cache->get( array('JModuleHelper', 'renderModule'), array( $module, $params ), $module->id. $user->get('aid', 0) );
  else {
   $contents JModuleHelper::renderModule($module, $params);
  }

这段代码完成了找到对应的module ,和helper文件,兑取参数,并最后由'JModuleHelper'执行,并渲染。

至此,我们也完全了解了模板是如何被调用,模块是如何并调用并渲染的。



joomla源代码探析(23):完结篇 

到此为止,我们基本上了解了Joomla重要的类以及整体的框架。在第三篇中我写了一个万源之源,在完结之篇中,一直想不到用那个词合适,不过我想还是应该说一句什么。

还是:支持开源,支持Joomla

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多