igaofen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

     做过phpcms开发人的一定知道,phpcms提供了大量内置的变量供我们在模版中调用,比如{$position} {$title}分别代表当前的位置与文章的标题。在方便使用的同时,我们不禁要问,为什么我们可以使用这些变量?在什么情况下,这些变量才有意义?

      其实,我们可以将这几个问题归结为phpcms中html文件的生成过程。一切都是从admin.php开始的,我们在后台进行不同的操作(如生成文件,图片等)将会导致admin.php包含(include)不同的文件。而被包含者又会根据传给它参数的不同而包含不同的文件,这样一路包含下去,直到调用到我们的模版。这一路上所经过的文件和admin.php本身组成了最终的admin.php。而我们可以调用的变量就是在这些文件中出现过的变量,这也是我们判断变量是否可用的标准。这不难理解,因为我们的模版文件最终也被包含在了admin.php中,而它调用的变量或许原先不在admin.php中,但此刻却也被包含了进来。

      下面以模版中自定义标签如何被翻译来解释上面的内容。这个标签实现了"上一篇下一篇"的功能,标签名为{tag_上一篇下一篇}。点击生成文章后的链接为:http://127.0.0.1/phpcms2007_sp6_gbk/phpcms/admin.php?mod=article&file=createhtml&action=create_show&channelid=1&referer=****标签代码如下: 

 

 1 <?php
 2 defined('IN_PHPCMS') or exit('Access Denied'); 
 3 ?>
 4 <?php
 5 global $articleid,$db;
 6 $sqlpre="SELECT * FROM phpcms_article_1 where articleid<'$articleid' order by articleid desc";
 7 $sqlaft="SELECT * FROM phpcms_article_1 where articleid>'$articleid' order by articleid asc";
 8 $preart=$db->get_one($sqlpre);
 9 $afart=$db->get_one($sqlaft);
10 if(!$preart['title'])
11  $preart=$db->get_one("select * from phpcms_article_1 order by articleid desc");
12 if(!$afart['title'])
13  $afart=$db->get_one("SELECT * FROM phpcms_article_1 where articleid=1");
14 $preurl=$preart['linkurl'];
15 $afurl=$afart['linkurl'];
16 $pretitle=$preart['title'];
17 $aftitle=$afart['title'];
18 $url=$PHP_SCHEME.$PHP_DOMAIN.PHPCMS_PATH;
19 echo "<li>上一篇:<a href='$url/$preurl'>$pretitle</a></li>";
20 echo "<li>下一篇:<a href='$url/$afurl'>$aftitle</a></li>";
21 ?>

       原理很简单,根据当前页面的索引($articleid)通过数据库($db)查询它的上一篇和下一篇,并最终通过echo打印的页面上。但是,我们如何得知$articleid,$db的存在呢?这就需要我们理解在点击"生成文章"后后台都做了些什么?通过分析,执行这一命令后,消息路由如下:

admin.php->phpcms"module"article"admin.inc.php->phpcms"module"article"admin"createhtml.inc.php(case 'create_show':)->golbal.func.php(createhtml)->phpcms"module"article"include"createhtm"show.php

      消息路由到了这个文件,通过: 

  ob_start();
  
include template($mod, $templateid);
  
$data = ob_get_contents();
  
ob_clean();

  file_put_contents($filename, $data);完成了html文件的创建与写入。如果深究下去,可以发现template()调用了template_refresh(),而template_refresh()则调用template_parse()对phpcms的标签进行解释,并翻译了纯PHP。

之后template()函数返回,被输出到了浏览器缓冲区(由ob_start()打开),与被输出到屏幕一样,此时文件中内嵌的PHP会被翻译成html的形式。对于自定义标签来讲,它被template_parse()翻译成<?php phpcms_mytag() ?>,因此,在输出时会调用phpcms_mytag()函数。而正是由这个函数将最终的自定义标签的文件给包含了进来。这样一来,自定义标签的文件和包含$articleid,$db的文件结合在了一起,因此,此时便可以在自定义标签文件中使用这两个变量了。

posted on 2009-09-06 15:55  igaofen  阅读(575)  评论(0编辑  收藏  举报