底層模板(Innertext),底層模板實(shí)際上就是對于有多條記錄的模板輸出,用戶手工去指定單個(gè)記錄的樣式。
因?yàn)檫@個(gè)概念很虛線,那么這個(gè)地方還是通過實(shí)踐去說明吧。
大家在標(biāo)簽測試的地方輸入:
- 這是使用默認(rèn)底層模板的標(biāo)簽:
{dede:arclist row=10}
{/dede:arclist}
- 這是手工指定底層模板的標(biāo)簽:
{dede:arclist row=5}
<a href=’[field:arcurl/]’>[field:title /]</a> 點(diǎn)擊:[field:click/] <br />
{/dede:arclist}
有一點(diǎn)需注意的是,在沒有指定底層模板(Innettext)的時(shí)候,系統(tǒng)一般調(diào)用 templets/system 里的
相應(yīng)該文件作為底層模板。
例如:
{dede:arclist row=10}{/dede:arclist}
它實(shí)際由系統(tǒng)默認(rèn)調(diào)用了templets/system/part_arclist.htm 這文件的東西作為底層模板。這文件的內(nèi)容是
<a href="[field:filename /]">[field:title /]</a>
那么
{dede:arclist row=10}{/dede:arclist}
就等同于
{dede:arclist row=10}·<a href="[field:filename /]">[field:title /]</a><br/>
{/dede:arclist}既能用短標(biāo)記,也能直接定義樣式,又不依賴數(shù)據(jù)庫,這是dedecms模板和其它模板的最大區(qū)別。
在標(biāo)記之間 [field:…/] 這些就是底層模板變量,這些標(biāo)記一般也是屬于 Dedecms 標(biāo)簽的模式,只是 { … } 符號改為了 [ … ],因此底層模板中的標(biāo)簽也是具有DedeCms標(biāo)簽的特性的,例如,在底層模板中使用 [field:global name=’cfg_webname’/] 同樣可以表示全局變量 $cfg_webname。
在此我簡單介紹一下常用的 arclist 標(biāo)記的底層模板字段及意義:
arclist的底層模板字段實(shí)際上是對應(yīng)相應(yīng)該主索引表的,在文檔模板中則對應(yīng)該主表和附加表,主
表字段是一樣的,我等會(huì)介紹一下,附加表的可以在模型里找。
arclist常用的字段有:
ID(同 id),
title(標(biāo)題),
color,
typeid(欄目ID),
description(摘要,同 info),
writer(作者),
shorttitle(短標(biāo)題),
memberid(會(huì)員ID),
pubdate(發(fā)布時(shí)間),
click,
litpic(縮圖圖,同 picname),
typename(欄目名稱),
arcurl(網(wǎng)址,同 filename),typeurl(欄目網(wǎng)址)stime(pubdate 的"0000-00-00"格式,等同于[field:pubdate function="strftime('%y-%m-%d',@me)"/]),
textlink(等同<a href='[field:arcurl /]'>[field:title/]</a>),
typelink(等同<a href='[field:arcurl /]'>[field:title/]</a>),
imglink(等同<a href='[field:arcurl /]'><img src='[field:picname/]' border='0'></a>),
image(等同<img src='[field:picname/]'>),
大家需注意的一個(gè)問題是:[field:標(biāo)記名稱/]這種寫法是僅在底層模板中才用的。在文檔模板中,字段是用 {dede:field name='title'/}這樣形式表示的。不過在一種特殊的情況下,Innertext是無效的,就是指定了 runphp=’yes’ 屬性,:A、function 擴(kuò)展;B、在Innertext中直接編程。
一、那么首先說
A、function 擴(kuò)展:
在標(biāo)記中,可以使用 {dede:標(biāo)記名稱 function=”函數(shù)名(@me,其它參數(shù))” /}這樣模式對標(biāo)記的值進(jìn)行處理,其中 @me 就是表示標(biāo)記當(dāng)前的值,最終獲得的結(jié)果是這個(gè)函數(shù)返回的值。
大家不妨測試一下下面這個(gè)標(biāo)簽:{dede:global function="file_get_contents('http://www.baidu.com')" /}
下面再舉個(gè)實(shí)用的例子(測試一下):
{dede:arclist row=5}
<a href='[field:arcurl/]'>[field:title /]</a>
[field:pubdate function="strftime('%y-%m-%d %H:%M',@me);"/]<br />
{/dede:arclist}
從實(shí)例中大家可以注意到,{dede:xx/}和[field:xxx/}都支持function擴(kuò)展。實(shí)際上 [field:xxx/] 這種模式也是dede標(biāo)簽解析器解析的,所以作用一樣,它只是把 dede 換成 field { 換成 [在這里,function 屬性的 function 不僅是用PHP自帶的,用自己定義的也行。不過要注意function的格式,自定義的function不能用echo這樣的輸出,而是返回一個(gè)字符串,這樣就行了。
寫好的函數(shù)放入 include/inc_channel_unit_functions.php 文件,因?yàn)閐ede核心都會(huì)調(diào)用這個(gè)文件。
這里舉個(gè)簡單的函數(shù):
function testMyFunc(str." 增加了我的東西哦!";}
在標(biāo)簽中使用:
{dede:global name='cfg_webname' function='testMyFunc(@me)'/}
用function擴(kuò)展的好處是既可以增強(qiáng)系統(tǒng)的功能,又保持標(biāo)記的簡潔。
二、下面介紹的是另一種擴(kuò)展 B
在Innertext中直接編程這種方式和function編程的不同之處是,你可以把PHP代碼直接寫入到標(biāo)簽的底層模板代碼的地方,不過需要注意的是,在這里的PHP代碼并非完全意義上的PHP代碼,它必須符合Dede限定的格式,即是最終返回值返回到 @me 變量中,同樣的是用 @me 表示標(biāo)記的最初的值。
使用格式: {dede:標(biāo)記名稱 runphp=yes} PHP代碼{/dede:標(biāo)記名稱}
大家測試一下這個(gè)代碼:
{dede:global name='cfg_webname' runphp='yes'}
$baidu = file_get_contents("http://www.baidu.com");
preg_match_all("/<title>(.*)<\/title>/isU",$baidu,$baidus);
@me = $baidus[1][0];
{/dede:global}
這里的 cfg_webname 不再顯示當(dāng)前站點(diǎn)名了,因?yàn)?@me =$ baidus[1][0]; 改變了它的值。
在使用標(biāo)記內(nèi)編程或function擴(kuò)展時(shí),很多情況都可能會(huì)調(diào)用數(shù)據(jù)庫。在V5版本中,DedeCms的數(shù)據(jù)庫進(jìn)行了改進(jìn),無論你新建多少個(gè)類的對像,最終打開的鏈接是只有一個(gè)的,并且會(huì)生成一個(gè) $dsql 的全局?jǐn)?shù)據(jù)庫類的變量。
以往有些懂dedecms數(shù)據(jù)庫類的人在調(diào)用function擴(kuò)展的時(shí)候,一般的做法是用 $dsql = new DedeSql(false); 這樣新建一個(gè)類。實(shí)際上在V5中是不需要這樣的。直接用 global $dsql;聲明一下就能使用,并且在函數(shù)體中不要自行關(guān)閉(即執(zhí)行dsql->Close()否則可能出錯(cuò)。
那么在這里舉個(gè)簡單的例子(測試代碼):
{dede:global runphp='yes'}
global $dsql;
$restr = '';
$dsql->SetQuery("Select * From dede_feedback where ischeck=1 order by ID desc limit 5");
$dsql->Execute('feedback');
while($row = $dsql->GetArray('feedback')){
$restr .= "<a target='_blank' href='/plus/feedback.php?arcID={$row['aid']}&urlindex={$row['urlindex']}'> {$row['arctitle']}</a> -- ".cn_substr($row['msg'],200);
}
@me = $restr;{/dede:global}
這代碼是調(diào)用最新評論的。dede本身沒有提供直接調(diào)用評論的標(biāo)簽,一般懂的人用loop標(biāo)簽調(diào)用,不過在本版中,新增的SQL標(biāo)簽會(huì)更簡單。
在 DedeCms V5 中有一個(gè)標(biāo)簽{dede:sql sql="SQL語句 limit 記錄"}底層模板{/dede:sql}
我現(xiàn)在改一下剛才調(diào)用評論的地方(測試代碼):
{dede:sql sql="Select * From dede_feedback where ischeck=1 order by ID desc limit 5"}
<a target='_blank' href='/plus/feedback.php?arcID=[field:aid/]&urlindex=[field:urlindex/]'>[field:arctitle/]</a> -- [field:msg/]<hr />
{/dede:sql}
這結(jié)果應(yīng)該和上面的代碼是一樣的。
為了補(bǔ)允調(diào)用全站數(shù)據(jù)的不足,V5中新增了 arcfulllist 標(biāo)記,它的作用與 arclist 標(biāo)記有點(diǎn)類同,不示不同的是 arcfulllist 里的文件名有時(shí)候可能是動(dòng)態(tài)的,這因?yàn)樗鞘褂盟阉鲿r(shí)用的那個(gè)簡單索引表。在專題文章、相關(guān)文章中默認(rèn)都是使用 arcfulllist 調(diào)用指定的 id 的文檔的。
由于這標(biāo)記可能造成文件名不同步,我們系統(tǒng)后面增加了文檔名批量修正功能,但為了防止忘記操作,建議建立欄目就設(shè)定好文檔命名規(guī)則,以后不要經(jīng)常更改。
一就是常用的模型,二是新出的模塊,三是插件。
大家進(jìn)到Dede管理后臺“頻道管理->內(nèi)容模型管理”的地方可以看到:
分類信息專題普通文章圖片集軟件Flash產(chǎn)品這些都是內(nèi)置的模型。大家也可以自己新建一個(gè)模型,有不少人問:Dedecms的文本存儲在哪里呀?下面我一步一步的教大家建立一個(gè)用文本存儲的文章模型。
首先“增加一個(gè)新模型”,建立好后“添加字段”,然后轉(zhuǎn)向欄目管理的地方。建立好后轉(zhuǎn)到欄目管理的地方新建一個(gè)頂級欄目,內(nèi)容模型選剛才建好的那個(gè)。建立好欄目后,隨意在那個(gè)欄目增加一篇文章。預(yù)覽文章,會(huì)發(fā)生新增的模型顯示的文檔?,F(xiàn)在再回到頻道模型管理的地方,在新建的頻道點(diǎn)擊“模板”。
對于類同的模型,最好是把類同的模板作為當(dāng)前模型的模板。如剛才建立的模型,實(shí)際上模板和普通文章模板是一樣的。
關(guān)于字段的問題,在文檔模板中字段是用{dede:field name='字段名'/}表示。例如在軟件模型中文件類型 filetype 單行文本(varchar) 固化表單 [修改]
語言 language 單行文本(varchar) 固化表單 [修改]
軟件類型 softtype 單行文本(varchar) 固化表單 [修改]
授權(quán)方式 accredit 單行文本(varchar) 固化表單 [修改]
操作系統(tǒng) os 單行文本(varchar) 固化表單 [修改]
軟件等級 softrank 整數(shù)類型 固化表單 [修改]
官方網(wǎng)址 officialurl 單行文本(varchar) 固化表單 [修改]
語言這字段就可以用 {dede:field name='language'/} 表示,此外,title , keywords,description 這些實(shí)際上主索引表的東西,剛才說模板時(shí)已經(jīng)介紹過它的含義了。
有用戶提過一個(gè)問題,就是關(guān)于自定義模型如何在表布表單中調(diào)整字段的順序。Dedecms目前沒有這選項(xiàng),需要改的必須用 phpmyadmin 進(jìn)入 it_channeltype 這個(gè)表。編輯 fieldset 這里的XML,調(diào)一下位置就行了。
此外大家要區(qū)別一下自動(dòng)模型和系統(tǒng)模型的區(qū)別,系統(tǒng)模型是固化了的,要調(diào)整必須自己修改程序,
對于普通人是無法改的。不過這版本允許自行增加一些字段在里面。
因?yàn)檫@次講座是個(gè)中級講座,模型這塊我就不太深入的講解了,最后介紹一下插件和模塊。
插件和模塊DEDE增加新模型,必須一步到位,如果不用phpmyadmin,輸入錯(cuò)誤什么的,在后臺修改不了。
插件在Dedecms中是就是一些小的實(shí)際的程序的集合,它可以簡單的安裝和刪除,不過安裝和刪除僅去掉數(shù)據(jù)庫的索引記錄,并非進(jìn)行真正的安裝。
官方網(wǎng)前自帶的插件有:
文件管理器站內(nèi)新聞發(fā)布友情鏈接模塊留言簿模塊投票模塊論壇擴(kuò)展廣告管理正則規(guī)則測試器隨機(jī)模
板防采集木馬掃描檢測數(shù)據(jù)轉(zhuǎn)換與導(dǎo)入實(shí)際上很多情況下單用插件是滿足不了系統(tǒng)的需求的,實(shí)際上很多情況下單用插件是滿足不了系統(tǒng)的需求的。因此Dedecms V5提出了模塊的概念。
模塊是對系統(tǒng)模型的一個(gè)補(bǔ)充,因?yàn)镈edecms的模板解析機(jī)制相對復(fù)雜,如果所有東西都依賴模型,就
結(jié)果只有一個(gè):速度越來越慢。而使用模塊就補(bǔ)充了這方面的不足。在 Dedecms V5 的菜單中“擴(kuò)展模塊”里放的就是Dedecms的模塊。
模塊文件是一個(gè)標(biāo)準(zhǔn)化的xml文件,它即包含了模塊安裝刪除的數(shù)據(jù),也偶包含了圖片等二進(jìn)制文件。有些人問我,為什么在DedeCms V5的安裝包里沒發(fā)現(xiàn)ask、group等目錄?因?yàn)檫@些東西都封裝起來了,如果你不安裝它,是不會(huì)看到這些文件的,這樣就能盡大限度滿足一些站長想要功能多,一些想要功能實(shí)用的需求。