|
主题:[原创]使科讯条件判断标签{$IF(condition||out1||out2)} 支持{SQL_}标签嵌套的方法 [收藏主题] | 转到: |
[原创]使科讯条件判断标签{$IF(condition||out1||out2)} 支持{SQL_}标签嵌套的方法 (呵呵,我的语言表达能力不怎么好,还是我直接把Kesion.Label.SQLCls.asp附上吧,大家下载后替换原来的这个文件即可使用,不要忘记IF中嵌套SQL标签的写法: {$IF(condition||{$SQL_ceshi()$}||{$SQL_ceshi()$})} )
写在前面:本文属深蓝(QQ:570713592)原创,欢迎大家进行转载,但请朋友们转载时保留作者信息,谢谢!!!作者:深蓝 QQ:570713592 Email:zdg1980@126.com 深蓝网站:http://www.slzh.net 论坛:http://bbs.slzh.net (论坛暂时关闭中……) CMS技术交流QQ群:(1)15315694 (2)18715460 (3)9235205 友情提示:请加入其中一个群即可,目前第三个QQ群刚刚开通,第一、二个qq群人数很多,基本达到人数上限……
问题描述:对cms系统的接触和使用,我是在动易SW系列开始的,对动易的了解和学习,为我以后使用各种cms系统打下了基础。以后我又接触了dede系统,动网、dz论坛系统,以及其他cms系统。目前为止,我用cms系统为客户开发了多个网站了,发现很多cms大同小异,都有各自的优点,也有很多不足。呵呵,扯远了…… 我刚刚使用科讯不久,发现科讯总体不错,最近想用科学做一个学校网站,发现科讯的条件判断标签不支持内部嵌套SQL自定义标签,这应该是一个和动易一样的缺点,非常不利于灵活函数标签的开发!
问题举例:在一个SQL标签中,内容为:{$IF({$Field(Child,Num,0,2)}=0||{SQL_GetSubClass({$Field(ID,Num,0,2)})}||ceshi内容输出})} 这个标签正常的或者说大家理想的执行过程为:先对IF标签中条件进行判断,如果条件为True那么输出{SQL_GetSubClass({$Field(ID,Num,0,2)})}这个标签内容,否则输出后面的内容。但是,在执行这个标签时,确不能解析,出现程序错误: “Microsoft VBScript 运行时错误 错误 '800a0005' 无效的过程调用或参数: 'Mid' ” 。科讯官方说明中也提到IF标签不能进行sQL标签嵌套。呵呵,大家是否和我一样,也想按照我们预计的效果进行输出呢?如果能实现IF标签嵌套SQL标签,对我们进行模板设计带来很大方便。下面看我的解决过程!
解决过程: 要想解决这个问题,就得找出问题所在,那就要对科讯标签解析过程进行分析了。不幸的是,网上参考方法和文章几乎没有。呵呵,只好自己动手动脑分析了。 要想分析标签解析过程,就得跟踪程序运行过程。因此,我首先简单分析了下程序运行过程,大体了解了标签解析用的的函数和运行过程。如下: Kesion()→Run()→KSR.KSLabelReplaceAll(Template) →ReplaceAllLabel(F_C)→ReplaceSQLLabel(Content)→DCls.ReplaceUserFunctionLabel(Content)→ReplaceDIYFunctionLabel(SqlLabel,"label")) →G_S_P(LabelName &"}",1)→Rcls.ReplaceGeneralLabelContent(Str)→GetCirLabelContent(CirLabelContent,KS_RS_Obj,LoopTimes),1,1) →CleanLabel(Content)→ReplaceCondition(byval str)→Response.Write Template
然后,我自己写了个程序调试跟踪程序(需要的朋友可以和我要哦,不过你得确实对程序有点基础才行)。接下来,就是用刚才的标签,跟踪运行解析过程。 我分别跟踪了:ReplaceCondition(byval str) G_S_P(LabelName,FieldID) ReplaceUserFunctionLabel(Content)
发现在ReplaceCondition和ReplaceUserFunctionLabel这个函数解析时出了问题,然后分析G_S_P函数,受到启发。综上分析这三个函数,找到问题解决办法,如下:
解决办法: (1)将{$IF()}标签中嵌套的{SQL_标签名},修改成这种调用形式:{$SQL_GetSubClass({$Field(ID,Num,0,2)})$} (2)修改 Function G_S_P(LabelName,FieldID) 找到和下面类似的一句(自己找下,我就不贴了),替换为下面的这一句: Str=Replace(Replace(Replace(Replace(Replace(Replace(objAtr.Attributes.item(2).Text,"{$Field","{#Field"),"{$AutoID}","{#AutoID}"),"{$IF","{#IF"),"{$Param","{#Param") ,"{$SQL_","##SQL_") ,"$}","@@") '避免Field字段被替换掉,先转为# 避免{$SQL_ $} 被替换掉,支持SQL标签的嵌套 —— 深蓝注 QQ:570713592 (3)修改Function ReplaceUserFunctionLabel(Content) ,增加对IF中嵌套SQL标签的支持 在“'判断嵌套,Instr(Str,",'{SQL_")=0当含有ajax输出时,不递归”前,加一句: Str = Replace(Replace(Str,"##","{"),"@@","}") 完毕!
效果测试: 将开始提到的某个SQL标签的内容替换为:{$IF({$Field(Child,Num,0,2)}=0||{$SQL_GetSubClass({$Field(ID,Num,0,2)})$}||ceshi内容输出})} ,保存,然后你在模板中调用SQL标签,试试吧……
效果我已经亲自测试,决定可行!转载别忘记我的作者信息哦……
作者:深蓝 QQ:570713592 Email:zdg1980@126.com 深蓝网站:http://www.slzh.net 论坛:http://bbs.slzh.net (论坛暂时关闭中……) CMS技术交流QQ群:(1)15315694 (2)18715460 (3)9235205 友情提示:请加入其中一个群即可,目前第三个QQ群刚刚开通,第一、二个qq群人数很多,基本达到人数上限……
以下内容只有回复后才可以浏览,请先登录! |
|
支持(0) | 反对(0) 顶端 底部 |
tianyalove 发表于:2010/6/8 12:07:00 | 只看该作者 查看该作者主题
沙发
|
|
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
qq282779839 发表于:2010/5/19 14:40:00 | 只看该作者 查看该作者主题
报纸
|
|
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
<上一主题 | 下一主题 > |