DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 模板用xml的思路
模板用xml的思路
編輯:XML詳解     
間,一直比較關心php的模板技術的我,接到了客戶的要求:全站利用模板技術,可以控制多模板,這個項目要求有強大的後台,主要是多模板,難點就在模板的導入和識別並且生成上,我仔細考察了PHP的模板核心技術,無外乎查找字符串開始,然後定義替換變量,替換成數據,然後並成輸出頁輸出,牽扯到的緩存我就不再說了.

我們來看看這種方式的生成方式的缺點:如果要"多樣式"的顯示數據,當然我先不說CSS,不能真正的把數據和表示分離,無外乎利用css樣式表方式顯示而已,我們現在接到的這個項目不但要求CSS樣式表的可選化,而且要求數據顯示的"多方式",打個比方,看下圖:

我們下面為了容易描述期間,我這樣表示各個部分: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)

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved