phpbb源码分析-模板引擎(2)

更新时间:2023-05-29 14:31:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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的模板引擎代码:)

本文来源:https://www.bwwdw.com/article/6sg4.html

Top