风讯官方论坛

首页 » FoosunCMS交流区 » 插件讨论 » [插件分享] ----制作强大的"通用标签"----(3.1版测试通过)
lino - 2005-10-7 01:19:00

什么是通用标签?
简单地说,就是标签中调用标签 如:{FS_{FS_当前类目}_热点}
通用标签有什么用?
利用通用标签可以让N个类目共同调用一个模板,而显示的内容又各不相同。
它可以大大减少你制作模板的工作,也会给日常的维护带来很大的方便。
通用标签的原理是什么?
现在有多少个要表现的类就要写多少个模板与之对应。 比如说:网页技术下有ASP、JSP、PHP、JAVA、CGI等等一堆子栏目。每个子栏目需要写一个对应的模板和它对应。因为每个模板上的“相关新闻”、“热点新闻”等都不能用同一个标签。如果写一个可以自动得出目前栏目所在的父类的方法,放到一个公共模板里供标签调用,无论有多少个子栏目页面,只要显示的栏目一样,只需要写二个模板就够了。一个是Class_public.htm,一个是Detail_public.htm
怎么实现呢?比如需要在asp,jsp,php,java,cgk几个板块中“热点新闻”。只需要在Class_public.htm中定义{FS_{FS_当前栏目}_热点新闻},然后去自定义标签里加上{FS_asp_热点新闻}{FS_jsp_热点新闻}。。。等就可以了。好象讲了半天也没说清楚~。
PS解释下:{FS_{FS_当前栏目}_热点}
会自动先把{FS_当前栏目}得出来,(当前栏目也是自动获取的,不需要指定) 假设当前栏目的名称是asp,那么就变成了{FS_asp_热点}。只需要在标签库中有{FS_asp_热点}就可以显示ASP的热点新闻了~


实现通用标签需要改三个页面。不要嫌麻烦,它真的会带给你前所未有的轻松!
建议先备份下述三个文件:
Admin\Refresh\RefreshFunction.asp
Admin\Refresh\Function.asp
Admin\Refresh\SelectFunction.asp


一、打开Admin\Refresh\RefreshFunction.asp ,拉到倒数第二行(也就是%>前面),,把下面的代码复制上去
'******************************
'根据ID得到当前所在栏目的名称
'author:lino
'Start
'*****************************
Function ypren()
Select Case RefreshType
  Case "Class"
  ypren = GetClassNameById(RefreshID)
  Case "News"
  ypren = GetNewsClassNameById(RefreshID)
  Case "Special"
  ypren = GetSpecialClassNameById(RefreshID)
  Case "DownLoad"
  ypren = GetDownloadClassNameById(RefreshID)
  Case Else
  ypren = ""
End Select
End Function


'栏目名称
Function GetClassNameById(ClassID)
Dim SqlClass,RsClassObj
if ClassID = "" then Exit Function


'**********如果是3.1版,把下行NewsClass改成FS_NewsClass
  Set RsClassObj = Conn.Execute("Select ClassCName from NewsClass where ClassID='" & ClassID & "'")
  if Not RsClassObj.Eof then
  GetClassNameById=RsClassObj("ClassCName")
  end if
RsClassObj.Close
Set RsClassObj = Nothing
End Function


'新闻所在的类目


Function GetNewsClassNameById(NewsID)
Dim SqlClass,RsClassObj
if NewsID = "" then Exit Function


'**********如果是3.1版,把下行News改成FS_News
  Set RsClassObj = Conn.Execute("Select ClassID from News where NewsID='" & NewsID & "' ")
  if Not RsClassObj.Eof then
  GetNewsClassNameById=RsClassObj("ClassID")
  GetNewsClassNameById=GetClassNameById(GetNewsClassNameById)
  end if
RsClassObj.Close
Set RsClassObj = Nothing
End Function


'专题所在的类目


Function GetSpecialClassNameById(SpecialID)
Dim SqlClass,RsClassObj
if SpecialID = "" then Exit Function


