|
主题:SQL标签嵌套详解{进阶} [收藏主题] | 转到: |
前言:
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) 顶端 底部 |
仔细看上面帖子,对SQL标签嵌套有个很好理解后,上次那个投票帖里的例子实现起来应该也不难了。由于涉及到客户网站,现只把SQL语句和循环体发下,这些其实已足够了,关键是理解SQL标签嵌套含义和执行过程。
{SQL_商品导航_首页()}<----{SQL_商品导航二级_首页()}<----{SQL_商品导航三级_首页()} {SQL_商品导航品牌_首页()}和{SQL_商品导航促销_首页()}参数为{SQL_商品导航_首页()}栏目ID 发不了SQL语句,只能用图片代替了 {SQL_商品导航_首页()} SQL语句: 循环体:
{SQL_商品导航二级_首页()} SQL语句: 循环体:
{SQL_商品导航三级_首页()} SQL语句: 循环体:
{SQL_商品导航品牌_首页()} SQL语句: 循环体:
{SQL_商品导航促销_首页()} SQL语句: 循环体:
论坛有好几个讲的很详细的有关SQL标签嵌套的帖子,看完此帖可对应看以下几个例子或去论坛具体搜索下: http://bbs.kesion.com/forumthread-68605.html http://bbs.kesion.com/forumthread-1126365.html |
|
支持(1) | 反对(0) 顶端 底部 |
支持(0) | 反对(0) 顶端 底部 |
<上一主题 | 下一主题 > |