账号通
    

账号  

密码  

125425

查看

177

回复
主题:[原创]使科讯条件判断标签{$IF(condition||out1||out2)} 支持{SQL_}标签嵌套的方法 [收藏主题] 转到:  
深蓝 当前离线

11

主题

0

广播

2

粉丝
添加关注
级别:学前班

用户积分:78 分
登录次数:14 次
注册时间:2010/1/7
最后登录:2010/8/18
深蓝 发表于:2010/1/14 12:29:00   | 只看该作者 查看该作者主题 楼主 
科汛在线商城系统(NET)

[原创]使科讯条件判断标签{$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,"##","{"),"@@","}")
'WriteDebugXML "ReplaceUserFunctionLabel",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 当前离线

22

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:147 分
登录次数:16 次
注册时间:2009/10/27
最后登录:2010/8/6
tianyalove 发表于:2010/6/8 12:07:00   | 只看该作者 查看该作者主题 沙发 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
cvtommey 当前离线

236

主题

2

广播

1

粉丝
添加关注
级别:二年级

用户积分:2799 分
登录次数:275 次
注册时间:2007/1/14
最后登录:2023/5/31
cvtommey 发表于:2010/6/7 17:24:00   | 只看该作者 查看该作者主题 藤椅 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
fosf 当前离线

175

主题

0

广播

0

粉丝
添加关注
级别:一年级

用户积分:1311 分
登录次数:117 次
注册时间:2007/11/19
最后登录:2010/11/24
fosf 发表于:2010/5/19 18:38:00   | 只看该作者 查看该作者主题 板凳 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
qq282779839 当前离线

17

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:276 分
登录次数:30 次
注册时间:2009/12/15
最后登录:2010/6/26
qq282779839 发表于:2010/5/19 14:40:00   | 只看该作者 查看该作者主题 报纸 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
spwksnla 当前离线

31

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:316 分
登录次数:38 次
注册时间:2008/10/11
最后登录:2010/12/3
spwksnla 发表于:2010/5/19 12:04:00   | 只看该作者 查看该作者主题 地板 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
风断星灭 当前离线

6

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:520 分
登录次数:68 次
注册时间:2009/3/15
最后登录:2012/8/22
风断星灭 发表于:2010/4/29 5:09:00   | 只看该作者 查看该作者主题 7楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
浪侠 当前离线

416

主题

4

广播

1

粉丝
添加关注
级别:四年级

用户积分:2073 分
登录次数:299 次
注册时间:2007/2/12
最后登录:2019/3/14
浪侠 发表于:2010/4/27 9:06:00   | 只看该作者 查看该作者主题 8楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
yuang88 当前离线

27

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:403 分
登录次数:73 次
注册时间:2009/5/19
最后登录:2015/3/24
yuang88 发表于:2010/4/26 23:55:00   | 只看该作者 查看该作者主题 9楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
zouling 当前离线

118

主题

0

广播

0

粉丝
添加关注
级别:一年级

用户积分:967 分
登录次数:56 次
注册时间:2009/10/19
最后登录:2010/6/3
zouling 发表于:2010/4/20 15:28:00   | 只看该作者 查看该作者主题 10楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行1.32031秒 powered by KesionCMS 9.0