為企業提供網站平臺解決方案

178 7892 1916

QQ客服:點擊這里給我發消息 點擊這里給我發消息

最新動態:

DeDeCMS教程

你的位置:香港最准两码中特 > 建站知識 > DeDeCMS教程 > {dede:sql}標簽如何分頁

金多宝论坛两码中特:{dede:sql}標簽如何分頁

發布時間:2014-05-07 12:22作者:香港最准两码中特網址:香港最准两码中特瀏覽:次
近研究了一下織夢CMS系統,看到一篇關于sql標簽調用數據列表如何翻頁的文章,感覺不錯,貼出來大家分享一下。相信很多使用dedecms的朋友在網上查找關于dede:sql標簽進行分頁的解決方案時都不盡如人意,尤其是在列表頁使用dede:sql調用外部數據(所謂調用外部數據就是指在后
近研究了一下織夢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'}的標簽來使用。

香港最准两码中特 www.ycvod.icu 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

然后找到:

?[Copy to clipboard]View Code PHP   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

最后找到function GetArcList這個方法,在其后添加一個可以通過傳入sql參數獲取指定數據源的方法,代碼如下:

?[Copy to clipboard]View Code PHP //add by LeadTo 2011-12-31//www.leadto.com.cn/
 /**
  * 通過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

總共就添加三段代碼,每一段代碼基本都參考它緊接著的上面那段原始代碼,而無需改變它原來任何一個地方的代碼,應該算是比較完美的手術了,接下來在模板文件中的使用方法就跟一開始思路中所提到的那樣,分頁標簽依舊沿用原來的,調用范例:

?[Copy to clipboard]View Code HTML{dede:listsql sql='select ID,post_title from wp_posts' pagesize='10'}
<li><a href="//www.ycvod.icu/[field:ID /].html">[field:post_title /]</a></li>
{/dede:listsql}
<!--分頁-->
{dede:pagelist listsize='2' listitem='index pre pageno next end '/}

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

快三技巧大小单双 欢乐生肖开奖号码 双色球100期开门彩走势图表 七星彩投号技巧 北京pk10走势图计划 极速时时是否有假 龙虎游戏破解方法 押龙虎破解公式打法 通比牛牛平台手机版 麻将单机版 网上通比牛牛有假吗 足球比分90vs滚球 二八杠游戏安卓下载 二八杠有多少种生死门 乐翻二人麻将苹果版 免费彩金不限id