相信很多使用织梦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′}的标签来使用。

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

找到:

View Code PHP

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

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

View Code PHP

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

然后找到:

View Code PHP

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”)));}

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

View Code PHP

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参数获取指定数据源的方法,代码如下:

View Code PHP

// 通过listsql标签中sql属性传入的参数来获得一个单列的文档列表* */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

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

View Code HTML

{dede:listsql sql=’select ID,post_title from wp_posts’ pagesize=’10′}

[field:post_title /]{/dede:listsql}{dede:pagelist listsize=’2′ listitem=’index pre pageno next end ‘/}

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

该文章仅能供对php程序有所有解的服务学习 一下 看起来很乱 。

(责任编辑:最模板)

dede 模板 php sql,dedecms模板中使用{dede:sql=””}实现分页功能详解相关推荐

  1. android系统中sd卡各文件夹功能详解 guessword,AndroidStudio LiveTemplate函数说明

    1.annotated() 返回类.方法.属性的注解 例如:annotated("java.lang.Deprecated"),返回@Deprecated注解 2.arrayVar ...

  2. htc android sd卡,【HTC T328W】Android系统中SD卡各文件夹功能详解

    希望你的补充说明,让我们一起来清理内存卡吧注意,软件没有卸载前,不建议删除其文件荚!1..android_secure       是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了,小 ...

  3. VS 中 TFS 的工作项查询功能详解

    在团队开发中,一般都要使用一些工具来追踪项目开发进度.在 VS 中可以使用 TFS 的工作项来追踪项目开发进度.下面介绍一下使用 TFS 如何进行工作项的查询. 环境: VS 2017 + TFS 2 ...

  4. Android系统中SD卡各文件夹功能详解

    1..android_secure  是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了. 2..Bluetooth  顾名思 义,用蓝牙之后就会有这个. 3..mobo  顾名思 义, ...

  5. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...

  6. colsure php_PHP_PHP中Closure类的使用方法及详解,Closure,匿名函数,又称为Anonym - phpStudy...

    PHP中Closure类的使用方法及详解 Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函 ...

  7. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  8. props传递对象_vue组件中使用props传递数据的实例详解

    在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的. 一.基本用法 组件不仅仅是 ...

  9. mysql如何限制数据修改密码_MySQL_MySQL数据库中修改密码及访问限制设置详解,MySQL是一个真正的多用户、多 - phpStudy...

    MySQL数据库中修改密码及访问限制设置详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序 ...

最新文章

  1. Redis 通用操作1
  2. 动态树形列表基本原理演示
  3. 哪个厂家的监控平台用的云服务器_哪个品牌的云服务器最好用?
  4. POJ1258最小生成树简单题
  5. 他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他
  6. (鬼刀)记一次异步加载Python爬虫分析
  7. 批量word转pdf
  8. 将CentOS的yum源更换成阿里源
  9. 转行成为数据分析师的经验分享
  10. 港股历史行情数据 API 接口
  11. API接口名称(item_search - 按关键字搜索淘宝商品)[item_search,item_get,item_search_shop等]
  12. 彼得林奇——如何看待股市大跌
  13. web前端学习之——页面美妆师css3基础篇
  14. 根据某一列拆分Excel为多个表格
  15. js实现动态星空背景
  16. R语言开发之我想要使用R语言进行开发的原因
  17. python webkit内核_360浏览器使用meta标签强制使用指定webkit内核 - meta强制用极速模式...
  18. 知识图谱--实体关系抽取,依存句法分析
  19. python中花括号_震惊Python的精髓居然是方括号花括号和圆括号
  20. 推荐JSON-handle谷歌插件

热门文章

  1. linux httppost 请求接口参数被截断_记一次小程序图片安全接口和CountDownLatch的使用...
  2. android语法帮助手册_新 App 「捧读:日语语法学习与分析」的开发幕后思考
  3. python中等高线填充颜色_Python matplotlib等高线图对数颜色
  4. solr 查询字段唯一值_《Solr实战》之一
  5. 搜索文献_【大牛经验分享】如何高效快捷搜索文献?
  6. 华为云服务器密码修改,华为云鲲鹏云服务器安装MySQL 5.7.30
  7. 易语言 取dns服务器,易语言自动修改内网IP地址和DNS
  8. settimeout( )是全局函数吗_JS函数的执行
  9. 利用计算机程序解决问题的基本过程,第四章第一节编制计算机程序解决问题
  10. typeScript模块四