提动易swCMS6.5网站提供了ASP生成HTML的功能仅限于以下页面的使用:
网站首页以及各频道首页,栏目页,专题页,内容页的静态页生成
至于公告页,投票结果页,友情链接页,用户中心页等页面均未提供生成静态页的功能
我们可以通过对其他页面生成静态页的技术分析的来学习这个知识点,
通过学习相信我们可以完善网站其他页面的静态页生成功能
所有生成静态页的操作都在后台进行
网站首页的静态页生成由后台页Admin_CreateSiteIndex.asp调用两个过程来完成
Call GetHTML_SiteIndex '返回strHTML,即网站首页的html内容
Call WriteToFile(InstallDir & FileName_SiteIndex, strHTML) ‘保存成静态页到指定的目录
过程GetHTML_SiteIndex()在《皮肤与代码分离技术的原理》已做过简单介绍,
位于后台页调用的<!--#include file="../Include/PowerEasy.SiteIndex.asp"-->文件中
过程WriteToFile()才是生成静态页的核心代码
位于后台页调用的<!--#include file="../Include/PowerEasy.FSO.asp"-->文件中
作 用:写入相应的内容到指定的文件
参 数:WriteToFileName ---- 写入文件的文件名
WriteToFileContent ---- 写入文件的内容
该过程包含两个子函数如下:
Function WriteToFile_FSO(WriteToFileName, WriteToFileContent) '以字符串的形式写入文件
Function WriteToFile_ADO(WriteToFileName, WriteToFileContent) '以文件流的形式写入文件
由过程WriteToFile()根据文件内容的形式判断决定选择哪个自函数来完成文件的生成
由于是将模板的HTML内容保存成静态网页
所以选择的肯定由子函数WriteToFile_FSO()来完成静态页的生成
而子函数WriteToFile_ADO()则用于保存文章中包含的远程图片文件
因为远程图片是以文件流的形式复制到文章频道的上传目录中的
过程WriteToFile()及其子函数WriteToFile_FSO()的代码比较简单,如下所示:
Sub WriteToFile(WriteToFileName, WriteToFileContent)
Dim ErrMsg
ErrMsg = WriteToFile_FSO(WriteToFileName, WriteToFileContent)
If ErrMsg <> "" Then
ErrMsg = WriteToFile_ADO(WriteToFileName, WriteToFileContent)
If ErrMsg <> "" Then
Response.Write "<li>生成 " & WriteToFileName & " 时出错。出错原因:" & ErrMsg & "</li>"
End If
End If
End Sub
Function WriteToFile_FSO(WriteToFileName, WriteToFileContent) '字符串的形式写入文件
On Error Resume Next
Err.Clear
Dim hf
Set hf = fso.OpenTextFile(Server.MapPath(WriteToFileName), 2, True)
hf.Write WriteToFileContent
hf.Close
Set hf = Nothing
If Err Then
WriteToFile_FSO = Err.Description
Err.Clear
Else
WriteToFile_FSO = ""
End If
End Function
各频道页面:内容页,栏目页,专题页,频道首页共4种的静态页生成
在后台页Admin_CreateHTML.asp进行操作
以使用文章功能的频道为例,相关文件还包括:
Admin_CreateArticle.asp 其包含过程CreateArticle()
Admin_CreateCommon.asp 其包含各功能模块的频道栏目页,频道专题页,频道首页的过程
CreateClass() CreateSpecial() CreateIndex()
这三个过程方法由该功能模块的类的对象实例调用,例如这里是Article类的对象实例
:比如我添加了“科研天地”这个文章频道
首先,我们要确定该频道设置成要求生成HTML静态页,当然选“是”
其次,选择要求生成的静态页种类和生成方式,即自动还是手动生成,一般为自动
再次,设置栏目页和内容页生成静态页存放的路径,例如:list/list_ID.html 和html/ID.html
最后,设置静态页的命名方式,例如:ID.html
在后台“科研天地管理”的生成选项中设置好以上参数后
则文件Admin_CreateArticle.asp所调用的过程就根据以上设置的参数进行生成静态页的操作
'response.Write(Action) '测试从Admin_CreateHTML.asp的隐藏域Action传递的参数值
Select Case Action '此参数从Admin_CreateHTML.asp的表单隐藏域获取
Case "CreateArticle"
Call CreateArticle '生成内容页
Case "CreateClass"
Call CreateClass '生成栏目页
Case "CreateSpecial"
Call CreateSpecial '生成专题页
Case "CreateIndex"
Call CreateIndex '生成首页
Case "CreateArticle2" '设置为自动生成的方式时创建以下静态页
If AutoCreateType > 0 Then '若是自动生成方式,
IsAutoCreate = True '
Call CreateArticle '则创建文章内容页
If ClassID > 0 Then '若该文章属于某栏目,
ClassID = ParentPath & "," & ClassID 'ParentPath为该栏目的父路径
Call CreateClass '则创建栏目页
End If
SpecialID = Trim(Request("SpecialID"))
If SpecialID <> "" Then Call CreateSpecial
'在生成首页前,要将栏目ID和专题ID置为0
ClassID = 0
arrChildID = 0
SpecialID = 0
Call CreateIndex '生成频道首页
Call CreateSiteIndex '生成网站首页
Call CreateSiteSpecial '生成全站专题
End If
Case "CreateOther" '定时生成创建除文章其他页
‘程序代码省略
Case Else
FoundErr = True
ErrMsg = ErrMsg & "<li>参数错误!</li>"
End Select
了解了生成静态页的核心代码后,还有一个重要而值得考虑的问题
即 “静态链接还是ASP页链接的问题”
该问题在替换标签这一环节上,下面接着探讨:
生成静态页的过程中当获取模板内容后
在替换标签时就要对某些文字或图片内容的链接文件做一个判断
根据是否采用HTML生成方式来决定链接的是HTML静态页还是ASP页
我们以生成“科研天地”文章频道静态首页为例简述其过程:
1. 首先获取模板“2006海蓝文章频道首页模板”
2. “科研天地”频道首页Index.asp调用Article类的过程方法GetHTML_Index来获取HTML内容
Call PE_Content.GetHTML_Index
3. 在过程GetHTML_Index()中,
除了要替换一些普通标签外,还要调用以下方法对超级标签的替换
strTemp = GetListFromTemplate(strTemp)
strTemp = GetPicFromTemplate(strTemp)
完成以列表形式显示文章标题等信息的超级函数式标签和
以图片形式显示文章的超级函数式标签的替换工作
4. 当替换例如“最新推荐”的文章列表标签
{$GetArticleList(ChannelID,0,True,0,True,10,False,False,"",0,3,2,30,0,True,1,True,False,3,False,False,False,True,True,False,0)}时,
就要对标题的链接文件做一个判断,
若文章内容页也采用了生成HTML的方式,
则链接的文件就是静态页(例如:html/9.html),
若否,则为ASP页(例如:ShowArticle.asp?ArticleID=9)
5. 因此当由GetListFromTemplate(strTemp)获取模板内容后,
再由GetListFromLabel()将标签中的相关参数传递到GetArticleList()
最终由GetArticleList()调用的子函数GetArticleUrl()和GetClassUrl()实现对文章 标题和文章栏目名的链接文件进行决定
两函数GetArticleUrl()和GetClassUrl()的代码虽然简短但很重要
两函数功能相似,但却位于不同的文件中
函数GetArticleUrl()位于PowerEasy.Common.Content.asp中:
'根据是否生成HTML来判断文章列表中标题的链接为静态页还是ASP页
Function GetArticleUrl(ByVal tParentDir, ByVal tClassDir, ByVal tUpdateTime, ByVal tArticleID, ByVal tClassPurview, ByVal tInfoPurview, ByVal tInfoPoint)
If IsNull(tParentDir) Then tParentDir = ""
If IsNull(tClassDir) Then tClassDir = ""
If IsNull(tClassPurview) Then tClassPurview = 0
If IsNull(tInfoPurview) Then tInfoPurview = 0
If UseCreateHTML > 0 And tClassPurview = 0 And tInfoPoint = 0 And tInfoPurview = 0 Then
GetArticleUrl = ChannelUrl & GetItemPath(StructureType, tParentDir, tClassDir, tUpdateTime) & GetItemFileName(FileNameType, ChannelDir, tUpdateTime, tArticleID) & FileExt_Item
Else
GetArticleUrl = ChannelUrl_ASPFile & "/ShowArticle.asp?ArticleID=" & tArticleID
End If
End Function
函数GetClassUrl()位于PowerEasy.Common.Front.asp中:
'根据是否生成HTML来判断文章列表中栏目名的链接为静态页还是ASP页
'备注:在Admin_ClassUrl.asp中也有一个代码完全相同的GetClassUrl()函数
Function GetClassUrl(sParentDir, sClassDir, iClassID, iClassPurview)
Dim strClassUrl
If (UseCreateHTML = 1 Or UseCreateHTML = 3) And iClassPurview < 2 Then
strClassUrl = ChannelUrl & GetListPath(StructureType, ListFileType, sParentDir, sClassDir) & GetListFileName(ListFileType, iClassID, 1, 1) & FileExt_List
Else
strClassUrl = ChannelUrl_ASPFile & "/ShowClass.asp?ClassID=" & iClassID
End If
GetClassUrl = strClassUrl
End Function