织梦dedecms v5.7使用sql标签实现静态分页-程序员宅基地

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

 

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

 

找到:

 

if(!is_object($ctag))

{

   $ctag = $this->dtp->GetTag("list");

}

 

 

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

 

//Add by Rainyin 2012-09-26

if(!is_object($ctag))

{

$ctag = $this->dtp->GetTag("listsql");

if (is_object($ctag))

{

$cquery = $ctag->GetAtt("sql");

$cquery = preg_replace("/SELECT(.*?)FROM/is", " SELECT count(*) as dd FROM ", $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")

)

);

}

 

 

 

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

 

//Add by Rainyin 2012-09-26

else if($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参数获取指定数据源的方法

 

代码如下:

 

//Add by Rainyin 2012-09-26

function GetSqlList($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->CTags as $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:listsql sql='select id,post_title from dede_feedback' pagesize='10'}

//

//

  • [field:username /][field:dtime function="MyDate('Y-m-d',@me)"/]

//

  • [field:msg /]

//

//{/dede:listsql}

//

//{dede:pagelist listsize='2' listitem='index pre pageno next end '/}

//

 

注:经过本人测试,以上解决方案适用于dedecms5.6和最新的dedecms v5.7版本。

 

支持跨数据库调用,例:

//

 

// 

//    {dede:listsql sql='select * from ecshop.ecs_comment order by add_time desc' pagesize='10'}

//   

  • [field:user_name/]:[field:title/]

//        [field:content/]...

//        [field:add_time function="MyDate('Y-m-d',@me)"/]

//   

//    {/dede:listsql}

// 

// 

// 

//    {dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="2"/}

// 

//

//

 

 

 

转载于:https://my.oschina.net/u/3660147/blog/1819054

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33895657/article/details/93717556

智能推荐

实战c++中的vector系列--使用vector构造二维数组-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏16次。二维数组有时候被用到,但是很少有人会使用vector来构造一个二维数组。首先,需要明确的是,在计算机的世界中,根本不存在二维数组,只是使用者的一个概念罢了。其实我们所谓的二维数组也必须是一段连续的内存。很多情况下,我们可以把常规的二维数组用一个vector表示,只要索引对应即可。那么,我若一意孤行呢,我就想vector里面放一个vector呢?#include #incl

【Spring学习笔记】11、AOP-程序员宅基地

文章浏览阅读65次。文章目录11.1、什么是AOP11.2、AOP在Spring中的作用11.3、使用Spring实现Aop11.1、什么是AOPAOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的 一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的

ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践-程序员宅基地

文章浏览阅读772次。解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头、正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现。此处手札 供后人参考~1.第一步 服务端设置响应头header('Access-Control-Allow-Origin:*'); //支持全域名访问,不安全,部署后需要固定限制为客户端网址

Java怎样实现验证码?_java 生成4位数字英文大小写验证码并生成图片-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏44次。我们总是在登录微信,QQ或者其他一些网页的时候,都会出现一个验证码框,他们有的是数字的,有的是文字的,有的是混合的,各种各样的。很好奇是怎么实现的。带着这样的疑问。1.随机数字字母组合的验证码首先创建一个javaWeb的工程然后在之前创建的随机数方法里,进行循环答应,输出4个随机数..._java 生成4位数字英文大小写验证码并生成图片

【arduino】玩具蓝牙小车_arduino蓝牙小车-程序员宅基地

文章浏览阅读1.3k次,点赞4次,收藏24次。将串联好的锂电池正负极接到L298N的12v供电端和GND,再从GND和5v供电接arduino uno的GND和Vin端口再将L298N输出A.B接两组电机。然后将L298N的IN1.IN2.IN3.IN4依次接到arduino uno的5.4.3.2的端口,再用一个纸板将他们固定(可以买小车板来固定)。用两节3.7v的锂电池串联就可以驱动。然后hc-05模块的vcc接arduino的5v,GND接GND,RX接arduino的TX(1),TX接arduino的RX(0)。调试方法可以问购买商家调试好。_arduino蓝牙小车

AI算法测试之浅谈_ai测试-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏25次。大家来做下这个猜数字游戏,1, 4, 16…()… 256… 括号里的是什么。为什么是64,不是其他数字,又为什么是数字,不是一个汉字或者一个字母。我们找到了数字之间的规律,逻辑关系,并且抽象成了模型,我们才能知道括号里是什么。举个生活中的例子,小米硬件中手机外壳,在大批量生产前需要先设计手机外壳的模具,然后所有同型号的手机外壳都按这个模具样版生产出来。这个模具也是个硬件上的模型。算法的模型又是什么?模型是从数据里抽象出来的,用来描述客观世界的数学模型。_ai测试

随便推点

cocos creator 十三水棋牌_福州十三水源码下载-程序员宅基地

文章浏览阅读4.4k次。下载地址:https://download.csdn.net/download/u012443049/10556049_福州十三水源码下载

毕业设计django旅游管理系统-程序员宅基地

文章浏览阅读744次,点赞19次,收藏16次。经过4个月的努力,在学习了Django编程和数据库,对其有一定了解的情况下,完成了旅游管理系统的设计与实现。本文主要讨论了前台各模块功能设计,工作原理,程序实现等问题。系统基本实现了旅游信息管理与查询、用户注册、评论等功能。同时,系统对用户进行了分级管理,提高了系统的安全性。通过这次毕业设计,让我感受了软件开发的整个过程。

java geoprocessor_Java GeoEvent.getField方法代碼示例-程序员宅基地

文章浏览阅读74次。本文整理匯總了Java中com.esri.ges.core.geoevent.GeoEvent.getField方法的典型用法代碼示例。如果您正苦於以下問題:Java GeoEvent.getField方法的具體用法?Java GeoEvent.getField怎麽用?Java GeoEvent.getField使用的例子?那麽恭喜您, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了..._update eta

Matlab 用矩阵画图-程序员宅基地

文章浏览阅读2.2k次,点赞15次,收藏26次。本文汇总了 Matlab 用矩阵画图的几种方式。

brew安装报错 “cp: utimes: /usr/local/Cellar/jemalloc/.: Operation not permitted cp: chmod: /usr/local/C”-程序员宅基地

文章浏览阅读1.4k次。cp: utimes: /usr/local/Cellar/jemalloc/.: Operation not permitted cp: chmod: /usr/local/Cellar/jemalloc/.: Operation not permitted解决办法:sudo chown -R $(whoami) /usr/local/Cellar

帆软css修改按钮立体,FineReport 控件的 CSS 样式-程序员宅基地

文章浏览阅读1.4k次。设置控件的 CSS 样式可以在「模板 Web 属性」中引用 CSS 实现,也可以在「模板 Web 属性」中添加事件实现,据此给出如下两个示例。3.1 修改文本框边框颜色和字体希望参数面板上文本框控件的边框变为红色,字体颜色变为蓝色。如下图所示:3.1.1 准备模板1)新建模板,添加一个模板参数 p1。2)将参数添加到参数面板中,并设置为文本框控件,参数默认值是地区。最终模板如下图所示:3.1.2 ..._帆软button样式