dedecms 织梦 dede:sql 标签 实现分页功能 (实践证明在5.7也能用)

时间: 2012-11-30 / 分类: dedecms / 浏览次数: 5,958 views / 0个评论 发表评论

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

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

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=’select ID,post_title from wp_posts’ pagesize=’10’} <li><a href=”http://gump.me/[field:ID /].html”>[field:post_title /]</a></li> {/dede:listsql} <!–分页–> {dede:pagelist listsize=’2′ listitem=’index pre pageno next end ‘/}

 

实践证明,在DEDE5.7也是可以用的

我是在弄站的时候,一直想能在留言板也用上标签,思路是把留言板当成一个栏目来处理

先经过上面的修改,再引入下面的东西

//小货修改 引入模板解释的东西
require_once (dirname(__FILE__) . “/include/common.inc.php”);
require_once DEDEINC.”/arc.listview.class.php”;

然后设置标题

if($title==”) $title = ‘在线留言’;

用列表页的模板解释语句替换原来的

$pv =new ListView($tid);//作为一个列表进行处理
$pv->Fields[‘title’] =$title;//标题赋值
$pv->TypeLink->TypeInfos[‘ispart’]=0;//不是封面,只是列表
$pv->TypeLink->TypeInfos[‘templist’]=$cfg_df_style .”/guestbook.htm”;//设置列表模板
$pv->Display();//处理吧
exit();

 

发表评论

你必须 登录后 才能留言!