PHPCMS 2008中tag内容标签的解析过程

我们按照系统解析的过程来走一遍。。。
在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);
这里其实调用那个函数了,调用那个函数,就是直接将数据输出出来,从而完成数据的显示。有人会问,那个函数不在这个文件啊,怎么调用啊?其实在template_compile函数里面生成的那个函数函数文件确实是不在这个文件中,但是别忘了,在tag函数中是用require_once template(…)的,而template函数返回的值就是那个解析后的缓存文件的路径和文件名。
那么这样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值