Dede二次開發之代碼篇:[2]

織夢CMS是集簡單、健壯、靈活、開源幾大特點的開源內容管理系統,是國內開源CMS的領先品牌,目前程序安裝量已達七十萬,超過六成的站點正在使用織夢CMS或基於織夢CMS核心開發.

方法/步驟

2.1、common.func.php 公用函數

獲得當前的腳本網址function GetCurUrl()返回格林威治標準時間function MyDate($format='Y-m-d H:i:s',$timest=0)把全角數字轉為半角function GetAlabNum($fnum)把含HTML的內容轉為純textfunction Html2Text($str,$r=0)把文本轉HTMLfunction Text2Html($txt)輸出Ajax頭function AjaxHead()中文截取2,單字節截取模式function cn_substr($str,$slen,$startdd=0)把標準時間轉為Unix時間戳function GetMkTime($dtime)獲得一個 0000-00-00 00:00:00 標準格式的時間function GetDateTimeMk($mktime)獲得一個 0000-00-00 標準格式的日期function GetDateMk($mktime)獲得用戶IPfunction GetIP()獲取拼音以gbk編碼為準function GetPinyin($str,$ishead=0,$isclose=1)dedecms通用消息提示框function ShowMsg($msg,$gourl,$onlymsg=0,$limittime=0)保存一個cookiefunction PutCookie($key,$value,$kptime=0,$pa="/")刪除一個cookiefunction DropCookie($key)獲取cookiefunction GetCookie($key)獲取驗證碼function GetCkVdValue()過濾前台用戶輸入的文本內容// $rptype = 0 表示僅替換 html標記// $rptype = 1 表示替換 html標記同時去除連續空白字符// $rptype = 2 表示替換 html標記同時去除所有空白字符// $rptype = -1 表示僅替換 html危險的標記function HtmlReplace($str,$rptype=0)獲得某文檔的所有tagfunction GetTags($aid)過濾用於搜尋的字符串function FilterSearch($keyword)處理禁用HTML但允許換行的內容function TrimMsg($msg)獲取單篇文檔信息function GetOneArchive($aid)

2.2、dedesql.class.php 資料庫類

系統會自動載入 dedesql.class.php 文件,並用$dsql = $db = new DedeSql(false);進行初始化資料庫連接,因此在工程所有文件中均不需要單獨初始化這個類,可直接用 $dsql 或 $db 進行操作,為了防止錯誤,操作完後不必關閉資料庫。常用的方法:1、執行一個非查詢類型的SQL語句,如 insert 、create 、update 等$rs = $db->ExecuteNoneQuery($sql);返回值為是否執行成功。2、執行一個非查詢類型的SQL語句,並返回成功記錄數$rs = $db->ExecuteNoneQuery2($sql);與上面相比,它返回的是影響的記錄數,而不是布爾值3、返回單個記錄$arr = $db->GetOne($sql);$dsql 如果不帶 limit ,系統會自動加上 limit 0,14、執行條件查詢語句

1 $db->SetQuery($dsql);

2 $db->Execute();

3 while($arr = $db->GetArray())

4 {

5 }

可以簡化為:

6 $db->Execute('me',$dsql);

7 while($arr = $db->GetArray())

8 {

9 }

'me' 為記錄集游標,用於區分不同的查詢,如:

10 $db->Execute('me',$dsql);

11 while($arr = $db->GetArray())

12 {

13    $db->Execute('2',$dsql2);

14    while($arr2 = $db->GetArray())

15    {

16

17    }

18 }

像這種情況必須指定一個值區分默認的'me'參數,否則會出錯$db->GetArray($rsid,$acctype) 參數$rsid="me"$acctype=MYSQL_ASSOC在查詢游標中讀取數據還可以用$db->GetObject($rsid="me");返回的結果是用類結構表示的值。5、獲取上一個插入的自動遞增主鍵id值$db->GetLastID();6、獲得查詢的總記錄數$db->GetTotalRow($rsid="me")7、獲得MySql的版本號$db->GetVersion($isformat=true)默認的情況下會轉換成 x.xx 形式浮點數8、析放某查詢的資源$db->FreeResult($rsid="me");9、在資料庫中是否存在某數據表$db->IsTable($tbname)10、重新選擇要操作的資料庫$db->SelectDB($dbname);11、獲得資料庫連接標識$db->linkID獲得這個連接標識後,可以直接用mysql相關函數進行資料庫操作在非不得已的情況,項目中一般不使用這個變量。

