1. 主頁 > 幫助中心 > 程序開發 >

        擴展標簽

        來源:織夢官方 作者:信息發布員 發表于:2009-09-29 09:58  點擊:
        DedeCMS 從 V5.3 開始就支持自己擴展標簽,不過許多新人很少用那個東西,簡單的介紹下如何編寫自己的調用標簽。 我們需要知道下擴展標簽的存放目錄及文件名構成,首先,擴展的標簽都是存放在 /include/taglib 這個目錄,名稱都是以 標簽名 .lib.php 格式,例

         

        DedeCMSV5.3開始就支持自己擴展標簽,不過許多新人很少用那個東西,簡單的介紹下如何編寫自己的調用標簽。
          我們需要知道下擴展標簽的存放目錄及文件名構成,首先,擴展的標簽都是存放在/include/taglib這個目錄,名稱都是以標簽名.lib.php”格式,例如{dede:channel/}標簽對應的是channel.lib.php文件。
          我們可以看一個示例標簽:demotag.lib.php
           
          if(!defined('DEDEINC'))
          {
          exit("Request Error!");
          }
          function lib_demotag(&$ctag,&$refObj)
          {
          global $dsql,$envs;
          //屬性處理
          $attlist="row|12,titlelen|24";
          FillAttsDefault($ctag->CAttribute->Items,$attlist);
          extract($ctag->CAttribute->Items, EXTR_SKIP);
          $revalue = '';
          //你需編寫的代碼,不能用echo之類語法,把最終返回值傳給$revalue
          //------------------------------------------------------
          $revalue = 'Hello Word!';
          //------------------------------------------------------
          return $revalue;
          }
          ?>
          我們登錄系統后臺的[模板]-[全局標簽測試]中運行{dede:demotag/},顯示如下的結果:
         
        ,我們會發現標簽起作用了,輸出了我們的內容。
         
          至此我們完成了標簽的編寫,這里面主要涉及到PHP、MySQL的很多知識,需要有一定相關方面的基礎才能夠編寫標簽了,當然這里只是一個簡單的標簽開發例子,還有許多的東西可以去開發。

          這里我們知道,其實標簽生成的內容其實是這個函數的一個返回值,這里返回的內容都是字符串,也就是函數return $revalue;中的$revalue需要是經過處理后生成的字符串。
          $attlist="row|12,titlelen|24";這個是屬性列表,這個經過函數處理后會直接生成變量并復制,我們可以測試下,做如下的修改:
          $revalue = 'Hello Word!';
          $revalue .="
        Row:".$row.";TitleLen:".$titlelen;


          這樣我們可以看到,這個屬性已經被創建變量并且賦值了。
          接下來我們可以再進一步去修改這個標簽。
          比如說我們需要寫一個標簽專門來查詢文章內容頁的那個相關文章,功能類似于上面sql標簽中的那個sql,只是這里我們將其分裝為一個標簽。
          我們可以新建一個標簽,例如叫writerarc,那我們就需要創建一個writerarc.lib.php,然后模仿demotag編寫函數,注意需要修改為
          function lib_writerarc(&$ctag,&$refObj)
          接下來我們就可以編寫查詢語句及對底層模板處理的相關函數了
          $revalue = '';
          $innertext = $ctag->GetInnerText();
          $ctp = new DedeTagParse();
          $ctp->SetNameSpace('field', '[', ']');
          $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row";
          $innertext這個是用來獲取標簽的底層模板的,$ctp創建用于處理底層模板中的變量,并處理進行替換。我們根據獲取的屬性編寫我們的sql語句,這里我們使用limit 0, $row,這樣就可以根據$row來確定查詢的內容數目。
          當然我們可以獲取更多的屬性以便我們這個標簽更強大,例如我們可以增加類似于arclist中的相關屬性,并在函數中進行處理,不過這個需要有一定的PHP基礎。
          接下來我們通過執行查詢對sql及輸出變量進行處理:
          $dsql->Execute('me',$sql);
          while($rs = $dsql->GetArray('me'))
          {
          //根據屬性處理查詢變量
          $rs['title'] = cn_substr($rs['title'], $titlelen);
          //獲取底層模板
          $ctp->LoadSource($innertext);
          foreach($ctp->CTags as $tagid=>$ctag) {
          if(!empty($rs[strtolower($ctag->GetName())])) {
          $ctp->Assign($tagid,$rs[$ctag->GetName()]);
          }
          }
          //根據底層模板及查詢變量得到處理結果
          $revalue .= $ctp->GetResult();
          }
          這樣我們就將查詢出來的結果同底層模板中出現的相關變量進行替換,然后生成輸出字符串,將所有的字符串信息存儲到$revalue中。
          最后返回這個值return $revalue;
          整個文件內容如下:
           
          if(!defined('DEDEINC'))
          {
          exit("Request Error!");
          }
          function lib_writerarc(&$ctag,&$refObj)
          {
          global $dsql,$envs;
          //屬性處理
          $attlist="row|12,titlelen|24";
          FillAttsDefault($ctag->CAttribute->Items,$attlist);
          extract($ctag->CAttribute->Items, EXTR_SKIP);
          $revalue = '';
          $innertext = $ctag->GetInnerText();
          $ctp = new DedeTagParse();
          $ctp->SetNameSpace('field', '[', ']');
          $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row";
          $dsql->Execute('me',$sql);
          while($rs = $dsql->GetArray('me'))
          {
          //根據屬性處理查詢變量
          $rs['title'] = cn_substr($rs['title'], $titlelen);
          //獲取底層模板
          $ctp->LoadSource($innertext);
          foreach($ctp->CTags as $tagid=>$ctag) {
          if(!empty($rs[strtolower($ctag->GetName())])) {
          $ctp->Assign($tagid,$rs[$ctag->GetName()]);
          }
          }
          //根據底層模板及查詢變量得到處理結果
          $revalue .= $ctp->GetResult();
          }
          return $revalue;
          }
          ?>
          接下來我們來測試我們這個標簽,我們修改article_article.htm模板,在里面加入以下的標簽代碼:
          {dede:writerarc row='10' titlelen='6'}
          [field:title/] 

          {/dede:writerarc}
          通過動態瀏覽頁面進行查看調試http://www.bao59.cn/plus/view.php?aid=3

          至此我們完成了標簽的編寫,這里面主要涉及到PHP、MySQL的很多知識,需要有一定相關方面的基礎才能夠編寫標簽了,當然這里只是一個簡單的標簽開發例子,還有許多的東西可以去開發。

          有幫助
          (111)
          83.5%
          沒幫助
          (22)
          16.5%
        • 上一篇:沒有了
        • 下一篇:二次開發的一些經驗之談
        • 2018宝宝说数特来算 南靖县| 三门县| 星子县| 阿克陶县| 上林县| 寿阳县| 龙川县| 福海县| 辽阳市| 瑞昌市| 北票市| 渭源县| 仲巴县| 武威市| 铜梁县| 伊川县| 博湖县| 祥云县| 南投市| 大兴区| 常熟市| 土默特右旗| 望谟县| 寿宁县| 涪陵区| 略阳县| 郧西县| 灯塔市| 富蕴县| 金坛市| 封开县| 邹城市| 金阳县| 财经| 青浦区| 潍坊市| 静安区| 龙岩市| 个旧市| 长顺县| 霍山县| http://www.ba7hu1.cn http://abletravel7.cn http://www.lsj0ow.club http://www.airlineang9.top http://m.4kn79j.top http://m.sina8np.pw