'**********如果是3.1版,把下行Special改成FS_Special
  Set RsClassObj = Conn.Execute("Select CName from Special where SpecialID='" & SpecialID & "' ")
  if Not RsClassObj.Eof then
  GetSpecialClassNameById=RsClassObj("CName")
  end if
RsClassObj.Close
Set RsClassObj = Nothing
End Function


'下载所在的类目


Function GetDownloadClassNameById(DownloadID)
Dim SqlClass,RsClassObj
if DownloadID = "" then Exit Function


'**********如果是3.1版,把下行Download改成FS_Download
Set RsClassObj = Conn.Execute("Select ClassID from Download where DownloadID='" & DownloadID & "' ")
  if Not RsClassObj.Eof then
  GetDownloadClassNameById=RsClassObj("ClassID")
  GetDownloadClassNameById=GetClassNameById(GetDownloadClassNameById)
  end if
RsClassObj.Close
Set RsClassObj = Nothing
End Function


'**************************
'End
'**************************



第二步:打开Admin\Refresh\Function.asp (sorry,这里应把RefreshFunction.asp 更正为Function.asp。感谢hkin兄指正!) ,拉到倒数第二行(也就是%>前面),,把下面的代码复制上去


'******************************
'把{FS_当前类目}转成类目名称
'author:lino
'Start
'*****************************
Function ReplaceYpren(Content)
Dim whatIsClass
whatIsClass=GetLableContent("ypren,")


Content=replace(Content,"{FS_当前类目}",whatIsCLass)
ReplaceYpren=Content
  'response.write("Content is:"&Content)
End Function


'**************************
'End
'**************************


第三步:打开Admin\Refresh\Function.asp (2005.10.23日修正)


搜索 Function ReplaceAllLable(Content) ,把下面代码放在其下一行


'**************
'Replace Lable
'**************
Content=ReplaceYpren(Content)


小提示:可以通过编辑器中的"查找"功能来找到Function ReplaceAllLable(Content)


   
第四步:打开Admin\Refresh\SelectFunction.asp
从(约)第9行
  Select Case LCase(ParaArray(0))
开始,加入下面代码:


'******************************
'根据标签调用ypren()方法
'author:lino
'Start
'*****************************
Case "ypren"
  If UBound(ParaArray) = 1 then
    GetLableContent = ypren()
  Else
    Exit Function
  End if
 
'**************************
'End
'**************************


OK,现在你可以在一个模板中用{FS_{FS_当前类目}_热点}、{FS_{FS_当前类目}_推荐}等等标签去体会通用标签的强大了!


我学识有限,写得不对的地方请各位海涵并指出!因为我的程序改动得比较多,所以行数可能会不准确。建议善用“查找”功能。
还有一些修改日后陆续发上来和大家分享!愿风讯越来越强大!

[upload=jpg]UploadFile/2005-10/2005107205146880.jpg[/upload]

[此贴子已经被作者于2005-10-29 21:46:25编辑过]



附件: 1248.jpg
nazyman - 2005-10-7 07:12:00

真不错,帮顶。


不过,新版的好像有自由标签了。

老九 - 2005-10-7 07:41:00

太好了

hotla - 2005-10-7 08:15:00
好文加精
ekeai - 2005-10-7 09:22:00
非常非常的好!!!可惜我时间不是很足无法测试。。。。
weilen - 2005-10-7 09:24:00

一、二、三步修改同一个文件?


能适用于SP2吗?

wenmeng - 2005-10-7 09:48:00

其思妙想!

A君 - 2005-10-7 10:00:00

好人,善于动脑筋的人,值得钦佩

netfound - 2005-10-7 10:09:00

我还没有来得急做,都贴出来了,你真快哦!


我顶。。。。

网路游侠 - 2005-10-7 10:12:00

下载可好?人懒  呵呵  东东很好


等这个东东等了好久了 ^_^

ggmo - 2005-10-7 10:22:00
想法非常不错
lino - 2005-10-7 10:39:00

谢谢版主大哥加精!以后有好东东会继续分享!


[此贴子已经被作者于2005-10-7 10:38:57编辑过]

