sql标签可以称得上是个万能标签了,查询数据库将其输出,这里介绍一些关于这个标签的用法:
  1.用来输出统计内容,这个是不错的,举个例子,我们来统计下总共发了多少的文章,思路就是输出dede_addonarticle这个文章附加表内容总数就可以了。
  {dede:sql sql="SELECT COUNT(*) AS nums FROM dede_addonarticle"}
  [field:name = "nums"/]
  {/dede:sql}
  2.使用~field~来进行特殊的查询,比如之前论坛上面很多会员需要做一个输出当前发布文章会员的相关内容,之前用sql或者arclist标签是没办法实现的,因为每篇内容是不同的,这里我们来用5.5的sql语句来做个示范。
  我们首先在文章模板中相应的位置加上下面的标签
  {dede:sql sql="SELECT * FROM dede_archives WHERE writer=~writer~"}
  [field:id/],
  {/dede:sql}
  这个放到article_article.htm页面,将会检索出当前会员发布的相关文章,这里的~ writer~会根据当前内容的环境变量进行替换后再执行查询。
  这里出现在SQL语句中条件查询的~ writer~,也就是$refObj->Fields[$value]这个里面的相关内容
  模板中使用PHP
  许多人希望织梦的模板标签能够更加灵活,加入可以运行PHP的功能,这里在DedeCMS V5.5中就加入了一个可以执行php的特殊标签{dede:php}{/dede:php},这个标签可以执行PHP语句了。
  我这里举几个常用的例子:
  1.最简单的输出内容:
  {dede:php}
  $numA = 1;
  $numB = 2;
  echo $numA + $numB;
  {/dede:php}
  这个输出的内容是计算结果:
  3
  2.结合SQL查询输出单条内容
  {dede:php}
  $row = $dsql->GetOne('select id,typename from dede_arctype where id=2');
  print_r($row);
  {/dede:php}
  这个输出的内容是
  Array
  (
  [id] => 2
  [typename] => 问答
  )
  3.获取当前页面的变量
  比如我们这里进入系统后台的[模板]-[全局标记测试],我们在代码中填入下面的内容:
  {dede:php}
  print_r($refObj->Fields);
  {/dede:php}
  如果环境变量保持默认,即“不使用环境ID”,我们会看到以下的结果:
  Array
  (
  [typeid] => 0
  [phpurl] => /plus
  [indexurl] => /
  [templeturl] => /templets
  [memberurl] => /member
  [specurl] => /special
  [indexname] => 主页
  [templetdef] => /templets/default
  )
  那我们再换个环境变量测试看看,这里以我本地的栏目为测试了:
  Array
  (
  [id] => 3
  [reid] => 0
  [topid] => 0
  [sortrank] => 1
  [typename] => 产品
  [typedir] => {cmspath}/product
  … …
  [indexname] => 主页
  [templetdef] => /templets/default
  [position] => 主页 > 产品 >
  [title] => 产品
  )
  这样一来就检索出当前页面的局部变量了,接下来我们可以来结合前面的SQL语句来实现根据不同环境ID调用内容不同栏目内容。
  例如:
  {dede:php}
  $thisid = $refObj->Fields['id'];
  $row = $dsql->GetOne('select id,typename from dede_arctype where id='.$thisid);
  print_r($row);
  {/dede:php}
  这样是来调用当前栏目的标题,这个标签功能类似于{dede:field.typename/}
  写自己的标签,让别人说去吧
  DedeCMS从V5.3开始就支持自己扩展标签,不过许多新人很少用那个东西,今天我就来简单的介绍下如何编写自己的调用标签。
  我们需要知道下扩展标签的存放目录及文件名构成,首先,扩展的标签都是存放在/include/taglib这个目录,名称都是以“标签名.lib.php”格式,例如{dede:channel/}标签对应的是channel.lib.php文件。
  我们可以看一个示例标签:demotag.lib.php
  
  if(!defined('DEDEINC'))
  {
  exit("Request Error!");
  }
  function lib_demotag(&$ctag,&$refObj)
  {
  global $dsql,$envs;
  //属性处理
  $attlist="row|12,titlelen|24";
  FillAttsDefault($ctag->CAttribute->Items,$attlist);
  extract($ctag->CAttribute->Items, EXTR_SKIP);
  $revalue = '';
  //你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue
  //------------------------------------------------------
  $revalue = 'Hello Word!';
  //------------------------------------------------------
  return $revalue;
  }
  ?>
  我们登录系统后台的[模板]-[全局标签测试]中运行{dede:demotag/},显示如下的结果:

  这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数return $revalue;中的$revalue需要是经过处理后生成的字符串。
  $attlist="row|12,titlelen|24";这个是属性列表,这个经过函数处理后会直接生成变量并复制,我们可以测试下,做如下的修改:
  $revalue = 'Hello Word!';
  $revalue .="
