1. <dd id="txo4f"><noscript id="txo4f"></noscript></dd>

      經典案例
      • 杭州百度:祝賀杭州小麥互動科技有限公司簽約百度推廣
      • 杭州百度:祝賀杭州尖銳軟件有限公司簽約百度推廣
      • 杭州百度:祝賀杭州藍辰科技有限公司簽約百度推廣
      • 杭州百度:祝賀臨安臨農憶衢農家樂簽約百度推廣
      • 杭州百度:祝賀易虎物流有限公司簽約百度推廣
      • 杭州百度:千年舟新材銷售有限公司合作百度推廣
      • 杭州百度:杭州澤佳文化創意有限公司簽約百度推廣
      • 杭州百度:祝賀杭州翹楚網絡科技有限公司合作百度推廣
      • 杭州百度:祝賀明音水景噴泉合作百度推廣

      織夢使用SQL標簽實現靜態分頁,適合自定義表單調用的分頁

      發布于:2014-11-01 10:19來源:浙江首傳 作者:杭州百度 點擊:

          杭州首屏科技有限公司—( 原浙江首傳)自2012年全面負責百度在杭州地區的百度推廣業務 2004年國內最大的互聯網公司————百度,授權杭州首屏科技有限公司百度杭州總代理、百度杭州客戶服務中心。詳情請咨詢:183-5725-5955 


      織夢使用SQL標簽實現靜態分頁,在自定義表單調用的分頁用他就很方便,此修改在dedecms5.6和最新的dedecms v5.7版本都適用。
      關于dede:sql標簽進行分頁的解決方案在網上其實很少,在列表頁使用dede:sql調用外部數據(所謂調用外部數據就是指在后臺只是創建個空欄目,然后對應的列表模板文件中使用dede:sql指定自定義的數據源,數據源與該欄目本身是沒有邏輯關系的,目的是為了讓織夢能按照它的規則來幫我們將數據源生成靜態文件予以展示)
       
      我們這里的思路就是:將dede:list標簽進行改造了,熟悉dede的朋友應該知道這個列表頁專用標簽的工作原理大致是先通過欄目變量id獲取到對應的數據源再呈現到頁面上來,那么我們就可以讓它不僅僅通過欄目變量id還可以通過指定的sql語句來獲取數據源了,比如我們可以另外嵌入一個類似{dede:listsql sql='select * from dede_feedback' pagesize='10'}的標簽來使用。
       
      OK,我們已成功案例,這里寫出來給大家,很簡單,照著一步步來:
      打開include/arc.listview.class.php這個文件
      找到:
       
      if(!is_object($ctag))
      {
         $ctag = $this->dtp->GetTag("list");
      }
       
       
      這一段,在其后添加如下代碼:
       
      //Add by ie79 2013-01-25
      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("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 ie79 2013-01-25
      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參數獲取指定數據源的方法
       
      代碼如下:
       
      //Add by ie79 2013-01-25
      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 dede_feedback' pagesize='10'}
      //
      //
      [field:username /][field:dtime function="MyDate('Y-m-d',@me)"/]
      //
      [field:msg /]
      //
      //{/dede:listsql}
      //
      //{dede:pagelist listsize='2' listitem='index pre pageno next end '/}
      //
       
      注:經過本人測試,以上解決方案適用于dedecms5.6和最新的dedecms v5.7版本。
       
      支持跨數據庫調用,例:
      //
      //
      // 
      // 
      //    {dede:listsql sql='select * from ecshop.ecs_comment order by add_time desc' pagesize='10'}
      //   
      [field:user_name/]:[field:title/]
      //        [field:content/]...
      //        [field:add_time function="MyDate('Y-m-d',@me)"/]
      //   
      //    {/dede:listsql}
      // 
      // 
      // 
      //    {dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="2"/}

      tag標簽:
      ------分隔線----------------------------
      ------分隔線----------------------------