`
we1818
  • 浏览: 61867 次
  • 性别: 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);
分享到:
评论

相关推荐

    rpc远程调用使用说明&源码

    RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议,允许一个程序在某处执行,通过网络调用另一台计算机上的程序,就像它是一个本地函数一样。这种技术在分布式系统和微服务架构中广泛使用,简化了不同...

    多线程TCP模块 接口少,调用方便,实用性强

    例如,在分布式渲染系统中,多线程TCP模块可以用于传输图像数据和渲染指令,确保高效、稳定地完成远程协作任务。此外,游戏服务器也可能利用多线程TCP模块处理玩家的网络交互,保持游戏的实时性和公平性。 总结一下...

    aecc渲染脚本

    在"aecc渲染脚本.bat"这个文件中,我们很可能是找到了一个批处理脚本,它可能用于调用After Effects并执行预设的渲染任务。批处理脚本通常包含命令行指令,通过运行这些指令,用户可以在后台启动AE并执行脚本,无需...

    qt视频播放器(调用多媒体模块)

    `QAbstractVideoSurface`接口也可能被用于自定义视频渲染方式,但在这个入门示例中,通常不会涉及。 在编写代码时,需要注意以下几点: - **信号和槽机制**:Qt的事件驱动模型是通过信号和槽来实现的。例如,可以...

    易语言模块1000个-易语言资源大全

    8. **游戏开发模块**:包含游戏引擎、图形渲染等,帮助开发者构建游戏环境。 9. **人工智能与机器学习模块**:随着AI技术的发展,易语言也引入了相关模块,支持机器学习算法的实现。 10. **脚本和自动化模块**:...

    房燕良-虚幻4渲染系统架构解析

    场景渲染器FSceneRenderer的构造函数中,会复制视口家族的属性到自己的结构中,并通过RHI命令列表执行渲染。 关于渲染的具体步骤,文档中描述了场景渲染的几个关键步骤,包括primitive(图元)可见性判断、光源可见...

    python如何实现异步调用函数执行

    本文详细介绍了Python如何实现异步调用函数执行,并通过具体的示例代码展示了两种常见方法:使用`threading`模块和`asyncio`库。通过理解同步与异步的区别,以及如何在Python中实现异步调用,可以帮助开发者在实际...

    Electron 如何调用本地模块的方法

    不过,要在Electron的不同进程(主进程和渲染进程)中正确地调用本地模块,需要特别注意加载模块的方式和模块的路径问题。 首先,Electron中加载页面主要有两种方式:一种是直接加载本地文件(本地路径),另一种是...

    谷歌内核-调用本地程序 亲测可用

    3. **执行批处理**:当监听到指定事件时,使用`child_process`模块(如果使用Node.js环境)或者`WScript`对象(在纯JavaScript中)来调用批处理文件。在批处理文件中,你可以编写启动exe程序的命令,如`start ...

    WebBrowser中JS和C++代码互相调用

    在Windows应用程序开发中,WebBrowser控件是一个常用的组件,它允许开发者在桌面应用中嵌入一个基于Internet Explorer渲染引擎的浏览器。本主题将深入探讨如何实现`WebBrowser`中的JavaScript (JS) 和C++代码之间的...

    Spring源码文档和方法调用流程图

    Spring框架是Java开发中最常用的...在阅读源码时,建议结合方法调用流程图,以便于追踪代码执行路径,理解各组件间的协作。同时,实践是检验理论的最好方式,通过编写实际项目来应用所学知识,将有助于巩固和深化理解。

    易语言常用模块大全.rar

    这些模块涵盖了多种功能,包括图形渲染、系统接口调用、本地化处理、数据库操作、表达式计算以及汉字笔画查询等。下面将对每个模块进行详细介绍: 1. **易语言OGRE类模块使用指南V1.0**:这是一个基于OGRE(Object-...

    解决使用layui的时候form表单中的select等不能渲染的问题

    如果不先加载模块而直接调用form.render,会发现没有效果,因为模块中定义的方法还没有被加载执行。 代码示例中展示了如何在添加完form元素之后,使用JavaScript调用layui的form.render方法来实现对select等表单...

    QT和网页中的JavaScript函数进行相互调用的实现

    实现QT和JavaScript的互调,主要依赖于QT的QWebEngine模块,它提供了对Web内容的渲染和交互能力。首先,你需要在QT项目中包含QWebEngine视图组件(QWebEngineView),这将显示加载的网页。 1. **QT调用JavaScript...

    易语言1000多个超级模块

    通过导入和调用这些模块,程序员可以大大提高开发效率,减少错误,并使代码更加规范。 1. **数据处理模块**:包含各种数学计算、字符串操作、日期时间处理等功能,帮助开发者轻松进行数据的分析和处理。 2. **网络...

    易语言模块全集++易语言模块全集

    5. **数据库模块**:连接数据库,执行SQL语句,进行数据的增删改查操作。 6. **加密解密模块**:用于数据安全,实现加密算法,如MD5、SHA等。 7. **多媒体模块**:处理音频、视频、图像等多媒体文件。 8. **数学...

    win32 调用 含qt界面的DLL.win32程序

    2. **异步调用**:在Win32线程中调用Qt界面函数,但不直接执行Qt的事件循环。而是通过信号槽机制或其他异步方式,让Qt线程处理UI更新。 3. **使用QWinWidget**:如果可能,可以在Win32窗口类中嵌入一个`QWinWidget`...

    phpcms2008模块制作教程

    - **编写控制器文件**:处理用户的请求,调用模型中的方法并渲染视图。 - **编写视图文件**:设计前端展示样式,可以使用HTML、CSS和JavaScript。 - **测试运行**:在phpcms2008后台安装新模块,进行功能测试。 ...

    易语言老前辈839个模块

    模块在易语言中扮演着重要的角色,它们是可复用的代码单元,封装了特定的功能或算法,使得开发者能够通过调用模块快速实现复杂的功能,而无需从零开始编写代码。模块的广泛使用可以极大地提高开发效率,降低程序的...

    setState执行流程1

    总结来说,`setState`的执行流程涉及到React框架内部的多个模块协同工作,包括事件监听、更新调度和批量处理,以确保高效且准确地更新组件状态并触发重渲染。理解这一流程对于优化React应用的性能和避免潜在的问题至...

Global site tag (gtag.js) - Google Analytics