账号通
    

账号  

密码  

6570

查看

14

回复
主题:SQL标签嵌套详解{进阶} [收藏主题] 转到:  
刚刚 当前离线

1852

主题

5

广播

126

粉丝
添加关注
级别:版主

用户积分:7093 分
登录次数:225 次
注册时间:2010/7/6
最后登录:2024/4/15
刚刚 发表于:2013/12/28 13:22:57   | 只看该作者 查看该作者主题 楼主 
科汛在线网校系统
前言:
SQL标签嵌套使用比较灵活,支持无限级嵌套sql标签,很大程度上扩展了系统功能,适当使用可实现一些较复杂功能模块。在实际建站中,树型导航(可折叠)、多层级栏目调用(纯栏目、栏目信息混合)常会使用到SQL标签嵌套,尤其是在商城网站更为常见。本帖着重剖析SQL标签嵌套实现过程,使大家对SQL标签嵌套有更深入理解,知其然,更知其所以然,在以后建站或项目中得心应手、随心所欲地使用SQL标签嵌套。


SQL标签嵌套实现过程:
ReplaceUserFunctionLabel函数递归调用
SQL标签嵌套实现过程其实就是一个递归分层级SQL标签解析过程(具体看稍后的实例分析)

具体看下这个函数一切就清晰了
\KS_Cls\Kesion.Label.SQLCls.asp点击查看原图

函数参数Content可看做模版内容
这个函数,通过正则表达式“{SQL_[^{]*\)}”匹配SQL标签 “{SQL_标签名()}”,然后通过For循环逐个替换匹配到的SQL标签为对应SQL标签解析后内容,执行完For循环,Content内SQL标签在第一层上已解析完,通过上图光标行,判断是否存在嵌套SQL标签,若有则递归调用ReplaceUserFunctionLabel函数对嵌套层SQL标签进行解析,若满足递归条件判断一直按此过程执行下去。从上面分析来看,SQL标签是可无限级嵌套的。


实现过程实例演示:
为让大家对SQL标签嵌套递归分层解析过程有个更清晰认识,下面以一个实例做以诠释:
用到栏目表,在实例前先解释下栏目表几个字段含义:
TN:栏目父ID 频道栏目TN为0
TJ:栏目深度 频道栏目TJ为1
TS:栏目树结构
具体可看下截图:
点击查看原图


以调用商城多级栏目为例:
点击查看原图

三个标签:{SQL_主()}、{SQL_次()}、{SQL_次次()}
嵌套关系:
{SQL_主()}<----{SQL_次()}<----{SQL_次次()}
(由于官方服务器安装有安全狗,帖子中有些SQL会被拦截,下面一些地方用图片替代)

{SQL_主()}
SQL语句:
点击查看原图
循环体:
点击查看原图


{SQL_次()}
SQL语句:
点击查看原图
循环体:
点击查看原图


{SQL_次次()}
SQL语句:
点击查看原图
循环体:
点击查看原图

模版如下:点击查看原图


不涉及递归 执行后模版内容为:
点击查看原图
解析1个SQL 出来2个SQL标签
---------------------------------------------------------------------------

第一次递归后:
点击查看原图
解析两个SQL标签 出来4个SQL标签
---------------------------------------------------------------------------

第二次递归后完成SQL标签{SQL_主()}整体解析

总共执行1+2+4=7个SQL标签



总结:
SQL标签嵌套的解析其实就是一个递归分层级SQL标签解析的过程:通过自动递归操作,对模版层次级循环解析SQL标签,具体可看上面的实例解析过程(替换模版SQL标签,若替换后仍有SQL标签,再执行替换操作......),明白了这一点,无论嵌套多少层级,表面看起来是多么复杂,都将变成1+1=2的问题了。同时可很清晰看出,有个很大弊端,那就是执行效率问题。栏目每层只有两个,两次嵌套后,实际执行SQL标签成乘方级增长,从模版上看是一个标签,实际是执行了7个!若是每层是6个栏目的话,就是执行1+6+36=43个SQL标签
由于SQL标签嵌套实际执行SQL数目是乘方级递增的,所以一定要注意执行效率问题,执行后,可把对应解析后的代码放到一个自定义静态标签里,然后在模版里直接调用静态标签或直接放到模版里。

注意事项:
标签嵌套只有SQL标签才支持
嵌套标签间可互相独立,若嵌套标签间若有关联,把外标签的字段值作为内标签的参数即可
需注意以下两点
1、栏目页分页SQL标签若用ajax输出,则模版上别的SQL标签嵌套无效
ajax分页SQL标签执行后有",'{SQL_"字符,这样递归条件不成立,不然就是一个死循环,无穷递归下去了
2、嵌套标签不能用ajax输出,被嵌套标签可用AJAX输出
上例中{SQL_主()}、{SQL_次()}不可用AJAX输出   {SQL_次次()}可用AJAX输出


近春节,事情比较多,心有余而力不足,老是想着及时发布本帖,苦于一直安排不出足够时间,趁今天周末抽空及时完成下。在此对期望此帖的KSFANS,深表歉意!


 
专业网站漏洞检测与修复及服务器安全维护、专业程序修改与二次开发及标签制作。QQ:2813239495 详谈
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
刚刚 当前离线

1852

主题

5

广播

126

粉丝
添加关注
级别:版主

用户积分:7093 分
登录次数:225 次
注册时间:2010/7/6
最后登录:2024/4/15
刚刚 发表于:2013/12/28 13:23:14   | 只看该作者 查看该作者主题 沙发 
科汛智能建站系统
仔细看上面帖子,对SQL标签嵌套有个很好理解后,上次那个投票帖里的例子实现起来应该也不难了。由于涉及到客户网站,现只把SQL语句和循环体发下,这些其实已足够了,关键是理解SQL标签嵌套含义和执行过程。

