织梦仿站首页列表页文章带图标(dede列表页调用会员信息并实现啰嗦问题啰嗦搞定! )
优采云 发布时间: 2022-02-01 13:35织梦仿站首页列表页文章带图标(dede列表页调用会员信息并实现啰嗦问题啰嗦搞定!
)
dede列表页面使用{dede:listsql}调用数据并实现分页:
一、应用:
1、在列表页面调用会员信息
2、任何需要分页的地方
二、问题描述:
2015.3.20日,我使用织梦仿网站创建模板时,由于使用了织梦会员系统,对应的信息注册会员应列在列表页面上。出来实现分页。下图是调用列表页面上的所有【供应商】成员:
{dede:list}可以配合{dede:pagelist}实现分页,但只适合调用普通的文章,调用成员{dede:list}无能为力;
{dede:datalist} 只在会员空间模板中使用过,{dede:memberinfos} 和 {dede:memberlist} 只能调用部分会员信息。
{dede:sql sql='..'}虽然无所不能,可以调用任何数据,但还是不能实现分页!
最后在网上找了很多资料,整理并纠正了一位写得很好的网友的文章,终于解决了列表页调用会员信息,实现分页的问题!
三、让我们谈谈这个想法
在网上寻找带dede:sql标签的分页解决方案一直不理想,尤其是列表页使用dede:sql调用外部数据的时候。
所谓调用外部数据是指只是在后台创建一个空列,然后在对应的列表模板文件中使用dede:sql指定一个自定义的数据源(数据表)。数据源与列本身没有逻辑关系。目的是为了让织梦帮助我们从数据源生成静态文件,按照它的规则显示。
我也查了很多资料,网上的答案都不完善。有的直接执行模板文件中的php代码实现分页。显然,这种方法不能生成静态文件。有的直接在sql中指定limit参数,但无法实现。智能分页,织梦官方没有给出具体解决方案,我在dede论坛看到织梦核心人物天涯给出了使用free list方式的回复,显然free list不能指定外部数据源.
最后,我看了一个专家的博客,写的差不多了。列表页可以dede:sql调用数据,但不能分页。忍不住从头到尾读了一遍代码,稍微测试了一下。,终于查到了这位高手的代码问题出现在哪里。最终完成 dede:sql 分页需要 4-5 个小时。
思路:要实现dede:sql分页,首先想到的思路就是改造dede:list标签。熟悉dede的朋友应该都知道,这个列表页面的特殊标签的工作原理大致是先通过列变量id获取对应的数据源,然后渲染到页面,那么我们就可以让它不仅通过列变量id还要通过指定的sql语句来获取数据源,比如我们可以嵌入一个类似于{dede:listsql sql='select * from dede_feedback 'pagesize='10'}的标签来使用。
{dede:list}标签是在/include/arc.listview.class.php中定义的,所以我们接下来需要修改它,以便我们可以使用{dede:list}和{dede:pagelist}进行分页,你也可以使用 {dede:listsql sql='select * from dede_feedback' pagesize='10'} 和 {dede:pagelist} 进行分页。
注意:以下修改对 织梦v5.7 sp1 GBK 版本有效,但尚未针对 v5.7 之前的版本进行测试。
OK,思路已经有了,开始我们的分页修改,打开/include/arc.listview.class.php
四、正式开始
如果要获取修改后的arc.listview.class.php文件,请直接从百度云盘下载,下载后修改文件名: 密码:wmwe
打开 /include/arc.listview.class.php
第一步,找到240-243行之间的代码:
if(!is_object($ctag))
{
$ctag = $this->dtp->GetTag("list");
}
在后面添加以下代码
if(!is_object($ctag))
{
$ctag = $this->dtp->GetTag("listsql");
}
第二步,找到211-223行之间的代码:
if($this->TotalResult==-1)
{
$cquery = "SELECT COUNT(*) AS dd FROM `#@__arctiny` arc WHERE ".$this->addSql;
$row = $this->dsql->GetOne($cquery);
if(is_array($row))
{
$this->TotalResult = $row['dd'];
}
else
{
$this->TotalResult = 0;
}
}
将上面的代码修改如下:
if($this->TotalResult==-1)
{
if( $Flag != '')
{
$flagsql = '';
//自定义属性条件 flag 查询时加入查询条件中,否则影响分页
$flags = explode(',', $Flag);
for($i=0; isset($flags[$i]); $i++) $flagsql .= " AND FIND_IN_SET('{$flags[$i]}',flag)>0 ";
$cquery = "SELECT COUNT(*) AS dd FROM `#@__arctiny` arc left join `#@__archives` arc2 on arc.id=arc2.id WHERE ".$this->addSql .$flagsql;
}
//Add by ShgHnn 2020-07-17
else if(is_object($this->dtp->GetTag("listsql")))
{
$cquery = $ctag->GetAtt("sql");
$cquery = preg_replace("/SELECT(.*?)FROM/is", " SELECT count(*) as dd FROM ", $cquery);
$cquery = preg_replace("/ORDER(.*?)SC/is", "", $cquery);
}
else if(is_object($this->dtp->GetTag("list")))
{
$cquery = "SELECT COUNT(*) AS dd FROM `#@__arctiny` arc WHERE ".$this->addSql;
}
//end
$row = $this->dsql->GetOne($cquery);
if(is_array($row))
{
$this->TotalResult = $row['dd'];
}
else
{
$this->TotalResult = 0;
}
}
第三步,找到大约593-622行之间的代码:
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 ShgHnn 2020-07-17
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
第 4 步,找到第 692-938 行之间的代码:
找到方法函数GetArcList,在该方法后面添加一个方法函数GetSqlList,可以通过传入sql参数来获取指定的数据源。
代码显示如下:
//Add by ShgHnn 2020-07-17
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} 从数据表中调用数据,如最初的想法所述,
分页标签仍然使用原创的 {dede:pagelist}。
调用示例:
{dede:listsql sql='select mc.*,mt.* ,mb.* from (dede_member_company3 mc left join dede_member_tj mt on mt.mid=mc.mid) left join dede_member mb on mb.mid=mt.mid ' pagesize='10'}
公司名称: [field:companyname/]
企业图:[field:picname/]
{/dede:listsql}
分页代码:
{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}