木子屋 Dnawo's BLOG

解读Dvbbs V8.2.0 RC1模板驱动机制

👤 dnawo 📅 2008-01-31 👁 6212 👍 0 💬 3 🔄 来源:本站原创
Dvbbs V8.2.0 RC1号称采用全新的模板驱动机制,在其发布之际,我们来看看它的模板驱动机制,也学习学习。在Dvbbs V8.2.0 RC1中标签大体可分成两类,和模板驱动相关的函数主要有四个,下边我们先来说说标签和函数,最后举一个例子实际应用一下。

一、标签种类

1.单标签,格式如{$name.value}
2.区域标签,格式如{$name.begin} ... {$name.end}

二、模板驱动相关主要函数(4个)

1.TPL_Scan函数
功能:扫描模板,输出非标签的内容,遇到标签就交给TPL_Parse函数处理。

2.TPL_Parse函数
功能:对标签进行分析,当为单标签时交给TPL_ParseNode函数处理,当为区域标签时分析出标签中的内容再交给TPL_ParseArea函数处理,最终返回新的起始位置给TPL_Scan。

3.TPL_ParseNode函数
功能:处理(替换)单标签并输出内容。

4.TPL_ParseArea函数
功能:调用TPL_Scan函数处理区域标签中的内容。

函数位置说明:TPL_Scan和TPL_Parse函数放在inc/dv_template.inc文件中供其他页面调用,其他页面中必须包含自己的TPL_ParseNode和TPL_ParseArea函数来处理标签,因为不同页面不同模板中的标签不尽相同!

三、举例应用

<%
'第一部分:我们定义一个变量Template存放模板内容
Dim Template
Template = "标题:{$aaa.title}(日期:{$aaa.date})<br/><br/>内容:{$bbslist.begin}不错哈,{$bbb.content}{$bbslist.end}"

'第二部分:和模板驱动相关的四个重要函数
Sub TPL_Scan(sTemplate)
	Dim iPosLast, iPosCur
	iPosLast	= 1
	While True 
		iPosCur	= InStr(iPosLast, sTemplate, "{$")
		If iPosCur>0 Then
			TPL_Echo	Mid(sTemplate, iPosLast, iPosCur-iPosLast)
			iPosLast	= TPL_Parse(sTemplate, iPosCur+2)
		Else
			TPL_Echo	Mid(sTemplate, iPosLast)
			Exit Sub  
		End If 
	 Wend 
End Sub 

Function TPL_Parse(sTemplate, iPosBegin)
	Dim iPosCur, sToken, sValue, sTemp
	iPosCur		= InStr(iPosBegin, sTemplate, "}")
	sTemp		= Mid(sTemplate,iPosBegin,iPosCur-iPosBegin)
	iPosBegin	= iPosCur+1
	iPosCur		= InStr(sTemp, ".")
	sToken		= Left(sTemp, iPosCur-1)
	sValue		= Mid(sTemp, iPosCur+1)
	Select Case sValue
		Case "begin"
			sTemp			= "{$" & ( sToken & ".end}" )
			iPosCur			= InStr(iPosBegin, sTemplate, sTemp)
			TPL_ParseArea	  sToken, Mid(sTemplate, iPosBegin, iPosCur-iPosBegin)
			iPosBegin		= iPosCur+Len(sTemp)
		Case Else
			TPL_ParseNode sToken, sValue
	End Select 
	TPL_Parse	= iPosBegin
End Function 

Sub TPL_ParseNode(sTokenType, sTokenName)
	Select Case sTokenType
		Case "aaa"
			'细化给ParseAaaNode处理
			ParseAaaNode sTokenName
		Case "bbb"
			'细化给ParseBbbNode处理
			ParseBbbNode sTokenName
	End Select 
End Sub 

Sub TPL_ParseArea(sTokenName, sTemplate)
	Select Case sTokenName
		Case "bbslist"
			For i=0 To 4 '根据实际情况设置循环次数
				TPL_Scan sTemplate
			Next 
		Case "other"
			 '省略
		Case "other2"
			'省略
	End Select 
End Sub 

'第三部分:其他相关函数
TPL_Immediate = True
Sub TPL_Echo(sStr)
	If TPL_Immediate Then
		Response.Write	sStr
	Else
		TPL_Memo	= TPL_Memo&sStr
	End If 
End Sub 

Sub ParseAaaNode(sToken)
	Select Case sToken
		Case "title"
			Response.Write("这是贴子标题")
		Case "date"
			Response.Write("2008-01-31")
		Case "other"
			'省略
	End Select
End Sub

Sub ParseBbbNode(sToken)
	Select Case sToken
		Case "content"
			Response.Write("木子屋:http://www.mzwu.com/")
		Case "other"
			'省略
	End Select
End Sub

'第四部分:该调用TPL_Scan输出内容了
TPL_Scan Template
%>

评论(3)

来请教 2008-10-19 22:46
我想请教当
Template = "标题:{$aaa.title}(日期:{$aaa.date})<br/><br/>内容:{$bbslist.begin}[i][b]这里是数据库查询出来的[/b][/i],{$bbb.content}{$bbslist.end}"的时候,{$bbb.content}标签在哪替换成rs(0)
dnawo 2008-10-22 15:58
Sub ParseBbbNode(sToken)
Select Case sToken
Case "content"
'这边处理{$bbb.content}
Case "other"
'省略
End Select
End Sub
来请教 2008-10-25 15:16
问题是 RS 对象的数据如何传递到 ParseBbbNode 里面去?
先组合成数组再去拆分循环替换?
验证码
评论需审核通过后显示
← 上一篇 Dvbbs V8.2.0 RC1修改:在楼主的贴子中标明"[楼主… 下一篇 → 1月30日加一个月是几月几日?