前段時間,一直比較關(guān)心php的模板技術(shù)的我,接到了客戶的要求:全站利用模板技術(shù),可以控制多模板,這個項目要求有強大的后臺,主要是多模板,難點就在模板的導(dǎo)入和識別并且生成上,我仔細考察了php的模板核心技術(shù),無外乎查找字符串開始,然后定義替換變量,替換成數(shù)據(jù),然后并成輸出頁輸出,牽扯到的緩存我就不再說了.
我們來看看這種方式的生成方式的缺點:如果要"多樣式"的顯示數(shù)據(jù),當然我先不說CSS,不能真正的把數(shù)據(jù)和表示分離,無外乎利用css樣式表方式顯示而已,我們現(xiàn)在接到的這個項目不但要求css樣式表的可選化,而且要求數(shù)據(jù)顯示的"多方式",打個比方,看下圖:
我們下面為了容易描述期間,我這樣表示各個部分:A,B,C,D,E,F,G這6個區(qū)可以表示數(shù)據(jù)顯示區(qū)域,從設(shè)計者角度考慮,有全局(div控制A-G),TOP(A),LEFT(B),RIGHT(C,D,E,F)和FOOTER(G),當然,您可以分的更細一些,這么顯示,可以用div控制的,但這不是模板技術(shù),請明白,多樣式表不叫模板,這和模板無關(guān),所謂的模板,就是只與"數(shù)據(jù)布局"相關(guān),在A數(shù)據(jù)我們另外可以表示成一個導(dǎo)航,如果您喜歡的話.這在傳統(tǒng)的模板技術(shù)中會這樣寫:
... <div id="top"> {$SITE_TOP$}//cjjer制作 </div> ...
替換的時候replace()的是{$ 和$}符號中的變量,這在數(shù)據(jù)簡單的時候,比方只是一個導(dǎo)航,而我們?nèi)绻氖且粋很復(fù)雜的數(shù)據(jù)顯示的時候,那就很難控制了,因為把一個很大量輸出數(shù)據(jù)放在一個變量中很難保證不出錯.
另外,傳統(tǒng)的模板(在php中)是這樣的,獲取模板的文件,加載,顯示,這沒什么問題,問題就在當web項目(不完全是網(wǎng)站)非常復(fù)雜的時候,很容易替換錯誤和模板單調(diào),雖然可以用css控制一些顯示,但很難控制數(shù)據(jù)的布局,比方,E區(qū)我今天不想要了,你改模板,重新加載文件... ?
有沒有更加容易的解決方案?有.
我提出了這樣一種觀點:
模板頁為 XML文檔 ,模板節(jié)點加載已有模塊 ,加載"仿xml數(shù)據(jù)"生成文件 (原諒我,這么說我覺得已經(jīng)非常容易了)下面我就這種模板技術(shù)詳談.
先看看我說的模塊是什么東西,大家都知道,html中的<div>呀,<table>都是顯示數(shù)據(jù)布局的一些布局標簽,為什么我們不能自己制作這種標簽?zāi)?例如:我現(xiàn)在"創(chuàng)"一個這樣的標簽<format>這里,當然,這個標簽對項目是有意義的,表示控制全局的模塊節(jié)點,如果在模板頁中出現(xiàn)節(jié)點<format>加載的就是對應(yīng)名稱為 format 的模塊數(shù)據(jù):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> <HTML xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[%TITLE%]</title> <meta http-equiv="content-type" content="text/html; charset=gb2312" /> <meta http-equiv="Content-Language" content="zh-CN" /> <meta name="author" content="[%AUTHOR%]" /> <meta name="copyright" content="[%COPYRIGHT%]" /> <meta name="description" content="[%DESCRIPTION%]" /> <meta name="keywords" content="[%KEYWORDS%]" /> <link href="styles/[%STYLES%]/import.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="format"> &%format%& </div> </body> </html>
這里我把這個模板節(jié)點定義成 加載控制全局的html源了,再看這個標簽topdata:
<div id="topdata">{%TOP_MESS%}<%=show_top_meun()%></div>
如果這個節(jié)點被加載,生成的文件里面會將topdata節(jié)點替換成如上的html文檔模板,這就是模塊
這里的模塊也可以是xml文檔,重復(fù)加載模塊,也可以是終數(shù)據(jù).
當這些還有模塊節(jié)點的xml模板被加載以后,就被程序識別,對應(yīng)的加載成html二級模塊,然后提出我們的"仿xml 數(shù)據(jù)"標記中的數(shù)據(jù),正則替換對應(yīng)的節(jié)點,生成文件,這里的"仿xml數(shù)據(jù)"是這種方式的數(shù)據(jù):
{%TITLE%}<%=cjjer_hometitle%>{%/TITLE%} {%STYLE%}default{%/STYLE%} {%site_top%}<%=get_cache(0)%>{%/site_top%} {%format_two%}<div id="footer_ul"><%Call light()%></div> {%/format_two%} {%site_footer%}<%Call cc_footer()%>{%/site_footer%}
這里,您可能馬上理解了我說的"仿xml數(shù)據(jù)"了,這種加載數(shù)據(jù)的方式也是xml分析節(jié)點,然后直接正則替換,當然可以include文件的(asp,php).
好了,現(xiàn)在您想必概念已經(jīng)很清楚了,(不清楚的話重新看上面的話,或看如下的例子)
我就舉個舉個簡單的例子說明一下(format_index.xml):
<format> <site_top>{%site_top%}</site_top> <format_two> <home_bigflash>{%home_bigflash%}</home_bigflash> {%format_two%} </format_two> <site_footer>{%site_footer%}</site_footer> </format>
模塊:
//format,就是最上面的那個,不列舉了
//home_bigflash
<div id="main_img"> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/ swflash.cab#version=6,0,29,0" width="100%"> <param name="movie" value="images/main.swf"> <param name="wmode" value="transparent"> <param name="quality" value="high"> <embed src="images/main.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="100%"></embed> </object> </div>
//format_two <div id="format_two">(&format_two&)<script language="javascript" type="text/javascript" src="js/same_h2.js"></script> </div>
//site_footer <div id="site_footer">(&site_footer&)</div>
差不多應(yīng)該加載的模板和模塊就這點吧(都是可以重用的.)
出處:藍色理想
責任編輯:moby
上一頁 下一頁 模板用xml的思路 [2]
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|