以前的文章中,关于/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);
秘密都在$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);
发表评论
-
joomla 模块modules开发教程
2010-05-12 14:16 2800模块是页面扩展轻量级方式,相对组件更为灵活。模块通常用来做页面 ... -
joomla 1.5——JDocument类用法
2010-04-22 14:46 1391文档类,提供一个容易 ... -
[翻译] Joomla XML 解析器规范 上
2010-04-22 14:45 1079概述 Joomla! 1.5 新增 JSimpleXML 类 ... -
Joomla插件开发规范
2010-04-22 14:44 1407概述:JPlugin Joomla 1.5的新功能 为了更好 ... -
joomla源代码探析续(三十一) JHTML 类常用的方法
2010-04-22 14:37 1740我曾经在几篇文章中涉及到JHTML的方法使用,这里不再说了,请 ... -
joomla源代码探析续(三十) JDate类参考
2010-04-22 14:36 1082JDate类与JString类一样是Joomla!中的基础类, ... -
joomla源代码探析续(二十九) JHTML 与JHTMLSelect 类的使用
2010-04-22 14:33 1207我们在form表单生成的过程中,经常需要有select 标签或 ... -
joomla源代码探析续(二十八) 如何扩展JTable类
2010-04-22 14:30 1063JTable类是Active Record设计模式(web应用 ... -
joomla源代码探析续(二十七)组件后台如何设置参数
2010-04-22 14:29 927以下的方法可以在管理后台中添加一个Parameters设置的按 ... -
joomla源代码探析续(二十六)JUser对象和用户权限判断
2010-04-22 14:23 1862每一个访问Joomla网站的用户都对应这一个JUser对象,通 ... -
joomla源代码探析续(二十五)JRequest对象的变量获取过程
2010-04-22 14:22 1184Joomla 1.5 RC3版本的SEF存在不少问题,前段时间 ... -
joomla源代码探析续(二十四)JPagination类
2010-04-22 14:22 1127JPagination类是Joomla的通用分页功能的封装类, ... -
Joomla源代码解析(二十二) 模块是如何被调用执行并渲染(下)
2010-04-22 14:16 952上一文章中提到了getBuffer函数,在函数中实际上调用了r ... -
Joomla源代码解析(二十) MVC组件的执行
2010-04-22 14:10 927以前的文章中,我们曾经说过 $mainframework-&g ... -
Joomla源代码解析(十九) JController
2010-04-22 14:05 893同样 JController 是MVC中重要的起点,正式这个类 ... -
Joomla源代码解析(十八) Jview
2010-04-22 14:03 973MVC模式中,重要的一环,JView 和 tmpl目录中的模板 ... -
Joomla源代码解析(十六) JTable是什么 不指定
2010-04-22 14:01 1460JTable是什么? JTable是数据库中数据表在程序中的表 ... -
Joomla源代码解析(十五) 组件是如何被调用并渲染的
2010-04-22 14:00 1444Joomla代码中, 组件是如 ... -
Joomla源代码解析(十四) JRequest类 不指定
2010-04-22 13:58 864这是另一个Joomla扩展中最常用的类,这个类封装了客户端提交 ... -
Joomla源代码解析(十三) JText类
2010-04-22 11:25 1224Joomla 最常用的类之一,使用方式JTEXT::_('JJ ...
相关推荐
RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议,允许一个程序在某处执行,通过网络调用另一台计算机上的程序,就像它是一个本地函数一样。这种技术在分布式系统和微服务架构中广泛使用,简化了不同...
例如,在分布式渲染系统中,多线程TCP模块可以用于传输图像数据和渲染指令,确保高效、稳定地完成远程协作任务。此外,游戏服务器也可能利用多线程TCP模块处理玩家的网络交互,保持游戏的实时性和公平性。 总结一下...
在"aecc渲染脚本.bat"这个文件中,我们很可能是找到了一个批处理脚本,它可能用于调用After Effects并执行预设的渲染任务。批处理脚本通常包含命令行指令,通过运行这些指令,用户可以在后台启动AE并执行脚本,无需...
`QAbstractVideoSurface`接口也可能被用于自定义视频渲染方式,但在这个入门示例中,通常不会涉及。 在编写代码时,需要注意以下几点: - **信号和槽机制**:Qt的事件驱动模型是通过信号和槽来实现的。例如,可以...
8. **游戏开发模块**:包含游戏引擎、图形渲染等,帮助开发者构建游戏环境。 9. **人工智能与机器学习模块**:随着AI技术的发展,易语言也引入了相关模块,支持机器学习算法的实现。 10. **脚本和自动化模块**:...
场景渲染器FSceneRenderer的构造函数中,会复制视口家族的属性到自己的结构中,并通过RHI命令列表执行渲染。 关于渲染的具体步骤,文档中描述了场景渲染的几个关键步骤,包括primitive(图元)可见性判断、光源可见...
本文详细介绍了Python如何实现异步调用函数执行,并通过具体的示例代码展示了两种常见方法:使用`threading`模块和`asyncio`库。通过理解同步与异步的区别,以及如何在Python中实现异步调用,可以帮助开发者在实际...
不过,要在Electron的不同进程(主进程和渲染进程)中正确地调用本地模块,需要特别注意加载模块的方式和模块的路径问题。 首先,Electron中加载页面主要有两种方式:一种是直接加载本地文件(本地路径),另一种是...
3. **执行批处理**:当监听到指定事件时,使用`child_process`模块(如果使用Node.js环境)或者`WScript`对象(在纯JavaScript中)来调用批处理文件。在批处理文件中,你可以编写启动exe程序的命令,如`start ...
在Windows应用程序开发中,WebBrowser控件是一个常用的组件,它允许开发者在桌面应用中嵌入一个基于Internet Explorer渲染引擎的浏览器。本主题将深入探讨如何实现`WebBrowser`中的JavaScript (JS) 和C++代码之间的...
Spring框架是Java开发中最常用的...在阅读源码时,建议结合方法调用流程图,以便于追踪代码执行路径,理解各组件间的协作。同时,实践是检验理论的最好方式,通过编写实际项目来应用所学知识,将有助于巩固和深化理解。
这些模块涵盖了多种功能,包括图形渲染、系统接口调用、本地化处理、数据库操作、表达式计算以及汉字笔画查询等。下面将对每个模块进行详细介绍: 1. **易语言OGRE类模块使用指南V1.0**:这是一个基于OGRE(Object-...
如果不先加载模块而直接调用form.render,会发现没有效果,因为模块中定义的方法还没有被加载执行。 代码示例中展示了如何在添加完form元素之后,使用JavaScript调用layui的form.render方法来实现对select等表单...
实现QT和JavaScript的互调,主要依赖于QT的QWebEngine模块,它提供了对Web内容的渲染和交互能力。首先,你需要在QT项目中包含QWebEngine视图组件(QWebEngineView),这将显示加载的网页。 1. **QT调用JavaScript...
通过导入和调用这些模块,程序员可以大大提高开发效率,减少错误,并使代码更加规范。 1. **数据处理模块**:包含各种数学计算、字符串操作、日期时间处理等功能,帮助开发者轻松进行数据的分析和处理。 2. **网络...
5. **数据库模块**:连接数据库,执行SQL语句,进行数据的增删改查操作。 6. **加密解密模块**:用于数据安全,实现加密算法,如MD5、SHA等。 7. **多媒体模块**:处理音频、视频、图像等多媒体文件。 8. **数学...
2. **异步调用**:在Win32线程中调用Qt界面函数,但不直接执行Qt的事件循环。而是通过信号槽机制或其他异步方式,让Qt线程处理UI更新。 3. **使用QWinWidget**:如果可能,可以在Win32窗口类中嵌入一个`QWinWidget`...
- **编写控制器文件**:处理用户的请求,调用模型中的方法并渲染视图。 - **编写视图文件**:设计前端展示样式,可以使用HTML、CSS和JavaScript。 - **测试运行**:在phpcms2008后台安装新模块,进行功能测试。 ...
模块在易语言中扮演着重要的角色,它们是可复用的代码单元,封装了特定的功能或算法,使得开发者能够通过调用模块快速实现复杂的功能,而无需从零开始编写代码。模块的广泛使用可以极大地提高开发效率,降低程序的...
总结来说,`setState`的执行流程涉及到React框架内部的多个模块协同工作,包括事件监听、更新调度和批量处理,以确保高效且准确地更新组件状态并触发重渲染。理解这一流程对于优化React应用的性能和避免潜在的问题至...