2.3、datalistcp.class.php 動態分頁類

類文件include/datalistcp.class.php適用範圍:數據量不大的數據分頁使用方法:

1 $dl = new DataListCP();

2 $dl->pageSize = 25;              //設定每頁顯示記錄數(默認25條)

3 $dl->SetParameter($key,$value);  //設定get字符串的變量  //這兩句的順序不能更換

4 $dl->SetTemplate($tplfile);?//載入模板

5 $dl->SetSource($sql);?//設定查詢SQL

6

7 $dl->Display();?//顯示  模板

8 {dede:datalist}<br />

9  <li>{field.fieldname1/} - {field.fieldname2/} ...</li><br />

10 {/dede:datalist}<br />

11 <br />

12 {tag:pagelist listitem="info,index,end,pre,next,pageno"  listsize="5"/}   listitem、listsize 是可選屬性如果需要自定義 datalist 相關屬性,可以繼續本類來創建一個新類,只需改變 GetArcList($atts,$refObj='',$fields=array()) 方法即可。

s'; C-ipY����0; font-family:'Times New Roman'; " >獲取單篇文檔信息function GetOneArchive($aid)

2.4、dedetag.class.php 靜態模板類

類文件include/dedetag.class.php這個文件是dedecms V5.3及之前版本使用的主要的模板類,它是解析式模板類,並非編譯式的(區別是前者通過獲得標籤位置進行內容替換,後者是直接解析式PHP代碼,二次執行)一、模板語法織夢模板引擎是一種使用XML名字空間形式的模板解析器,使用織夢解析器解析模板的最大好處是可以輕鬆的制定標記的屬性,感覺上就像在用HTML一樣,使模板代碼十分直觀靈活,新版的織夢模板引擎不單能實現模板的解析還能分析模板里錯誤的標記。

1、織夢模板引擎的代碼樣式有如下幾種形式:{dede:標記名稱 屬性='值'/}{dede:標記名稱 屬性='值'}{/dede:標記名稱}{dede:標記名稱 屬性='值'}自定義樣式模板(InnerText){/dede:標記名稱}

提示:如果使用帶底層模板的標記,必須嚴格用{dede:標記名稱 屬性='值'}{/dede:標記名稱} 這種格式,否則會報錯。

2、織夢模板引擎內置有多個系統標記,這些系統標記在任何場合都是能直接使用的。

(1) global 標記,表示獲取一個外部變量,除了資料庫密碼之外,能調用系統的任何配置參數,形式為:{dede:global name='變量名稱'}{/dede:global}或{dede:global name='變量名稱'/}

其中變量名稱不能加 $ 符號,如變量 $cfg_cmspath ,應該寫成 {dede:global name='cfg_cmspath'/} 。

(2) foreach 用來輸出一個數組,形式為:{dede:foreach array='數組名稱'}[field:key/] [field:value/]{/dede:foreach}

(3) include 引入一個文件,形式為:{dede:include file='文件名稱' ismake='是否為dede板塊模板(yes/no)'/}對文件的搜尋路徑為順序為:絕對路徑、include文件夾,CMS安裝目錄,CMS主模板目錄

3、織夢標記允許在任何標記中使用函數對得到的值進行處理,形式為:{dede:標記名稱 屬性='值' function='youfunction("參數一","參數二","@me")'/}其中 @me 用於表示當前標記的值,其它參數由你的函數決定是否存在,例如:{dede:field name='pubdate' function='strftime("%Y-%m-%d %H:%M:%S","@me")'/}4、織夢標記允許有限的編程擴展。格式為:{dede:tagname runphp='yes'}$aaa = @me;@me = "123456";{/dede:tagname}@me 表示這個標記本身的值,因此標記內編程是不能使用echo之類的語句的,只能把所有返回值傳遞給@me。此外由於程序代碼占用了底層模板InnerText的內容,因此需編程的標記只能使用默認的InnerText。

二、解析方式

在 dedetag.class.php 裡面有四個類

class DedeAttribute  屬性結構表述

class DedeAttributeParse  屬性解析器

class DedeTag  標籤結構表述

class DedeTagParse  標籤解析器

使用解析類解析模板時一般經過下面的步驟

1、初始化:

$dtp = new DedeTagParse();

2、載入模板/模板字符串:

