加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > CMS系统 > Dedecms > 正文

DedeCMS织梦{dede:sql}数据库标签实现分页

发布时间:2020-12-14 04:08:57 所属栏目:Dedecms 来源:网络整理
导读:由站长 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。 近研究了一下织梦 CMS 系统,看到一篇关于 sql 标签调用数据列表如何翻页的文章,感觉不错,贴出来大家分享一下。相信很多使用 dedecms 的朋友在网上查

以下代码由PHP站长网 52php.cn收集自互联网现在PHP站长网小编把它分享给大家,仅供参考

近研究了一下织梦 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"," 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")

)

);

}

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

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,

$ctag->GetAtt("sql"),

$InnerText

)

);

}

//end

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

/**

?* 通过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

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

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

<li><a href="[field:ID /].html">[field:post_title /]</a></li>

{/dede:listsql}

<!--分页-->

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

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

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读