織夢俠
WWW.2L3.NET

織夢模板用{dede:sql}標簽如何實現分頁

文章來自:織夢俠 本文鏈接:http://www.xtjinzuan.com/zqzb/929.html
近研究了一下織夢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(&qu
織夢俠 www.xtjinzuan.com 織夢dedecms教程
ot;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
 
最后找到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版本。
轉載請注明文章來自織夢俠[秩名]作者的-織夢模板用{dede:sql}標簽如何實現分頁
聯系作者
取消
這個作者很懶什么也沒留下!
打賞作者
取消

本文作者無償奉獻,就打賞給我們織夢俠吧!

掃碼支付
掃碼打賞,建議金額1-10元

打開支付寶掃一掃,即可進行掃碼打賞哦

提醒:打賞金額將直接進入對方賬號,無法退款,請您謹慎操作。

蜗牛扑克