织梦仿站首页列表页文章带图标(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"/}

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线