$dtp->LoadTemplate(模板文件(絕對路徑));  //會生成緩存,第二次不需解析模板

或$dtp->LoadSource(字符串);

3、給標籤賦值

foreach($dtp->CTags as $tid=>$ctag) {

//判斷ctag的名稱和屬性,並給賦不同的值,通常用函數處理

if($ctag->GetName=='mytag') $dtp->Assign($tid, mytagvalue($ctag) );  }

在上面例子中,直接把名稱為 mytag的標籤轉交給 mytagvalue 函數處理,mytagvalue 里判斷$ctag的各個屬性,返回不同內容即可。

在 V5.3版本中,通常除了field、list等專用標籤之外,凡arc.*開頭的類解析的文件,標籤都是對應該 include/taglib 的源碼的,這個由系統進行了自動的映射。

4、顯示或保存為HTML

$dtp->display();

$dtp->SaveTo(靜態文件名);

對於二次開發人員而言,不大需要知道dedecms模板具體解析方式,不過應該十分清楚CTag這個類的結構,從而判斷標籤不同屬性進行處理。

1 class DedeTag

2 {

3     var $IsReplace=FALSE; //標記是否已被替代,供解析器使用

4     var $TagName=""; //標記名稱

5     var $InnerText=""; //標記之間的文本

6     var $StartPos=0; //標記起始位置

7     var $EndPos=0; //標記結束位置

8     var $CAttribute=""; //標記屬性描述,即是class DedeAttribute

9     var $TagValue=""; //標記的值

10     var $TagID = 0;

11

12     //獲取標記的名稱和值

13     function GetName()

14     {

15         return strtolower($this->TagName);

16     }

17

18     function GetValue()

19     {

20         return $this->TagValue;

21     }

22

23     //下面兩個成員函數僅是為了兼容舊版

24     function GetTagName()

25     {

26         return strtolower($this->TagName);

27     }

28

29     function GetTagValue()

30     {

31         return $this->TagValue;

32     }

33

34     //獲取標記的指定屬性

35     function IsAttribute($str)

36     {

37         return $this->CAttribute->IsAttribute($str);

38     }

39

40     function GetAttribute($str)

41     {

42         return $this->CAttribute->GetAtt($str);

43     }

44

45     function GetAtt($str)

46     {

47         return $this->CAttribute->GetAtt($str);

48     }

49

50     function GetInnerText()

51     {

52         return $this->InnerText;

53     }

54 }

2.5、dedetemplate.class.php 動態模板類

