"景先生毕设|www.jxszl.com

实现{dedesql=""}分页教程

2022-10-29 16:23编辑: www.jxszl.com景先生毕设
相信很多使用dedecms的朋友在网上查找关于dede:sql标签进行分页的解决方案时都不尽如人意,尤其是在列表页使用dede:sql调用外部数据(所谓调用外部数据就是指在后台只是创建个空栏目,然后对应的列表模板文件中使用dede:sql指定自定义的数据源,数据源与该栏目本身是没有逻辑关系的,目的是

 更多精彩就在: 51免费论文网|www.jxszl.com 
为了让织梦能按照它的规则来帮我们将数据源生成静态文件予以展示)时,我本人也搜索了很多资料,网上的答案都不够完美,有的是直接在模板文件中执行php代码来实现分页,显然此方法无法生成静态文件,有的直接在sql里面指定limit参数,但又无法实现智能分页,织梦官方也没有给出具体的解决方案,在dede论坛有看到织梦核心人物天涯给出的回复是采用自由列表的方法,显然自由列表无法指定外部数据源,最后实在没办法只能自己动手了,首先想到的思路是将dede:list标签进行改造了,熟悉dede的朋友应该知道这个列表页专用标签的工作原理大致是先通过栏目变量id获取到对应的数据源再呈现到页面上来,那么我们就可以让它不仅仅通过栏目变量id还可以通过指定的sql语句来获取数据源了,比如我们可以另外嵌入I.个类似{dede:listsqlsql=’select*fromwp_posts’pagesize=’I.0′}的标签来使用.
思路已经有了,接下来我们打开include/arc.listview.class.php这个文件来给它动个小手术吧!
找到:
ViewCodePHP
if(!is_object($ctag)){$ctag=$this->dtp->GetTag("list");}
这I.段,在其后添加如下代码:
ViewCodePHP
//addbyGumpII0I.I.-I.II-IIII.http://Vloveb.com/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
然后找到:
ViewCodePHP
if($ctag->GetName()=="list"){$limitstart=($this->PageNo-I.)*$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")));}
这I.段,在其后添加如下代码:
ViewCodePHP
//addbyGumpII0I.I.-I.II-IIII.http://Vloveb.com/elseif($ctag->GetName()=="listsql"){$limitstart=($this->PageNo-I.)*$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
最后找到functionGetArcList这个方法,在其后添加I.个可以通过传入sql参数获取指定数据源的方法,代码如下:
ViewCodePHP
//addbyGumpII0I.I.-I.II-IIII.http://Vloveb.com//***通过listsql标签中sql属性传入的参数来获得I.个单列的文档列表**/functionGetSqlList($limitstart=0,$row=I.0,$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);$tII=ExecTime();//echo$tII-$tI.;$sqllist=;$this->dtpII->LoadSource($innertext);$GLOBALS[autoindex]=0;//获取字段while($row=$this->dsql->GetArray("al")){$GLOBALS[autoindex]++;if(is_array($this->dtpII->CTags)){foreach($this->dtpII->CTagsas$k=>$ctag){if($ctag->GetName()==array){//传递整个数组,在runphp模式中有特殊作用$this->dtpII->Assign($k,$row);}else{if(isset($row[$ctag->GetName()])){$this->dtpII->Assign($k,$row[$ctag->GetName()]);}else{$this->dtpII->Assign($k,);}}}}$sqllist.=$this->dtpII->GetResult();}//while$tIII=ExecTime();//echo($tIII-$tII);$this->dsql->FreeResult(al);return$sqllist;}//end
总共就添加III段代码,每I.段代码基本都参考它紧接着的上面那段原始代码,而无需改变它原来任何I.个地方的代码,应该算是比较完美的手术了,接下来在模板文件中的使用方法就跟I.开始思路中所提到的那样,分页标签依旧沿用原来的,调用范例:
ViewCodeHTML

{dede:listsqlsql=selectID,post_titlefromwp_postspagesize=I.0}
  • [field:post_title/]
  • {/dede:listsql}{dede:pagelistlistsize=IIlistitem=indexprepagenonextend/}


    原文链接:http://www.jxszl.com/biancheng/dedecms/74692.html