phpbb源码分析-模板引擎(2)
更新时间:2023-05-29 14:31:01 阅读量: 实用文档 文档下载
- 安装Phpbb推荐度:
- 相关推荐
phpbb,源码分析 模板引擎,工具书
这篇文章继续phpbb3的模板代码分析,我将在这篇文章里面详细分析template.php的template类中的几个重要的函数。这些函数实现了phpbb3的模板引擎的核心功能。下面将会讲解三个template类中的函数:set_filenames,destroy,destroy_block_vars
set_filenames
这个函数,在phpbb3的其他地方有这个函数的使用,我这里举个简单的例子:
在viewforum.php的文件中有下面这行代码
$template->set_filenames(array(
'body' => 'viewforum_body.html')
);
下面我们来仔细的瞄一下这个函数到底做了什么。
/**
* Sets the template filenames for handles.
$filename_array
* should be a hash of handle => filename pairs.
* @access public
*/
function set_filenames($filename_array)
{
if (!is_array($filename_array))
{
return false;
}
foreach ($filename_array as $handle =>
$filename)
{
if (empty($filename))
{
trigger_error("template-
>set_filenames: Empty filename specified for $handle", E_USER_ERROR);
}
$this->filename[$handle] = $filename;
$this->files[$handle] = $this->root .
'/' . $filename;
if ($this->inherit_root)
{
phpbb,源码分析 模板引擎,工具书
$this->files_inherit[$handle] =
$this->inherit_root . '/' . $filename;
}
}
return true;
}
上面就是这个函数的所有代码,可以看见这个函数非常的简单,主要做的就是将参数中的数组存入$this->filename和$this->files中,可以看到这两个的区别只是,filename存的单单是文件名,files存的是文件的路径加文件名。而filename和files的作用将会在讲解functions_template.php的时候讲解到。当然这里我还是没有看出来inherit_root的作用,代码中的逻辑是如果设置了inherit_root,那么就将文件也存在files_inherit中。我在想,这个数组的作用也可能在functions_template.php中可以看到。destroy
我们可以看一下destroy的函数,代码很简单,如下
/**
* Destroy template data set
* @access public
*/
function destroy()
{
$this->_tpldata = array('.' => array(0 =>
array()));
}
它做的只是$_tpldata的清空,之前有说到过,$_tpldata中存的都是模板的数据,而将$_tpldata的清空意味着模板的销毁。这个函数我们就这样简单的过了,在已经查看的代码中phpbb3的开发人员很聪明。
我还没有找到有哪个地方调用了这个函数,以后找到的话补充上来。
destroy_block_vars
同理,顾名思义,这个函数是用来销毁$_tpldata中的块结构数据的,所谓的块结构数据大致有对象,数组等。
/**
* Reset/empty complete block
* @access public
*/
function destroy_block_vars($blockname)
{
if (strpos($blockname, '.') !== false)
{
// Nested block.
phpbb,源码分析 模板引擎,工具书
$blocks = explode('.', $blockname);
$blockcount = sizeof($blocks) - 1;
$str = &$this->_tpldata;
for ($i = 0; $i < $blockcount; $i++)
{
$str = &$str[$blocks[$i]];
$str = &$str[sizeof($str) - 1];
}
unset($str[$blocks[$blockcount]]);
}
else
{
// Top-level block.
unset($this->_tpldata[$blockname]);
}
return true;
}
我们可以看到一个简单的逻辑,首先根据这个函数,可以看到在phpbb3的模板中有两种形式的块数据名字定义,它们是:
blockvar blockvar.subvar.subsubvar
可以看到在上面的两种形式的blockvar形式,中间有”.”的有嵌套的blockvar形式,而前面一种只是简单的单层的块数据。下面是我从phpbb3.0.5的代码中找到的例子,请看
在faq_body.html中有下面这段模板代码,可以看到这是一个双重的循环。
<!-- BEGIN faq_block -->
<!-- IF faq_block.S_ROW_COUNT == 4 -->
</div>
<div class="column2">
<!-- ENDIF -->
<dl class="faq">
<dt><strong>{faq_block.BLOCK_TITLE}</strong></dt>
<!-- BEGIN faq_row -->
phpbb,源码分析 模板引擎,工具书
<dd><a
href="#f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}">{faq_block.faq_row.FAQ_QUESTION}</a></dd>
<!-- END faq_row -->
</dl>
<!-- END faq_block -->
我们再来看php代码中是如何实现赋值到模板的,请看下面的代码
// Pull the array data from the lang pack
$help_blocks = array();
foreach ($user->help as $help_ary)
{
if ($help_ary[0] == '--')
{
$template->assign_block_vars('faq_block',
array(
'BLOCK_TITLE'=>
$help_ary[1])
);
continue;
}
$template->assign_block_vars('faq_block.faq_row', array(
'FAQ_QUESTION'=> $help_ary[0],
'FAQ_ANSWER'=> $help_ary[1])
);
}
可以看到对’faq_block.faq_row’的block赋值和对’faq_block’,前者赋值后的模板代码就会有两层嵌套的循环,而前面只有一层。所以{faq_block.BLOCK_TITLE}是在第一层循环里面,第二层循环里面存取的是’FAQ_QUESTION’和’FAQ_ANSWER’的值。需要用{faq_block.faq_row.FAQ_QUESTION}的形式将其取出。通过以上一个简单的例子的讲解,其实我相信应该已经很明了了讲明了phpbb3模板引擎中一个很重要的功能,就是数组(嵌套数组)的赋值功能。代码中也示例如何使用assign_block_vars赋值的数组值。
再回到destroy_block_vars函数,首先函数先判断传入参数(需要被销毁的block变量名字)是否含有”.”,如果没有”.”那么意味着只要简单的去掉$this->_tpldata[$blockname]就够了。如果找到了”.”,那么需要麻烦一点,需要递归销毁。phpbb3是用下面的代码实现的
// Nested block.
$blocks = explode('.', $blockname);
$blockcount = sizeof($blocks) - 1;
phpbb,源码分析 模板引擎,工具书
$str = &$this->_tpldata;
for ($i = 0; $i < $blockcount; $i++){
$str = &$str[$blocks[$i]];
$str = &$str[sizeof($str) - 1];}
unset($str[$blocks[$blockcount]]);
很简单的代码,主要是用了几个引用。
这篇暂时到这里,下一篇继续分析phpbb3的模板引擎代码:)
正在阅读:
phpbb源码分析-模板引擎(2)05-29
加强师德师风建设11-02
第5章 电阻应变式传感器03-28
抽象类和接口习题11-24
计量经济学课程论文05-25
2009年最新学校德育工作总结08-23
《计算机软件技术基础(1)》在线作业一09-21
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 源码
- 模板
- 引擎
- 分析
- phpbb
- 议论文说明文知识
- 使用PowerDesigner12.5设计数据库并生成MySQL脚本文件
- 寒假致家长的一封信
- 经济法的社会本位价值取向
- 犊牛“幼畜超数排卵技术”研发成功
- 国外的养老模式和经典案例
- 心境有多静,思考就会有多深
- 公路高架桥临时用电施工组织设计
- 供应商品质管理(SQM)实战训练
- 原告孙XX诉被告广西南宁XX物业服务有限责任公司(以下简称XX物业)
- 点面结合,绘就壮丽 “场景”——五年级上册习作八《场景描写》习作指导教学设计
- 一张越南盾能买什么?
- 新疆吐鲁番地区七年级下学期数学期末试卷
- 化学:第一单元《化学改变了世界》复习教案(1)(鲁教版九年级)
- 含酚废水处理技术的进展及技术简述
- 苏教版完整版小学五年级数学下册应用题大全280题及答案
- 中学生物教师2021年述职报告范文
- 上海二年级语文下册称象练习
- 学习任务9 (辅导)配色基础
- 广东2013下半年会计从业资格《会计基础》全真模拟卷一