Row:".$row.";TitleLen:".$titlelen;

  这样我们可以看到,这个属性已经被创建变量并且赋值了。
  接下来我们可以再进一步去修改这个标签。
  比如说我们需要写一个标签专门来查询文章内容页的那个相关文章,功能类似于上面sql标签中的那个sql,只是这里我们将其分装为一个标签。
  我们可以新建一个标签,例如叫writerarc,那我们就需要创建一个writerarc.lib.php,然后模仿demotag编写函数,注意需要修改为
  function lib_writerarc(&$ctag,&$refObj)
  接下来我们就可以编写查询语句及对底层模板处理的相关函数了
  $revalue = '';
  $innertext = $ctag->GetInnerText();
  $ctp = new DedeTagParse();
  $ctp->SetNameSpace('field', '[', ']');
  $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row";
  $innertext这个是用来获取标签的底层模板的,$ctp创建用于处理底层模板中的变量,并处理进行替换。我们根据获取的属性编写我们的sql语句,这里我们使用limit 0, $row,这样就可以根据$row来确定查询的内容数目。
  当然我们可以获取更多的属性以便我们这个标签更强大,例如我们可以增加类似于arclist中的相关属性,并在函数中进行处理,不过这个需要有一定的PHP基础。
  接下来我们通过执行查询对sql及输出变量进行处理:
  $dsql->Execute('me',$sql);
  while($rs = $dsql->GetArray('me'))
  {
  //根据属性处理查询变量
  $rs['title'] = cn_substr($rs['title'], $titlelen);
  //获取底层模板
  $ctp->LoadSource($innertext);
  foreach($ctp->CTags as $tagid=>$ctag) {
  if(!empty($rs[strtolower($ctag->GetName())])) {
  $ctp->Assign($tagid,$rs[$ctag->GetName()]);
  }
  }
  //根据底层模板及查询变量得到处理结果
  $revalue .= $ctp->GetResult();
  }
  这样我们就将查询出来的结果同底层模板中出现的相关变量进行替换,然后生成输出字符串,将所有的字符串信息存储到$revalue中。
  最后返回这个值return $revalue;
  整个文件内容如下:
  
  if(!defined('DEDEINC'))
  {
  exit("Request Error!");
  }
  function lib_writerarc(&$ctag,&$refObj)
  {
  global $dsql,$envs;
  //属性处理
  $attlist="row|12,titlelen|24";
  FillAttsDefault($ctag->CAttribute->Items,$attlist);
  extract($ctag->CAttribute->Items, EXTR_SKIP);
  $revalue = '';
  $innertext = $ctag->GetInnerText();
  $ctp = new DedeTagParse();
  $ctp->SetNameSpace('field', '[', ']');
  $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row";
  $dsql->Execute('me',$sql);
  while($rs = $dsql->GetArray('me'))
  {
  //根据属性处理查询变量
  $rs['title'] = cn_substr($rs['title'], $titlelen);
  //获取底层模板
  $ctp->LoadSource($innertext);
  foreach($ctp->CTags as $tagid=>$ctag) {
  if(!empty($rs[strtolower($ctag->GetName())])) {
  $ctp->Assign($tagid,$rs[$ctag->GetName()]);
  }
  }
  //根据底层模板及查询变量得到处理结果
  $revalue .= $ctp->GetResult();
  }
  return $revalue;
  }
  ?>
  接下来我们来测试我们这个标签,我们修改article_article.htm模板,在里面加入以下的标签代码:
  {dede:writerarc row='10' titlelen='6'}
  [field:title/]
  {/dede:writerarc}
  通过动态浏览页面进行查看调试http://www.dedecms.com/plus/view.php?aid=3,我们会发现标签起作用了,输出了我们的内容。

  至此我们完成了标签的编写,这里面主要涉及到PHP、MySQL的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。