狂人草鞋 - 2005-10-7 11:20:00
什麽呀???
doudou888 - 2005-10-7 20:44:00

  好兄弟,真不错!!


  我认真看了你的介绍,我觉得,我们两个人是殊途同归啊。你的功能我也刚实现,不过我用的方法是另一种。按你的方法,模板可以减少,但标签却不能少按我的方法不但模板可以减少,而且标签也可以减少,并且只要修改一个文件。


  我的想法是,请热点新闻、推荐新闻、热点下载,推荐下载,默认调用用父级栏目的(官方的默认是调用全站的),即不指定栏目就调用父级栏目的热点新闻什么的。结果让我给实现了。


  演示:http://220.162.195.6:168/fx/Get/softs/webs/058282040167496632.asp


原贴:http://bbs.foosun.net/dispbbs.asp?boardID=22&ID=11626&page=3


修改方法:


分四大步:


1、找到函数


'热点下载
HotDownList


(1)在if RowHeightStr <> "" then RowHeightStr = " Height=""" & RowHeightStr & """"下插入



'=======若不指定栏目,调用本栏目的热点下载==============================
if ClassListStr = "" then
  dim RelateNewsSql,RelateNewsSql1,RsSearchObj,RsSearchObj1
  RelateNewsSql = "Select ClassID from DownLoad where DownLoadID='" & RefreshID & "' order by ID desc"
  Set RsSearchObj = Conn.Execute(RelateNewsSql)
  if Not RsSearchObj.Eof then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" &RsSearchObj("ClassID")& "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassListStr = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  Elseif RefreshID<>"" then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" & RefreshID & "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassListStr = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  End if
  Set RsSearchObj = Nothing
end if
'=============================================

  (2)把
if ClassListStr <> "" then
改成
If ClassListStr<>"" and ClassListStr<>"All" then


2、找到函数


'推荐下载
Function RecDownList(


(1)在if RowHeightStr <> "" then RowHeightStr = " Height=""" & RowHeightStr & """"下插入

'=======若不指定栏目,调用本栏目的热点下载==============================
if ClassListStr = "" then
  dim RelateNewsSql,RelateNewsSql1,RsSearchObj,RsSearchObj1
  RelateNewsSql = "Select ClassID from DownLoad where DownLoadID='" & RefreshID & "' order by ID desc"
  Set RsSearchObj = Conn.Execute(RelateNewsSql)
  if Not RsSearchObj.Eof then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" &RsSearchObj("ClassID")& "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassListStr = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  Elseif RefreshID<>"" then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" & RefreshID & "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassListStr = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  End if
  Set RsSearchObj = Nothing
end if
'=============================================

(2)把
if ClassListStr <> "" then
改成
If ClassListStr<>"" and ClassListStr<>"All" then


3、找到函数


'推荐新闻
Function RecNews(ClassEName,SoonClassStr,NewNumberStr,TitleNumberStr,RowNumberStr,NaviPicStr,CompatPicStr,OpenTypeStr,CSSStyleStr,RowHeightStr,TxtNaviStr)


If ClassEName<>"" then
替换成
'=======若不指定栏目,调用本栏目的推荐新闻==============================
if ClassEName = "" and RefreshID <>"" then
  dim RelateNewsSql,RelateNewsSql1,RsSearchObj,RsSearchObj1
  RelateNewsSql = "Select ClassID from News where NewsID='" & RefreshID & "' order by ID desc"
  Set RsSearchObj = Conn.Execute(RelateNewsSql)
  if Not RsSearchObj.Eof then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" &RsSearchObj("ClassID")& "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassEName = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  Elseif RefreshID<>"" then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" & RefreshID & "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassEName = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  End If
  Set RsSearchObj = Nothing
end if
'===========================================================================
If ClassEName<>"" and ClassEName<>"All" then


4、找到函数
Function HotNews(ClassEName,SoonClassStr,NewNumberStr,TitleNumberStr,RowNumberStr,NaviPicStr,CompatPicStr,OpenTypeStr,CSSStyleStr,RowHeightStr,TxtNaviStr)


If ClassEName<>"" then
替换成
'=======若不指定栏目,调用本栏目的热点下载==============================
if ClassEName = "" then
  dim RelateNewsSql,RelateNewsSql1,RsSearchObj,RsSearchObj1
  RelateNewsSql = "Select ClassID from News where NewsID='" & RefreshID & "' order by ID desc"
  Set RsSearchObj = Conn.Execute(RelateNewsSql)
  if Not RsSearchObj.Eof then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" &RsSearchObj("ClassID")& "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassEName = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  Elseif RefreshID<>"" then
    RelateNewsSql1 = "Select ClassEName from NewsClass where ClassID='" & RefreshID & "' order by ID desc"
    Set RsSearchObj1 = Conn.Execute(RelateNewsSql1)
    ClassEName = RsSearchObj1("ClassEName")
    Set RsSearchObj1 = Nothing
  End If
  Set RsSearchObj = Nothing
end if
'===========================================================================
If ClassEName<>"" and ClassEName<>"All" then

使用方法:


(1)标签没有指定栏目,就调用父级栏目相应的新闻或下载。


(2)如果要调用全站的,则把栏目英文名称设置为All (注意大小写)


说明:本方法在3.0的SP1与SP2中通过



[此贴子已经被作者于2005-10-7 21:15:03编辑过]

zihanlion - 2005-10-7 21:01:00
不错。老兄有你的
lino - 2005-10-7 22:02:00
doudou888 兄弟真强!佩服一个~希望以后能有幸多与你交流!
lino - 2005-10-7 22:09:00

doudou888 兄:
我觉得你修改的程序是不是可以做成函数(Function)的形式。我的想法如下:1、不会破坏原程序,即使以后风讯升级成SP3,SP4,也只需要把函数加到页面里就行了。2、程序的可读性会加强~3、可以扩展性好。做成函数可以让其他有必要的地方调用,也能通过一个if来方便控制是否开启这个功能~


[此贴子已经被作者于2005-10-7 22:10:05编辑过]

atwinter - 2005-10-7 22:35:00

这就是要标签做到模板与栏目无关啊!

doudou888 - 2005-10-7 22:45:00

lino朋友:


  你的想法不错!不过函数多了也不是好事。特别是用的频率不高的函数。可以看出,你对风讯的了解是很不错的。欢迎交流!!

tuzi15 - 2005-10-7 22:53:00




不错。
夏日的天空 - 2005-10-7 23:11:00

支持楼主


但是改页面的事我再也不做


要后悔滴

[em01][em01][em01]
xzggg - 2005-10-8 09:00:00
果然好东西。
lino - 2005-10-17 15:41:00
感谢hkin兄指正错误!
glen - 2005-10-17 16:01:00
都是好人,都是强人,呵呵,顶了!收藏之.
hkin - 2005-10-17 16:56:00
谢谢楼主修正错误!
hkin - 2005-10-17 16:57:00

还有就是第三步两段字符串只有一段


楼主再看看

lino - 2005-10-17 17:27:00
二段字符是一样的,所以偷懒只写了一段~
tsyh - 2005-10-17 18:01:00

第三步:打开Admin\Refresh\RefreshFunction.asp
把 FileContent=ReplaceYpren(FileContent) 放在(约)第128行FileContent = ReplaceAllServerFlag(ReplaceAllLable(FileContent))之前
把 FileContent=ReplaceYpren(FileContent) 放在(约)第283行FileContent = ReplaceAllServerFlag(ReplaceAllLable(FileContent))之前
128行和283行最终变成:(128行和283行是相同内容)


这个好像找不到啊,我的版本是3.0。

bgugbt - 2005-10-17 18:48:00
你真伟大
junjunjest - 2005-10-17 22:29:00

都是nb啊.


我是没时间研究风讯.


等以后有时间,好好研究一下风讯的内涵

123
查看完整版本: [插件分享] ----制作强大的"通用标签"----(3.1版测试通过)