{SQL_商品导航_首页()}<----{SQL_商品导航二级_首页()}<----{SQL_商品导航三级_首页()}
{SQL_商品导航品牌_首页()}和{SQL_商品导航促销_首页()}参数为{SQL_商品导航_首页()}栏目ID

发不了SQL语句,只能用图片代替了
{SQL_商品导航_首页()}

SQL语句:
点击查看原图
循环体:
  1. [loop=10]<li style="border-top: none;">  <div class="cate-tag">           <strong><a href="{$Field(id,GetInfoUrl,100,1)}">{$Field(foldername,Text,0,0,2,)}</a></strong>  </div>  <div class="list-item hide">    <ul class="itemleft">    {SQL_商品导航二级_首页({$Field(id,GetInfoUrl,100,2)})}    </ul>    <ul class="itemright">      <dl>        <dt>品牌</dt>      </dl>      <div class="news-list">       {SQL_商品导航品牌_首页({$Field(id,GetInfoUrl,100,2)})}      </div>      <dl>        <dt>促销活动</dt>      </dl>      <div class="ad-list mt10">{SQL_商品导航促销_首页({$Field(id,GetInfoUrl,100,2)})}</div>    </ul>  </div></li>[/loop]<li></li>



{SQL_商品导航二级_首页()}
SQL语句:
点击查看原图
循环体:
  1. [loop=20]<dl>  <dt>{$Field(foldername,Text,0,0,2,)}</dt>  <dd>{SQL_商品导航三级_首页({$Field(id,GetInfoUrl,100,2)})}</dd></dl><div class="fn-clear"></div>[/loop]


{SQL_商品导航三级_首页()}
SQL语句:
点击查看原图
循环体:
  1. [loop=30]  <a href="{$Field(id,GetInfoUrl,100,1)}">{$Field(foldername,Text,0,0,2,)}</a>  [/loop]



{SQL_商品导航品牌_首页()}
SQL语句:
点击查看原图
循环体:
  1. [loop=20]<span class="red">[{$Field(brandname,Text,0,0,2,)}]</span>[/loop]


{SQL_商品导航促销_首页()}
SQL语句:
点击查看原图
循环体:
  1. [loop=2] <a href="{$Field(id,GetInfoUrl,5,1)}"><img src='{$Field(photourl,Text,0,0,2,)}' width='210' height='100' /></a> [/loop]




论坛有好几个讲的很详细的有关SQL标签嵌套的帖子,看完此帖可对应看以下几个例子或去论坛具体搜索下:
http://bbs.kesion.com/forumthread-68605.html
http://bbs.kesion.com/forumthread-1126365.html
 
  支持(1) | 反对(0) 回到顶部顶端 回到底部底部
刚刚 当前离线

1852

主题

5

广播

126

粉丝
添加关注
级别:版主

用户积分:7093 分
登录次数:225 次
注册时间:2010/7/6
最后登录:2024/4/15
刚刚 发表于:2013/12/28 13:23:24   | 只看该作者 查看该作者主题 藤椅 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
wjm_hi 当前离线

223

主题

9

广播

1

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

用户积分:934 分
登录次数:131 次
注册时间:2008/6/11
最后登录:2024/3/23
wjm_hi 发表于:2013/12/28 15:35:15   | 只看该作者 查看该作者主题 板凳 
科汛在线商城系统(NET)
不错的详解,值得学习了。
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
msad 当前离线

1428

主题

18

广播

5

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

用户积分:6865 分
登录次数:175 次
注册时间:2006/11/20
最后登录:2015/10/21
msad 发表于:2013/12/28 16:46:52   | 只看该作者 查看该作者主题 报纸 
科汛智能建站系统
搞成电子书就好了,或者PDF文本也好哇。对于我等菜鸟来说,图片是最尴尬的模式。
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
ygr1971 当前离线

1404

主题

44

广播

45

粉丝
添加关注
级别:版主

用户积分:8683 分
登录次数:124 次
注册时间:2011/11/13
最后登录:2021/11/2
ygr1971 发表于:2013/12/28 19:09:48   | 只看该作者 查看该作者主题 地板 
科汛在线考试系统(NET)

谢谢“刚刚”版主提供的好教程。

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
ks1w 当前离线

2796

主题

4

广播

1

粉丝
添加关注
级别:大一

用户积分:14338 分
登录次数:665 次
注册时间:2006/11/3
最后登录:2019/7/26
ks1w 发表于:2013/12/28 19:45:19   | 只看该作者 查看该作者主题 7楼 
做在线知识付费 选科汛云开店
以下是引用 msad在2013-12-28 16:46:52的发言:
搞成电子书就好了,或者PDF文本也好哇。对于我等菜鸟来说,图片是最尴尬的模式。
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
1006298681 当前离线

1438

主题

0

广播

2

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

用户积分:3011 分
登录次数:654 次
注册时间:2010/6/28
最后登录:2020/10/30
1006298681 发表于:2013/12/29 11:21:53   | 只看该作者 查看该作者主题 8楼 
科汛在线网校系统
感谢分享,确实是属于进阶教程 要有一定基础的
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
keyi 当前离线

3123

主题

8

广播

18

粉丝
添加关注
级别:大二

用户积分:11924 分
登录次数:2527 次
注册时间:2008/12/24
最后登录:2023/12/14
keyi 发表于:2013/12/29 14:16:46   | 只看该作者 查看该作者主题 9楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
yt 当前离线

663

主题

6

广播

1

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

用户积分:2771 分
登录次数:703 次
注册时间:2007/11/19
最后登录:2016/2/10
yt 发表于:2013/12/30 17:03:27   | 只看该作者 查看该作者主题 10楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行0.28125秒 powered by KesionCMS 9.0