织梦dede:sql标签根据动态变量查询以及分页显示

 成都seo   2018-08-02 14:34   1063 人阅读  0 条评论
摘要:

  我们在使用织梦CMS系统是,会经常用到sql标签调用数据。在使用sql标签调用数据时会经常遇到要根据页面动态变量调取数据的情况,并且遇到调取数据列表太多也需要静下分页显示。笔者本人也搜索了很多资料,网上的答案都不够完美,有的是直接在模板文件中执行php代码来实现分页,显然此方法无法生成静态文件,有的直接在sql里面指定limit参数,但又无法实现智能分页,织梦官方也没有给出具体的解决方案。青岛做网站就自己动手对该标签进行了一下二次开发,今天就跟大家分享一下解决方法。第一:如何实现织

  我们在使用织梦CMS系统是,会经常用到sql标签调用数据。在使用sql标签调用数据时会经常遇到要根据页面动态变量调取数据的情况,并且遇到调取数据列表太多也需要静下分页显示。笔者本人也搜索了很多资料,网上的答案都不够完美,有的是直接在模板文件中执行php代码来实现分页,显然此方法无法生成静态文件,有的直接在sql里面指定limit参数,但又无法实现智能分页,织梦官方也没有给出具体的解决方案。就自己动手对该标签进行了一下二次开发,今天就跟大家分享一下解决方法。


第一:如何实现织梦dede:sql标签实根据动态变量查询


比如在内容页,根据本文章的id或其它参数,调用其它的列表信息.

arc.id = ~id~’


上面的id就是本页面的动态变量,可以直接输入,用法示例,表示根据一个值,查询附加表中的信息.


{dede:sql sql=’Select arc.title,arc.litpic,addon.* from #@__archives arc left join #@__addon17 addon  on addon.aid = arc.id where arc.id = ~id~’}
<p><img src="[field:litpic/]" alt="[field:title/]" /></p>
<p ><span>网站建设公司 :</span> [field:title/]</p>
<p ><span>成立时间:</span> [field:starttime/]</p>
{/dede:sql}


第二:如何实现织梦dede:sql标签分页显示


1、打开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


2、然后找到:


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,
    $row,
    $ctag->GetAtt("sql"),
    $InnerText
    )
    );
   }
//end


3、最后找到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="http://www.iisya.com/[field:ID /].html">[field:post_title /]</a></li>
{/dede:listsql}
<!--分页-->
{dede:pagelist listsize=’2’ listitem=’index pre pageno next end ’/}


本文地址:http://www.iisya.com/Building/602.html
版权声明:本文为原创文章,版权归 略懂SEO博客 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?