织梦模板用{dede:sql}标签如何实现分页的示例代码


近研究了一下织梦CMS系统,看到一篇关于sql标签调用数据列表如何翻页的文章,感觉不错,贴出来大家分享一下。相信很多使用dedecms的朋友在网上查找关于dede:sql标签进行分页的解决方案时都不尽如人意,尤其是在列表页使用dede:sql调用外部数据(所谓调用外部数据就是指在后台只是创建个空栏目,然后对应的列表模板文件中使用dede:sql指定自定义的数据源,数据源与该栏目本身是没有逻辑关系的,目的是为了让织梦能按照它的规则来帮我们将数据源生成静态文件予以展示)时,我本人也搜索了很多资料,网上的答案都不够完美,有的是直接在模板文件中执行php代码来实现分页,显然此方法无法生成静态文件,有的直接在sql里面指定limit参数,但又无法实现智能分页,织梦官方也没有给出具体的解决方案,在dede论坛有看到织梦核心人物天涯给出的回复是采用自由列表的方法,显然自由列表无法指定外部数据源,最后实在没办法只能自己动手了,首先想到的思路是将dede:list标签进行改造了,熟悉dede的朋友应该知道这个列表页专用标签的工作原理大致是先通过栏目变量id获取到对应的数据源再呈现到页面上来,那么我们就可以让它不仅仅通过栏目变量id还可以通过指定的sql语句来获取数据源了,比如我们可以另外嵌入一个类似{dede:listsql sql='select * from wp_posts' pagesize='10'}的标签来使用。

OK,思路已经有了,接下来我们打开include/arc.listview.class.php这个文件来给它动个小手术吧!

找到:

if(!is_object($ctag)){$ctag=$this->dtp->GetTag("list");}

这一段,在其后添加如下代码:

if(!is_object($ctag)){$ctag=$this->dtp->GetTag("listsql");if(is_object($ctag)){$cquery=$ctag->GetAtt("sql");$cquery=preg_replace("/SELECT(.*?)FROM/is","SELECTcount(*)asddFROM",$cquery);$cquery=preg_replace("/ORDER(.*?)SC/is","",$cquery);$row=$this->dsql->GetOne($cquery);if(is_array($row)){$this->TotalResult=$row['dd'];}else{$this->TotalResult=0;}}}//end

然后找到:

if($ctag->GetName()=="list"){$limitstart=($this->PageNo-1)*$this->PageSize;$row=$this->PageSize;if(trim($ctag->GetInnerText())==""){$InnerText=GetSysTemplets("list_fulllist.htm");}else{$InnerText=trim($ctag->GetInnerText());}$this->dtp->Assign($tagid,$this->GetArcList($limitstart,$row,$ctag->GetAtt("col"),$ctag->GetAtt("titlelen"),$ctag->GetAtt("infolen"),$ctag->GetAtt("imgwidth"),$ctag->GetAtt("imgheight"),$ctag->GetAtt("listtype"),$ctag->GetAtt("orderby"),$InnerText,$ctag->GetAtt("tablewidth"),$ismake,$ctag->GetAtt("orderway")));}

这一段,在其后添加如下代码:

elseif($ctag->GetName()=="listsql"){$limitstart=($this->PageNo-1)*$this->PageSize;$row=$this->PageSize;if(trim($ctag->GetInnerText())==""){$InnerText=GetSysTemplets("list_fulllist.htm");}else{$InnerText=trim($ctag->GetInnerText());}$this->dtp->Assign($tagid,$this->GetSqlList($limitstart,$row,$ctag->GetAtt("sql"),$InnerText));}//end

最后找到function GetArcList这个方法,在其后添加一个可以通过传入sql参数获取指定数据源的方法,代码如下:

/***通过listsql标签中sql属性传入的参数来获得一个单列的文档列表**/functionGetSqlList($limitstart=0,$row=10,$sql='',$innertext){global$cfg_list_son;$innertext=trim($innertext);if($innertext==''){$innertext=GetSysTemplets('list_fulllist.htm');}//处理SQL语句$limitStr="LIMIT{$limitstart},{$row}";$this->dsql->SetQuery($sql.$limitStr);$this->dsql->Execute('al');$t2=ExecTime();//echo$t2-$t1;$sqllist='';$this->dtp2->LoadSource($innertext);$GLOBALS['autoindex']=0;//获取字段while($row=$this->dsql->GetArray("al")){$GLOBALS['autoindex']++;if(is_array($this->dtp2->CTags)){foreach($this->dtp2->CTagsas$k=>$ctag){if($ctag->GetName()=='array'){//传递整个数组,在runphp模式中有特殊作用$this->dtp2->Assign($k,$row);}else{if(isset($row[$ctag->GetName()])){$this->dtp2->Assign($k,$row[$ctag->GetName()]);}else{$this->dtp2->Assign($k,'');}}}}$sqllist.=$this->dtp2->GetResult();}//while$t3=ExecTime();//echo($t3-$t2);$this->dsql->FreeResult('al');return$sqllist;}//end

总共就添加三段代码,每一段代码基本都参考它紧接着的上面那段原始代码,而无需改变它原来任何一个地方的代码,应该算是比较完美了,接下来在模板文件中的使用方法就跟一开始思路中所提到的那样,分页标签依旧沿用原来的,调用范例:

{dede:listsqlsql='selectID,post_titlefromwp_posts'pagesize='10'}[field:post_title/]{/dede:listsql}{dede:pagelistlistsize='2'listitem='indexprepagenonextend'/}

注:以上解决方案适用于dedecms5.6-5.7版本。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

黑客利用Log4Shell漏洞攻击比利时国防部

Security Affairs 网站披露,比利时国防部遭到了网络攻击,研究人员发现,威胁者似乎利用了Log4Shell漏洞。此次网络攻击于上周四被发现,但是国防部一直到今天才披露了这一情况。随后比利时国防部发言人称,黑客利用了Log4j软件中被爆出的Log4...
漏洞服务器安全Log4Shell黑客

2020年遭勒索型DDoS攻击的金融服务公司超100家

全世界的消费银行、证券交易所、支付服务公司和发卡机构均在受害者之列。2020年,多个国家超100家金融服务公司遭遇同一黑客团伙发起的一波勒索型分布式拒绝服务(DDoS)攻击。2月中旬的报告中,金融服务信息共享与分析中心(FS-ISAC)披露称:攻击有条不紊地横...
服务器安全网络安全DDos攻击网络攻击

云锁开启“抗CC攻击”后,网站访问一直跳转的解决方法

用户在开启了“抗CC攻击”中级后,访问网站会出现一直重复跳转并会显示提示信息的问题。出现这样的状况一般提示信息中的状况导致的。请确保浏览器没有禁止发送cookie的情况。IE:打开Internet选项,隐私项的高级设置,检查是否接受Cookie。Chrome:...
服务器安全云锁网站跳转抗CC攻击

常见的云安全错误认知以及应对方法!

随着多云及混合云趋势的发展,过去传统的云安全策略显然已不适应新的云环境。尽管,很多企业一直非常重视云安全问题,但其中很多风险点并没有得到实际解决。大多数企业依然在采用过去本地环境下的云安全措施,导致企业出现云安全策略不一致,应用风险和漏洞增加的状况!最严重的问...
服务器安全云安全