我们按照系统解析的过程来走一遍。。。
在phpcms中,和uchome和discuz是一样的,解析模板要调用的函数是template(),此函数位于include/global.func.php文件中,在这个函数中,先按照传进来的参数生成一个缓存的文件名如:
1.
$compiledtplfile
= TPL_CACHEPATH .
$module
.
'_'
.
$template
.
'.tpl.php'
;
然后判断该文件是否存在和是否过期了,如果不存在或者过期了那么就加载template.func.php模板解析文件调用其中的template_compile()函数。
此时这个函数的第三个参数$istag=0,这个函数经过一系列的判断之后,再调用函数template_parse()对模板进行编译,这里所谓的编译实际上就是利用正则表达式进行一些字符串的替换罢了,和uchome,discuz是一样的概念。在这里面我们主要来看一行:
1.
$str
= preg_replace (
"/\{tag_([^}]+)\}/e"
,
"get_tag('\\1')"
,
$str
);
当我们在模板中出现如:
{tag_标签内容列表}, {tag_网站首页推荐}时,就会被匹配上,然后调用函数get_tag(),这个函数的参数就是上面那个标签中的中文部分。
下面我们来看下get_tag()函数:
01.
//获取phpcms的tag数据
02.
function
get_tag(
$tagname
) {
03.
global
$TAG
;
04.
05.
if
(! isset (
$TAG
))
06.
$TAG
= cache_read (
'tag.inc.php'
, TPL_ROOT . TPL_NAME .
'/'
);
07.
08.
//实际上$TAG [$tagname]的值是一个函数(global.func.php文件中的tag()函数),调用这个值就是调用该函数
09.
return
isset (
$TAG
[
$tagname
] ) ?
'<?php echo '
.
$TAG
[
$tagname
] .
';?>'
:
'{tag_'
.
$tagname
.
'}'
;
10.
}
这个函数中调用全局变量$TAG,其实这个变量的值就是缓存tag.inc.php内部的内容。
现在来说下tag.inc.php这个文件吧。这个文件是在后台操作的时候生成的,生成这个文件的函数是在/include/admin/global.func.php中的tags_updata();先不管它。我们先来看下tag.inc.php这个文件的内容是什么样子的如:
1.
return
array
(
2.
'标签内容列表'
=>
'tag(\'phpcms\', \'tag_content\', "select * from `mu_content` a,`mu_content_tag` k where a.contentid=k.contentid and a.status=99 and k.tag=\'$tag\' order by a.contentid desc", $page, 20, array ( \'class\' => \'url\', \'target\' => \'_blank\', \'titlelen\' => \'80\',))'
,
3.
'网站首页推荐'
=>
'tag(\'phpcms\', \'tag_content\', "SELECT a.contentid,a.catid,a.typeid,a.areaid,a.title,a.style,a.thumb,a.keywords,a.description,a.userid,a.updatetime,a.inputtime,a.url FROM `mu_content` a, `mu_content_position` p WHERE a.contentid=p.contentid AND p.posid=1 AND a.status=99 ORDER BY a.contentid DESC", 0, 5, array ( \'class\' => \'url\', \'target\' => \'_blank\', \'titlelen\' => \'35\',))'
4.
)
看了这个之后,我们再来分析一下那个get_tag()函数。当条用cache_read()时,其实说白了就是将tag.inc.php文件内的这个数组赋值给$TAG变量,当使用echo $TAG [$tagname]时,其实就是调用了tag()函数。。(这里转了几个圈。。。)
调用tag函数?这下明白了,我们找到这个函数在include/global.func.php文件中
说明下:这个标签的模板$template使我们在后台定义好的,存放于$module下面的以tag_***.html命名的文件
01.
function
tag(
$module
,
$template
,
$sql
,
$page
= 0,
$number
= 10,
$setting
=
array
(),
$catid
= 0)
02.
{
03.
global
$db
,
$CATEGORY
,
$MODULE
,
$URLRULE
,
$PHPCMS
,
$MODEL
;
04.
。。。。。。这里主要是利用传来的sql进行数据库的查询,并将数据存放到
$data
变量中。。。。。。
05.
//当前模型下面对应的标签模板
06.
require_once
template(
$module
,
$template
, 1);
07.
//该函数会直接输出内容
08.
$func
=
'_tag_'
.
$module
.
'_'
.
$template
;
09.
//输出{tag_***}标签的内部数据
10.
$func
(
$data
,
$number
,
$rows
,
$count
,
$page
,
$pages
,
$setting
);
11.
}
这里我们来看下调用template函数的情况,这里的调用和之前的调用不相同,请看下,第三个参数标示这是一个标签:来看下这个函数内部的判断部分:
1.
$content
= (
$istag
||
substr
(
$template
, 0, 4 ) ==
'tag_'
) ?
'<?php function _tag_'
.
$module
.
'_'
.
$template
.
'($data, $number, $rows, $count, $page, $pages, $setting){ global $PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>'
. template_parse (
$content
, 1 ) .
'<?php } ?>'
: template_parse (
$content
);
2.
//只负责将编译好的php文件写进相应的缓存文件中
3.
$strlen
=
file_put_contents
(
$compiledtplfile
,
$content
);
这里其实会生成一个函数,函数的名字是这样子的“_tag_’ . $module . ‘_’ . $template”。这个函数的名我们等下会用到的。函数体的内容是调用指定模板经过编译之后的代码。之后调用系统函数file_put_contents 将这个函数写进缓存文件中,缓存文件就是一般的哪种命名规则。该文件在data/cache_template/下面。这样子template()函数的任务完成了。我们回到之前的tag函数中。看到这么一行
1.
$func
=
'_tag_'
.
$module
.
'_'
.
$template
;这一步就是生成我们刚刚在template_compile函数里面讲过的那个函数
下面我们来看下这行代码:
1.
$func
(
$data
,
$number
,
$rows
,
$count
,
$page
,
$pages
,
$setting
);
那么这样