{dede:sql}标签的用法的更多相关文章

  1. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  2. DEDE SQL标签可以获取文档静态链接地址

    在DedeCMS的系统里面,我可以通过由使用SQL语句来配合织梦标签进行更多的个性化调用.比如:推荐会员.推荐企业等.但是我们发现文档链接的底层模板地址的是动态的,那么我们要如何来进行转换,让他链接到 ...

  3. DEDE用{dede:sql}标签取出当前文档的附加表中的内容

    最近在用DEDE做项目,遇到一个需求是要在article_image.htm模板中直接取出附加表addonimages中的某一记录的imgurls字段的内容.而这条记录是不断变化的,比如我点击了< ...

  4. MyBatis中关于SQL标签的用法(重用SQL 代码段)

    一. 没用sql标签前的SQL映射代码: <select id="findById" resultType="cn.tedu.mybatis.entity.User ...

  5. mybatis动态SQL标签的用法

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...

  6. DEDECMS万能标签{dede:sql}使用教程详解

    http://www.dede58.com/a/dedebq/2015/0226/1737.html 1.首页在后台单页文档管理里添加一个单页文档,内容编辑框输入你要的内容生成. 2.在需要调用单页文 ...

  7. 织梦SQL标签的使用

    (>=DedeCMS 3,DedeCMS 4,DedeCMS 5) 名称:sql 功能:用于获取MySQL数据库内容的标签 语法: 1 2 3 {dede:sql sql='' appname= ...

  8. dedecms {dede:php}标签用法介绍

    最简单的输入如 代码如下 复制代码 {dede:php} $numA = 1; $numB = 2; echo $numA + $numB; {/dede:php} 从上面语句可以看出dede:php ...

  9. [刘阳Java]_MyBatis_动态SQL标签用法_第7讲

    1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwi ...

随机推荐

  1. 39、apk瘦身(转载)

    本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用 ...

  2. IOS开发学习笔记006 - 指针

    C语言 指针 简单使用如下: int *p;//定义 int a = 10; p = &a;//赋值 int * b = &a;//定义并赋值 定义格式:类型 *指针变量名: 注意事项 ...

  3. day02_04.算算多少人

    第四题 算算有多少人? 第二题的升级版,看看你能不能做出来 利用你的编程思想去看这道题目,记住不要放过题目的每一个小细节 题目:操场上100多人排队,3人一组多1人,4个一组多2人,5人一组多3人,共 ...

  4. LeetCode 62 不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角.问总共有多少条不同的路径? 示例 1: 输入: ...

  5. Linux下测试SSD固态硬盘写入速度

    最近买了一个256GB的SSD固态硬盘,想测试一下写入速度,于是如下操作. 部分代码: gettimeofday(&start, NULL); int fd = open("test ...

  6. 2018浙江省赛(ACM) The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

    我是铁牌选手 这次比赛非常得爆炸,可以说体验极差,是这辈子自己最脑残的事情之一. 天时,地利,人和一样没有,而且自己早早地就想好了甩锅的套路. 按理说不开K就不会这么惨了啊,而且自己也是毒,不知道段错 ...

  7. Vue2.0 - 自定义指令 vue-directive

    Vue.directive('指令',function(el,binding,vnode){ el.style='color:'+binding.value;}); el : 指令所绑定的元素,可以用 ...

  8. Hall 定理

    Hall 定理 是匈牙利算法的基础 大意是说,对于一个二分图 左边的集合记为X,右边的集合记为Y 存在完美匹配,(即匹配数目=min(|X|,|Y|))的充分必要条件是 对于任意一个X的子集,设大小为 ...

  9. BZOJ 3150 [Ctsc2013]猴子 ——期望DP 高斯消元

    一堆牌的期望等于每张牌的期望值和. 考虑三个人的游戏即可得到. 然后每张牌遇到另外一张的概率相同,然后就可以列方程求解了. #include <cmath> #include <cs ...

  10. 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】

    题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...