`
we1818
  • 浏览: 60144 次
  • 性别: Icon_minigender_1
  • 来自: 湖州
社区版块
存档分类
最新评论

模块是如何被调用执行并渲染?

    博客分类:
  • php
阅读更多
以前的文章中,关于/index.php我们已经分析完了 $mainframe->dispatch()是引入了组件,并被执行。我们知道对于Joomla,一个页面只能有一个或者0个组件,而上,下左右的碎片都是module,module是页面丰富的有效补充。比如我们知道菜单是  mod_mainmenu,而footer是mod_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);

其实重要的部分是引入了相应的模板文件(template/***/index.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);
分享到:
评论

相关推荐

    e语言-奇易浏览框模块2.0

    增加绑定事件_Alert被调用 4.增加绑定事件_Confirm被调用 5.增加绑定事件_Prompt被调用 1.7(2018-6-2 21:40:35) 1.填表_判断元素是否存在,增加循环次数 2.脱离node.dll浏览器内核,请...

    MagicTools引擎(d3d与opengles渲染器,集成cocos2d)

    比如没渲染一次场景都得做一次renderable排序加一次八叉树遍历,一帧里的多次渲染按理这些流程应该有所优化,但ogre为了保证接口稳定性放弃了灵活性,因为它必选保证每次渲染的完成执行流程。所以想到自己做一个引擎...

    微信小程序原理 - 简书.pdf

    3.激活状态:收到界面线程发送来的“首次渲染完成”信号后,就进入激活状态既程序的正常运行状态,并调用自定义的onReady()函数。 此状态下就可以通过 this.setData 函数发送界面数据给界面线程进行局部渲染,更新...

    易语言-奇易浏览框模块2.0

    3.增加绑定事件_Alert被调用 4.增加绑定事件_Confirm被调用 5.增加绑定事件_Prompt被调用 1.7(2018-6-2 21:40:35) 1.填表_判断元素是否存在,增加循环次数 2.脱离node.dll浏览器内核,请自行选择下载 1.6(2018-...

    ember-cli-optimize

    可替代地,模块可以被“预解析”,其效率更高得多,不幸的是,如果该模块被“预解析”,然后立即被调用,则其也将被完全解析,从而实质上是重复的工作。 懒惰和渴望模块的示例: 惰性模块是初始引导通常不需要的...

    charmd:用于终端的简单,可扩展的markdown渲染器

    :top_hat: 字符 一个简单的,可扩展的markdown渲染器,用于您的终端。...只需导入模块并使用markdown文本调用renderMarkdown方法即可。 import { renderMarkdown } from 'https://deno.land/x/charmd/mod.ts'

    npm_module:粘合剂实施为NPM模块

    该模块旨在用作服务器端渲染应用程序的一部分。 它获取针对所消费内容计划的广告,并将其用作Freewheel Ad Server或Google ad Manager的自定义参数。 使用此模块需要一个有效的Adhese帐户。 安装 在NextJS项目的根...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...

    mithril-hydrate:水合物预渲染的秘银应用

    该模块导出2个函数dessicate & hydrate ,它们代理Mithril m.render : dessicate(dom, vnodes)用于在服务器上对其内容执行Mithril调用图,不包括oncreate步骤,并返回渲染HTML; 该环境需要一个DOM模拟(如 ),...

    Spring面试题

    在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。 清单 2. ...

    FLEX企业应用开发实战.part1

     1.4.1 Flash Player的帧执行模型  1.4.2 Flash Player渲染模型  1.4.3 Flash中的事件机制  1.5 小结 第2章 Flex企业应用开发基础  2.1 MXML语言  2.1.1 用MXML表示ActionScript对象  2.1.2 查看由...

    FLEX企业应用开发实战.part2

     1.4.1 Flash Player的帧执行模型  1.4.2 Flash Player渲染模型  1.4.3 Flash中的事件机制  1.5 小结 第2章 Flex企业应用开发基础  2.1 MXML语言  2.1.1 用MXML表示ActionScript对象  2.1.2 查看由...

    mediawiki-services-change-propagation:Github的“ mediawikiserviceschange-propagation”镜像-我们的实际代码由Gerrit托管(请参见https

    通过使用内部HTTP端点创建新模块并从规则中调用它们,可以轻松扩展受支持操作的列表。特征基于配置的消息处理规则。 有关规则配置的更多信息,请参见[配置](## Rule配置)部分。 自动限量重试全局规则执行并发限制...

    BlenderProc:用于真实感训练图像生成的程序化Blender管道

    通常,一条管线的运行首先加载或构建3D场景,然后在该场景内设置一些相机位置,并为每个图像渲染不同类型的图像(rgb,距离,法线等)。 混合器管道由不同的模块组成,其中每个模块在描述的过程中执行一个步骤。 ...

    如何把matlab代码封装-python-iniciante-inflamacao::Brazil:努力将Python新手课程翻译成葡萄牙语

    本课教新手程序员编写模块化代码,以便使用Python进行数据分析。 但是,重点是讲授与语言无关的编程原理,例如带循环的自动化和带功能的封装,请参阅并了解更多信息。 本课中使用的示例使用从关节炎的一种新疗法的...

    基于python web开发的简易订单系统+源代码+文档说明

    该系统前端采用了RestAPI的设计,使用jQuery异步调取后端WEB接口的形式获取json的数据并渲染展示。 后端框架采用了base(基础类库层)、bean(后台逻辑层)、dao(数据持久层)、web(view展示层)的四层结构,代码...

    vue-source-code-analysis

    runtime-with-compiler.js重新封装$ mount(作用:将模板编绎成render)内部判断并获取模板将其转换成渲染函数其中compileToFunctions方法调用了parse方法再调用parseHTML解析html生成AST树再执行封装前的mount函数...

    vc++ 应用源码包_1

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_2

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

    vc++ 应用源码包_6

    使用了六个类五个模块类演示了atl的调用方法 autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一...

Global site tag (gtag.js) - Google Analytics