欢迎光临

木子屋

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

作者: dnawo

日期: 2008-01-31 00:15 AM

分类: 程序修改

内容: Dvbbs V8.2.0 RC1号称采用全新的模板驱动机制，在其发布之际，我们来看看它的模板驱动机制，也学习学习。在Dvbbs V8.2.0 RC1中标签大体可分成两类，和模板驱动相关的函数主要有四个，下边我们先来说说标签和函数，最后举一个例子实际应用一下。
一、标签种类
1.单标签，格式如{.value}
2.区域标签，格式如{.begin} ... {.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 = "标题：{.title}(日期:{.date})<br/><br/>内容：{.begin}不错哈，{.content}{.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)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.113 ms

返回

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

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 1.113 ms

返回

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

评论内容:

== 来请教 2008-10-25 03:16 PM ----

问题是 RS 对象的数据如何传递到 ParseBbbNode 里面去？
先组合成数组再去拆分循环替换？

== dnawo 2008-10-22 03:58 PM ----

Sub ParseBbbNode(sToken)
Select Case sToken
Case "content"
'这边处理{.content}
Case "other"
'省略
End Select
End Sub

== 来请教 2008-10-19 10:46 PM ----

我想请教当
Template = "标题：{.title}(日期:{.date})<br/><br/>内容：{.begin}这里是数据库查询出来的，{.content}{.end}"的时候，{.content}标签在哪替换成rs(0)

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 2.559 ms

返回