设为首页 收藏本站
查看: 437|回复: 0

[经验分享] dedecms{dede:sql}{dede:php}标签的用法

[复制链接]

尚未签到

发表于 2017-4-8 07:28:41 | 显示全部楼层 |阅读模式
  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的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361681-1-1.html 上篇帖子: php 获取当月的阴历值,PHP计算节日、节气、农阳历互换的代码 下篇帖子: 深入解析PHP中的(伪)多线程与多进程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表