All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
五种ADO.NET数据库连接知识简介_[Asp.Net教程]
使用PHP通过SMTP发送邮件新手指南_php资料_编程技术
掌握SQL Server的锁机制和锁模式_[SQL Server教程]
.NET与常见数据库连接的方式_[Asp.Net教程]
ASP.NET中生成条形码_[Asp.Net教程]
C#,XML处理技术_[Asp.Net教程]
Silverlight,2(beta1)数据操作(2)——使用ASP.NET,Web,Service_[Asp.Net教程]
VS.net调试ASP.NET项目出错原因及解决_[Asp.Net教程]
TreeView服务器控件的功能和属性
SQL,Server,索引结构及其使用(二)_[SQL,Server教程]
Reading number is top 10 pictures
Small QiShu -- ShuangShuangPan2
Fender Bender that so horrifying1
A resort photographed beautiful young woman change clothes process vomiting blood2
代沟,真好
身材野火台灣美女1
Look for from human art net, is good--2
2012 national geographic daily picture3
A man's favorite things5
这玉米,买还是不卖?
yy365网站上的美女1
Download software ranking
I'm come from Beijing1
linux初级教程
Boxer's Top ten classic battle7
Ashlynn Video2
Unix video tutorial19
matrix3
Boxer's Top ten classic battle3
Tram sex maniac 2 (H) rar bag5
Ashlynn Video5
The Bermuda triangle2
归海一刀 published in(发表于) 2014/2/10 6:54:08 Edit(编辑)
模板用xml的思路_[PHP教程]

模板用xml的思路_[PHP教程]

模板用xml的思路_[PHP教程]























前段时间,一直比较关心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数据我们另外可以表示成一个导航,如果您喜欢的话.这在传统的模板技术中会这样写:




...



{SITE_TOP}//cjjer制作



...




替换的时候replace()的是{ 和}符号中的变量,这在数据简单的时候,比方只是一个导航,而我们如果要的是一个很复杂的数据显示的时候,那就很难控制了,因为把一个很大量输出数据放在一个变量中很难保证不出错.




另外,传统的模板(在php中)是这样的,获取模板的文件,加载,显示,这没什么问题,问题就在当web项目(不完全是网站)非常复杂的时候,很容易替换错误和模板单调,虽然可以用css控制一些显示,但很难控制数据的布局,比方,E区我今天不想要了,你改模板,重新加载文件... ?




有没有更加容易的解决方案?有.




我提出了这样一种观点:




模板页为 XML文档 ,模板节点加载已有模块 ,加载"仿xml数据"生成文件 (原谅我,这么说我觉得已经非常容易了)下面我就这种模板技术详谈.




先看看我说的模块是什么东西,大家都知道,html中的

呀,

都是显示数据布局的一些布局标签,为什么我们不能自己制作这种标签呢?例如:我现在"创"一个这样的标签这里,当然,这个标签对项目是有意义的,表示控制全局的模块节点,如果在模板页中出现节点加载的就是对应名称为 format 的模块数据:













[%TITLE%]












&%format%&











这里我把这个模板节点定义成 加载控制全局的html源了,再看这个标签topdata:












{%TOP_MESS%}<%=show_top_meun()%>







如果这个节点被加载,生成的文件里面会将topdata节点替换成如上的html文档模板,这就是模块




这里的模块也可以是xml文档,重复加载模块,也可以是终数据.




当这些还有模块节点的xml模板被加载以后,就被程序识别,对应的加载成html二级模块,然后提出我们的"仿xml 数据"标记中的数据,正则替换对应的节点,生成文件,这里的"仿xml数据"是这种方式的数据:




{%TITLE%}<%=cjjer_hometitle%>{%/TITLE%}
{%STYLE%}default{%/STYLE%}
{%site_top%}<%=get_cache(0)%>{%/site_top%}
{%format_two%}

<%Call light()%>


{%/format_two%}
{%site_footer%}<%Call cc_footer()%>{%/site_footer%}




这里,您可能马上理解了我说的"仿xml数据"了,这种加载数据的方式也是xml分析节点,然后直接正则替换,当然可以include文件的(asp,php).




好了,现在您想必概念已经很清楚了,(不清楚的话重新看上面的话,或看如下的例子)




我就举个举个简单的例子说明一下(format_index.xml):





{%site_top%}

{%home_bigflash%}
{%format_two%}

{%site_footer%}




模块:







//format,就是最上面的那个,不列举了




//home_bigflash


















//format_two


(&format_two&)




//site_footer


(&site_footer&)







差不多应该加载的模板和模块就这点吧(都是可以重用的.)




现在是程序处理:










