我們下面為了容易描述期間,我這樣表示各個部分:A,B,C,D,E,F,G這6個區可以表示數據顯示區域,從設計者角度考慮,有全局(div控制A-G),TOP(A),LEFT(B),RIGHT(C,D,E,F)和FOOTER(G),當然,您可以分的更細一些,這麼顯示,可以用div控制的,但這不是模板技術,請明白,多樣式表不叫模板,這和模板無關,所謂的模板,就是只與"數據布局"相關,在A數據我們另外可以表示成一個導航,如果您喜歡的話.這在傳統的模板技術中會這樣寫:
...
<div id="top">
{$SITE_TOP$}//cjjer制作
</div>
...
替換的時候replace()的是{$ 和$}符號中的變量,這在數據簡單的時候,比方只是一個導航,而我們如果要的是一個很復雜的數據顯示的時候,那就很難控制了,因為把一個很大量輸出數據放在一個變量中很難保證不出錯.
另外,傳統的模板(在PHP中)是這樣的,獲取模板的文件,加載,顯示,這沒什麼問題,問題就在當web項目(不完全是網站)非常復雜的時候,很容易替換錯誤和模板單調,雖然可以用CSS控制一些顯示,但很難控制數據的布局,比方,E區我今天不想要了,你改模板,重新加載文件... ?
有沒有更加容易的解決方案?有.
我提出了這樣一種觀點:
模板頁為 XML文檔 ,模板節點加載已有模塊 ,加載"仿XML數據"生成文件 (原諒我,這麼說我覺得已經非常容易了)下面我就這種模板技術詳談.
先看看我說的模塊是什麼東西,大家都知道,Html中的<div>呀,<table>都是顯示數據布局的一些布局標簽,為什麼我們不能自己制作這種標簽呢?例如:我現在"創"一個這樣的標簽<format>這裡,當然,這個標簽對項目是有意義的,表示控制全局的模塊節點,如果在模板頁中出現節點<format>加載的就是對應名稱為 format 的模塊數據:
<!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>
這裡我把這個模板節點定義成 加載控制全局的Html源了,再看這個標簽topdata:
<div id="topdata">{%TOP_MESS%}<%=show_top_meun()%></div>
如果這個節點被加載,生成的文件裡面會將topdata節點替換成如上的Html文檔模板,這就是模塊
這裡的模塊也可以是XML文檔,重復加載模塊,也可以是終數據.
當這些還有模塊節點的XML模板被加載以後,就被程序識別,對應的加載成Html二級模塊,然後提出我們的"仿XML 數據"標記中的數據,正則替換對應的節點,生成文件,這裡的"仿XML數據"是這種方式的數據:
{%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數據"了,這種加載數據的方式也是XML分析節點,然後直接正則替換,當然可以include文件的(ASP,PHP).
好了,現在您想必概念已經很清楚了,(不清楚的話重新看上面的話,或看如下的例子)
我就舉個舉個簡單的例子說明一下(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>
差不多應該加載的模板和模塊就這點吧(都是可以重用的.)
現在是程序處理:
<%
'根據輸入判斷輸出是名稱還是數據
Function geturlXML(outfile,mode)
geturlXML=False
If outfile="" Then Exit Function
Dim tab
Select Case killint(mode,0,0,2)
Case 0:tab="szd_tpl"
Case 1:tab="szd_content"
End Select
Set rs=conn.execute("select ["&tab&"] FROM szd_ASP where [szd_link]='"&outfile&"'")
If rs.eof And rs.bof Then
Exit Function
else
geturlXML=rs(tab)
End If
End Function
'提取include文件到原始的數據項中
Function getincludefile(x)
Dim regXML,Html
Html=""
Set regXML=new regexp
regXML.ignorecase=True
regXML.global=True
regXML.pattern="(<!--#include)(\s)