核心類文件include/dedetemplate.class.php用途:用於非核心模塊的動態頁面或列表頁的模板解析,如:member/content_list.php ,通常是在 datalistcp.class.php 中使用,這個類在動態運行的情況下,由於本身是把模板編譯成PHP的,因此性能上會優級於舊的解析類,這個方法將在未來版本中作為通用的方式。一、使用方法:$tpl = new DedeTemplate(模板對象實例名稱,通常是'tpl',[模板存放目錄(生成緩存時會存放在這個目錄),include語法默認引用目錄]);通常情況下參數二和參數三是不必要的,如:$tpl = new DedeTemplate('tpl');如果在類文件中調用,應該加上設置:$this->tpl->SetObject($this);在一些塊調用中默認將使用當前類的成員函數。$tpl->LoadTemplate(模板的物理路徑);如果模板中帶有 {dede:config name='' value=''/}可以在載入模板後,通過 $tpl->GetConfig($name) 獲得這些變量的值。顯示頁面或保存頁面為文件$tpl->Display();$tpl->SaveTo(物理絕對路徑的文件名);二、模板標記語法1、標記通用特性(1) 短標記{dede:tagname.name/}等同於{dede:tagname name='' /}(2) 塊標記{dede:tagname}循環代碼{/dede:tagname}2、標記的具體語法及對應的PHP代碼(1) 配置變量{dede:config name='' value=''/}配置變量可以在載入模板後通過 $tpl->GetConfig($name) 獲得,僅作為配置,不在模板中顯示。(2) 短標記{dede:global.name/}   外部變量      等同於 <?php echo $name; ?>{dede:var.name/}      var數組       等同於 <?php echo $_vars['name']; ?>{dede:field.name/}    field數組     等同於 <?php echo $fields['name']; ?>{dede:cfg.name/}      系統配置變量  等同於 <?php echo $cfg_name; ?>考慮到大多數情況下都會在函數或類中調用模板,因此 $_vars、$fields 數組必須聲明為 global 數組,否則模板引擎無法獲得它的值從而導致產生錯誤。(3) 自由調用塊標記{tag:blockname bind='GetArcList' bindtype='class'}循環代碼{/tag:blockname}必要屬性:bind       數據源來源函數bindtype   函數類型,默認是 class 可選為 subrstype     返回結果類型,默認是 array ,可選項為 string自定義函數格式必須為 function(array $atts,object $refObj, array $fields);在沒有指定 bind 綁定的函數的情況下,默認指向 MakePublicTag($atts,$tpl->refObj,$fields) 統一管理,這個函數存放在 cls_dede_tplinc.php 。(4) 固定塊標記[1] datalist從綁定類成員函數GetArcList中獲取數組並輸出{dede:datalist}循環代碼{/dede:datalist}遍歷一個二給維數組,數據源是固定的,只適用用類調用。等同於{tag:blockname bind='GetArcList' bindtype='class' rstype='arrayu'}循環代碼{/tag:blockname}[2] label從綁定函數中獲取字符串值並輸出等同於 {tag:blockname bind='func' bindtype='sub' rstype='string'/}[3] pagelist從綁定類成員函數GetPageList中獲取字符串值並輸出等同於 {tag:blockname bind='GetPageList' bindtype='class' rstype='string'/}(5) include 語法{dede:include file=''/}{dede:include filename=''/}(6) php 代碼塊{dede:phpphp 代碼/}或{dede:php}php代碼{/dede:php}(7) if 條件僅支持 if ,else ,else 直接用{else}表示,但不支持{else if}這樣的語法 ,一般建議模板中不要使用太複雜的條件語法,如果確實有需要,可以直接使用 php 語法。{dede:if 條件} a-block  {else} b-block {/dede:if}條件中允許使用 var.name 、 global.name 、 field.name、cfg.name 表示相應的變量。如:{dede:if field.id>10 }{/dede:if}(8) 遍歷一個 array 數組{dede:array.name}  {dede:key/} = {dede:value/}{/dede:array}各種語法的具體編譯後的代碼,可查看 dede-template-class.php 的 function CompilerOneTag(&$cTag)。塊調用示例代碼:1、示例一

1 {tag:datalist   timeformat=""}<br />

2     <tr><br />

3       <td class='col1'><br />

4           <div>?<a   href='{tag:field.arcurl/}'>{tag:field.title/}</a></div><br />

5           <!--div   class='descriptions'>    {tag:field.description   function="CnSubstr(@me,150)"/}...</div--><br />

6       </td><br />

7       <td   class='col2'>{tag:field.formattime/}</td><br />

8       </tr><br />

9   {/tag:datalist}

編譯後的代碼

10 <?php

11 $atts = array();

12 $atts['tagname'] = 'datalist';

13 $atts['timeformat'] = '';

14 $blockValue = $this->refObj->GetArcList($atts,$this->refObj,$fields);

15 foreach( $blockValue as $key=>$fields )

16 {

17 ?>

18 <tr>

19 <td class='col1'>

20 <div>?<a href='<?php echo $fields['arcurl']; ?>'><?php echo $fields['title']; ?></a></div>

21 <!--div class='descriptions'>    <?php echo CnSubstr($fields['description'],150); ?>...</div-->

22 </td>

23 <td class='col2'><?php echo $fields['formattime']; ?></td>

24 </tr>

25 <?php

26 }

27 ?>

28

2、示例二

29 {tag:article sort='new'   titlelen='36' row='10'}<br />

30      <dd>[{tag:field.typename/}]<a   href="{tag:field.arcurl/}">{tag:field.title   function="CnSubstr(@me,24)"/}</a></dd><br />

31   {/tag:article} 編譯後的代碼

32 <?php

33 $atts = array();

34 $atts['tagname'] = 'article';

35 $atts['sort'] = 'new';

36 $atts['titlelen'] = '36';

37 $atts['row'] = '10';

38 $blockValue = MakePublicTag($atts,$this->refObj,$fields);

39 if(is_array($blockValue) && count($blockValue) > 0){

40 foreach( $blockValue as $key=>$fields )

41 {

42 ?>

43 <dd>[<?php echo $fields['typename']; ?>]<a href="<?php echo $fields['arcurl']; ?>"><?php echo CnSubstr($fields['title'],24); ?></a></dd>

44 <?php

45 }

46 }

47 ?>

48

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場