做過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 2 defined ( ' IN_PHPCMS ' ) or exit ( ' Access Denied ' );
3 ?>
4 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 "
上一篇: $pretitle " ;
20 echo "
下一篇: $aftitle " ;
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的檔案結合在了一起,因此,此時便可以在自訂標籤檔案中使用這兩個變數了。