admin.php 的变量
其实,我们可以将这几个问题归结为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 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 "
20 echo "
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()翻译成,因此,在输出时会调用phpcms_mytag()函数。而正是由这个函数将最终的自定义标签的文件给包含了进来。这样一来,自定义标签的文件和包含$articleid,$db的文件结合在了一起,因此,此时便可以在自定义标签文件中使用这两个变量了。
下一篇: php生成N个不重复的随机数实例_PHP