<%
'根据输入判断输出是名称还是数据
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="(

)"
Dim Matches,Match
Set Matches = regxml.Execute(x)
For Each Match in Matches
html=html&match.value
Next
getincludefile=html
End Function
'获取模板项,先判断输出,返回值是 html 形式的模板,参数是模板的名称
Function gettpl(url)
Dim mudule_file,xml_file,asp_file
xml_file=url
asp_file=gettpldata(xml_file,0)'由模板名称获取模板的内容
Dim loadxml,parsexml,nodes,node
Set loadxml = Server.CreateObject("MSxml2.DOMDocument")
loadxml.async=false
parsexml=server.mappath("../"&gettpldata(xml_file,10)&xml_file)'装载本地的xml文档,先到数据库取到路径
loadxml.load parsexml
Set nodes = loadxml.selectNodes("//*")
for each node in nodes
asp_file=insertaspinhtml(asp_file,gettpldata(node.nodename,1),node.nodename)'加载模块到模板,输出html模板
Next
gettpl=asp_file
End function




'匹配模板中的数据项
'把data中的数据传入html文件当中去
Function tpltodata(html,data)
Dim regxml
Set regxml=new regexp
regxml.ignorecase=True
regxml.global=True
regxml.pattern="({%)([a-zA-Z][A-Za-z0-9_]{2,60})(%})(.[^\[]*)({%/)\2(%})"




Dim Matches,Match
Set Matches = regxml.Execute(data)
For Each Match in Matches
html=Replace(html,"{%"&regxml.Replace(match.value,"2")&"%}",regxml.Replace(match.value,"4"))
Next
tpltodata=html
End Function




'geturlxml 传入参数模板名称,返回模板的内容,失败的时候返回 null
Function geturlxml(outfile)
geturlxml=Null
If outfile="" Then Exit Function
Set rs=conn.execute("select [szd_tpl] FROM szd_asp where [szd_link]='"&outfile&"'")
If rs.eof And rs.bof Then
Exit Function
else
geturlxml=rs("szd_tpl")
End If
End Function




public Function gettpldata(url,mode)
'Set rs=server.CreateObject("server.adodbrecordset")
If Len(url)<1 Then Exit Function
Dim szd_keytpl
Select Case mode
Case 0:Set rs=conn.execute("select [szd_content] from szd_tpl where [szd_link]='"&url&"'")
Case 10:Set rs=conn.execute("select [szd_url] from szd_tpl where [szd_link]='"&url&"'")
Case 1:Set rs=conn.execute("select [szd_content] from szd_keytpl where [szd_key]='"&url&"'")
End Select
If Not(rs.eof And rs.bof) Then
szd_keytpl=rs(0)
Else
szd_keytpl="

{%nodefined%}

"
End If
gettpldata=szd_keytpl
End Function
'加载标记的模块到 xml 格式的模板中,输出html格式的模板,asp:xml格式模板,html:导入的模块,xmls:当前标记
Function insertaspinhtml(asp,html,xmls)
Dim regxml,temp,temps,tempasp,tempasp_e
Set regxml=new regexp
regxml.ignorecase=True
regxml.global=True
regxml.pattern="(\<"&xmls&"\>)(.[^\[]*)(\<\/"&xmls&"\>)"
temp=regxml.Replace(asp,"2")
Dim Matches,Match
Set Matches = regxml.Execute(asp)
For Each Match in Matches
html=Replace(html,"(&"&xmls&"&)",regxml.Replace(match.value,"2"))
asp=Replace(asp,Match.Value,html)
next
temps=Replace(html,"(&"&xmls&"&)",temp)
insertaspinhtml=asp
End Function




Function update_aspfile(id)
Dim update_aspfile_return
update_aspfile_return=False
id=killint(id,0,0,14)
If id=0 Then Exit Function
Set rs=conn.execute("select [szd_level],[szd_content],[szd_tpl],[szd_link] from szd_asp where id="&id&"")
If rs.eof And rs.bof Then Exit Function
Dim tpl_level,tpl_content,tpl_tpl,html_content,asp_file_now
tpl_level=rs(0)
tpl_content=rs(1)
tpl_tpl=rs(2)
asp_file_now=rs(3)
If Len(tpl_tpl)<4 Or tpl_level=1 Or IsNull(tpl_tpl) Then
html_content=tpl_content
Else
html_content=gettpl(tpl_tpl)
If Not isnull(html_content) Then
html_content=getincludefile(tpl_content)&tpltodata(html_content,tpl_content)
'response.write("


"&server.htmlencode(getincludefile(tpl_content))&"
")
Else
html_content=tpl_content
'response.write("
"&server.htmlencode(html_content)&"
")
End If
End If
If writeto("../",asp_file_now,html_content,2) Then update_aspfile_return=True
update_aspfile=update_aspfile_return
End Function
%>







生成文件:




运行代码框













<%=cjjer_hometitle%>



















<%=get_cache(0)%>



















<%Call light()%>







<%Call cc_footer()%>









这里,我的模块用了div,是利于样式表的使用.




主要思路如图:







其他的就不再说了,不知道说明白了.






作者:5do8 来源:蓝色理想









































添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.