欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 網(wǎng)站建設 > 建站知識 > 淺談dedecms模板引擎工作原理及自定義標簽

淺談dedecms模板引擎工作原理及自定義標簽

POST TIME:2017-11-13 00:00

理解織夢模板引擎有什么意義?一方面可以更好地自定義標簽。更多在于了解織夢系統(tǒng),理解模板引擎是理解織夢工作原理的第一步。理解織夢會使我們寫php代碼時更順手,同時能學習一些php代碼的組織方式。

這似乎不是那么簡單,如果你只想學習自定義標簽,可以看一下“是否需要自定義標簽”和““擴展標簽””就夠了。

一解析式引擎

如果你還沒用過dedecms的標簽,先用一下,也可以看一下“dedecms網(wǎng)頁模板編寫”。熟悉一下memberlist這個標簽,下面會以這個標簽為例。

織夢提供的模板分析引擎有解析式和編譯式兩種,由于現(xiàn)在主要使用前者,這里也只討論前者。

先來寫個模板解析的hello world 程序

***root/test.php 封面php(root指的是根目錄,以下都假設dedecms被放在了網(wǎng)站的根目錄)

<?php
require_once (dirname(__file__).'/include/common.inc.php');
//利用解析式模板所需的文件
require_once (dirname(__file__).'/include/dedetag.class.php');
//生成解析模板引擎類對象
$dtp=new DedeTagParse();
//設置命名空間,由于下面的標簽用tianya命名空間,所以要設置一下。
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).'\test.tpl.htm ');
//把標簽替換成具體的值
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='my')
//把id為$id的tag翻譯成這是my標簽<br/>
$dtp->Assign($id,'這是my標簽<br/>');
else if($tag->GetName()=='test')
$dtp->Assign($id,'這是test標簽<br/>');
}
//把解析好的html文本echo出來
$dtp->Display();
?>


***root/test.tpl.htm 網(wǎng)頁模板

    {tianya:my att1=1 att2='2'}
        [field:my/]
    {/tianya:my}
    {tianya:test att1=1 att2='2'}
        [field:test/]
    {/tianya:test}


執(zhí)行root/test.php就能查看結果

由上面的例子可以看出解析式模板運作的套路

1php文件調用網(wǎng)頁模板,并顯示。

2htm文件提供網(wǎng)頁的大體框架,等待數(shù)據(jù)來完善網(wǎng)頁的具體內容,稱為網(wǎng)頁模板。

上面的代碼就是把第一個標簽(my標簽)顯示為這是my標簽<br/>;第二個標簽顯示為這是test標簽<br/>。

上面的代碼是怎么辦妥的

更改***root/test.php如下

<?php
require_once (dirname(__file__).'/include/common.inc.php');
//利用解析式模板所需的文件
require_once (dirname(__file__).'/include/dedetag.class.php');
$dtp=new DedeTagParse();
//設置命名空間,由于下面的標簽用tianya命名空間,所以要設置一下。
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).'\test.tpl.htm ');
var_dump($dtp); //這是查看解析結果的重要方法
?>

***root/test.tpl.htm 網(wǎng)頁模板

    {tianya:my att1=1 att2='2'}
        [field:my/]
    {/tianya:my}
    {tianya:test att1=1 att2='2'}
        [field:test/]
    {/tianya:test}

可以看到$dtp對象的內部結構,其中有一個DedeTag類的數(shù)組CTagsDedeTag類的定義見root/include/ dedetag.class.php。最好不要直接用DedeTag類的字段,而用DedeTag提供的函數(shù)。比如用tag1->GetName()而不是用tag1->TagName。花一小段時間就能把DedeTag類看完,這些語法在以后自定義標簽時會有用。

再看一個例子,***root/test.php

<?php
require_once (dirname(__file__).'/include/common.inc.php');
require_once (dirname(__file__).'/include/dedetag.class.php');
function lib_my($att1,$att2)
{
return '這是my標簽<br/>屬性值'.$att1.$att2.'<br/>';
}
$dtp=new DedeTagParse();
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).'\test.tpl.htm');
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='my')
$dtp->Assign($id , lib_my($tag->GetAtt('att1'),$tag->GetAtt('att2')));
}
$dtp->Display();
?>


***root/test.htm 網(wǎng)頁模板

    {tianya:my att1=1 att2='2'}
        [field:my/]
    {/tianya:my}
    {tianya:test att1=1 att2='2'}
        [field:test/]
    {/tianya:test}

會發(fā)現(xiàn)模板解析中有四種“勢力”

在include/ DedeTagParse.class.php中定義的解析引擎類,負責讀取模板,把其中的dedecms標簽替換成具體html文本。DedeTagParse、SetNameSpace、LoadTemplate就是類里面的方法。

標簽翻譯需要一些轉換規(guī)則,lib_my就是這一類根據(jù)標簽的屬性和具體數(shù)據(jù)得出html。

待顯示的php創(chuàng)建編譯引擎類對象,對模板進行編譯,在Display時,echo出html文件。

htm模板,調用標簽,用html的形式寫出動態(tài)網(wǎng)頁的效果,屬于被翻譯的部分。Html模板主要負責界面層次,利用封裝好的標簽進行內部處理。

除了這四大勢力,還有一個勢力視圖類。include/中以arc開頭的文件都是解析引擎的視圖類。視圖類就是封裝了解析引擎類的類,僅僅加了一些函數(shù)而已。在下載的cms默認模板中,root/index.php就用了PartView這個視圖類,解析了templets/default/index.htm。五大勢力的關系如下圖。

我們現(xiàn)在想象一個標簽如何被解析的。我們知道,一個xml標簽有四個元素:命名空間(上面的tianya,在dedecms中是dede)、標簽名(my)、屬性(att)、InnerText(標簽之間的內容)。命名空間在SetNameSpace中指明了,標簽名由if($tag->GetName()=='my')這一句分配任務,屬性作為函數(shù)參數(shù)使用,就差InnerText的處理。

再來看看如何處理底層模板字段([field:my/]等,field是一個關鍵字,在實際應用中,常常是數(shù)據(jù)庫元組中的字段)

***root/test.php

<?php
require_once (dirname(__file__).'/include/common.inc.php');
require_once (dirname(__file__).'/include/dedetag.class.php');
//看完后面的代碼再來看這個函數(shù)
function lib_zoo(&$ctag)
{
//還記得剛才$dtp->CTags的結構嗎?這里把$ctag作為參數(shù)傳遞,lib__zoo外面的代碼就不用涉及太多的標簽處理了
$reval='這是my標簽<br/>屬性值'. $ctag->GetAtt('att1').$ctag->GetAtt('att2').'<br/>';
$innerText = $ctag->GetInnerText();
//底層模板字段的結構都形如[field:XX]這里把它看作以field為命名空間,[]為分隔符的標簽。
$dtp=new DedeTagParse();
$dtp->SetNameSpace('field','[',']');
$dtp->LoadSource($innerText);
//不妨把$row想想成從數(shù)據(jù)庫中讀取出來的出來的數(shù)據(jù)
$row[‘name’]= 'Snoopy';
$row[‘animal’]= 'dog';
//把標簽替換成具體的值
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='name')
$dtp->Assign($id, $row[‘name’]);
else if($tag->GetName()=='animal')
$dtp->Assign($id, $row[‘animal’]);
}
$reval.=$dtp->GetResult().'<br/>';
return $reval;
}
$dtp=new DedeTagParse();
$dtp->SetNameSpace('tianya');
$dtp->LoadTemplate(dirname(__file__).'\test.htm');
foreach ($dtp->CTags as $id=>$tag)
{
if($tag->GetName()=='zoo')
$dtp->Assign($id, lib_zoo($tag));
}
$dtp->Display();
?>


***root/test.htm

{tianya:zoo att1=1 att2='2'}
     [field:name/] is a [field:animal/]
{/tianya:zoo}

可見,解析底層模板和解析標簽是一樣的,只不過把底層模板當作是以field為命名空間,‘[’和‘]’為邊界的標簽而已。

接著看一下include/taglib/memberlist.lib.php,和lib_zoo很像吧。你是不是突然懂得如何定義標簽了,讀memberlist.lib.php里面的代碼,模仿,就能自定義標簽了,可參考“擴展標簽”。所以自定義標簽只用在include/taglib里加入XX.lib.php文件,里面定義lib_XX函數(shù)即可。快點去試一試。

***把root/index.php(默認模板根目錄中的)里面的

$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);

改成$pv->SetTemplet($cfg_basedir .'/test.htm');

在root/test.htm使用自定義標簽吧

是否需要自定義標簽

筆者剛學織夢標簽時,第一個感覺就是之夢的標簽比較抽象,不夠好用。比如說剛才的zoo的問題,我就會定義一個zoo標簽。后來才發(fā)現(xiàn)應該用定義頻道的方法解決,可參考“dedecms中自定義數(shù)據(jù)模型”這篇文章。另外,標簽也有一些弱點,在開發(fā)中會慢慢體會到。

上面講了五大勢力的關系、一個標簽的解析過程和如何定義標簽,回憶一下看看是否對標簽解析有了六七成的把握。解析式模板的運作還有很多細節(jié),讀源碼是最好的學習方法。但有點難度,看自己需要的程度吧,可以跳過這一段。

***把root/index.php(默認模板根目錄中的)里面的

$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);

改成$pv->SetTemplet($cfg_basedir .'/test.htm');

編寫root/test.htm

{dede:memberlist row=6 signlen=30} 
<li><a href="[field:spaceurl/]" target="_blank">[field:uname/]</a></li>
{/dede:memberlist}

運行index.php

這是怎么辦到的,跟蹤代碼自己想吧(tips:適當?shù)豽ar_dump一些變量,還有用一下ctrl+F)。主要看dedetag.class.php這個文件,是織夢的核心文件,還是該看一看的。

過程大概是這樣的:new PartView()(include/ arc.partview.class中)調用了DedeTagParse(),SetNameSpace ()做了一些初始化工作。LoadTemplate() 一方面讀取網(wǎng)頁模板代碼,另一方面調用ParseTemplet()把網(wǎng)頁模板分解標簽,屬性,底層模板等,得到$pv->CTags。

Display()調用echo GetResult()的結果。GetResult()就是由分解好的標簽,屬性,底層模板等算出結果html。由于dedecms標記滿足樹形的語法規(guī)則(像html一樣),所以,計算標簽是一個遍歷樹的過程。至于每個標簽的值的計算,就調用了AssignSysTag(),它處理了global等標記。對于自定義標記,通過調用IncludeFile處理,這個函數(shù)又通過了復雜的調用,最后調用了include\helpers\channelunit.helper中的MakeOneTag()的函數(shù)。

自己整理一下吧!

解析與網(wǎng)頁的上下文

后面的部分是我在寫完“關于網(wǎng)頁模板”后補上的,涉及到封面模板、列表模板和文檔模板,不了解的讀者可以先看看那篇文章。

通過鏈接,網(wǎng)頁可以在封面頁、列表頁和文檔頁間跳轉,那怎么樣在頁面中傳遞信息呢?可以用get方式。由于系統(tǒng)有生成功能,它會把解析的結果生成純的html頁面,不太容易看清解析的過程。不妨先不用生成功能,如在后臺添加一篇文章,在發(fā)布選項處選“僅動態(tài)瀏覽”,之后保存,預覽。看到地址欄內容形如http://localhost/plus/view.php?aid=114。

不妨細細研究這個超鏈接,首先是aid=114。aid指article id,是文章的編號。通過給出這個編號,通過XXX處理,就能得出文章的所有信息,再加上文檔模板(就像一個格式),就能的出具體的html文檔頁。類似地,還有tid(type id,欄目號)、cid(channel id,頻道/模型號)或其他。這是在上下文間傳遞的信息。

  之后說說plus/view.php。打開該文件,發(fā)現(xiàn)里面用aid為參數(shù),創(chuàng)建了一個視圖類Archives的對象(在include/arc.archives.class中定義),并調用Display函數(shù)顯示。這和根目錄/index.php用partview視圖類對象來解析模板的道理是一樣的,不過這里多附加了aid表示具體的文章(而index中的東西是通用的,不用附加上下文)。也就是說,解析封面模板、列表模板和文檔模板都有建立解析引擎對象。

  另外,鏈接中對應php文件不一定是plus/view.php,顯示文檔可用plus/view.php;顯示列表可用plus/list.php。我猜測之所以會有文檔模板和列表模板差異就是來自于不同的視圖類。

  之后,若在文章的發(fā)布選項處選“生成html”,就是調用視圖類的SaveToHtml函數(shù)。得到的文章鏈接形如http://localhost/a/webbase/javascript-ajax/2010/0409/114.html。




上一篇:dedecms標簽調用大全

下一篇:織夢dedecms多語言網(wǎng)站的制作

收縮
  • 微信客服
  • 微信二維碼
  • 電話咨詢

  • 400-1100-266
欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产成人鲁色资源国产91色综| 高清国产在线观看| 佐佐木明希电影| 亚洲精品无码一区二区| 黄色片网站免费| 日韩精品最新网址| 国产精品美女久久久久久久久久久 | 久久综合桃花网| av女人的天堂| 色婷婷国产精品综合在线观看| 欧美色视频一区| 久久精品一区二区三区av| 樱桃视频在线观看一区| 韩国成人在线视频| 欧美日韩人妻精品一区在线| 欧美在线观看视频一区二区| 久久九九影视网| 婷婷久久综合九色综合绿巨人 | wwwwww日本| 日本久久电影网| 久久久久国产一区二区三区四区 | 人妻无码一区二区三区免费| 欧美日韩精品一区二区三区四区 | 欧美在线观看禁18| 亚洲一区二区欧美日韩| 国产a视频精品免费观看| 国产精品1000部啪视频| 欧美日韩一区精品| 午夜一区二区三区在线观看| 国产成人8x视频一区二区| av黄色免费在线观看| 欧美一区二区三区免费观看视频| 中文字幕色av一区二区三区| 麻豆久久久久久久| 午夜男人的天堂| 欧美综合色免费| 亚洲国产aⅴ成人精品无吗| 成人aaaa免费全部观看| 亚洲第一综合网| 国产精品系列在线| 国产精品正在播放| 最近中文字幕在线mv视频在线| xvideos.蜜桃一区二区| 麻豆久久久久久| 日韩国产第一页| 中文字幕av一区 二区| 成人激情校园春色| 三级影片在线看| 国产精品私房写真福利视频| 91丨九色丨蝌蚪富婆spa| 51精品久久久久久久蜜臀| 亚洲一区二区三区在线看| 成人免费无码大片a毛片| 欧美日韩国产片| 一卡二卡三卡日韩欧美| 国产男女无遮挡猛进猛出| 在线视频国内自拍亚洲视频| 亚欧色一区w666天堂| 鲁丝一区二区三区| 自拍偷拍国产精品| 91论坛在线播放| 欧美mv日韩mv国产网站| 久久精品国产秦先生| 日本一区二区三区网站| 国产情人综合久久777777| 久久9热精品视频| 国产精品 欧美激情| 日韩毛片在线免费观看| 又黄又爽的网站| 国产精品美女久久久久久久久| 中文字幕第九页| 国产欧美日韩不卡| 国产精品一区二区在线免费观看| 久久久久久久一区| 制服.丝袜.亚洲.中文.综合懂| 欧美日韩国产123区| 韩国女主播成人在线| 91国偷自产一区二区开放时间| 免费观看91视频大全| 一级片久久久久| 中文字幕乱码亚洲精品一区 | 成人av在线观| 欧美电影免费观看高清完整版在线 | 国产高清不卡一区| 91精品国产欧美一区二区18| 国产成a人无v码亚洲福利| 91精品国产综合久久婷婷香蕉| 国产a久久麻豆| 日韩精品资源二区在线| 成人三级做爰av| 国产欧美日韩亚州综合| 亚洲男女在线观看| 综合电影一区二区三区| 亚洲天堂岛国片| 亚洲h在线观看| 色婷婷久久久综合中文字幕| 精品亚洲aⅴ乱码一区二区三区| 日本裸体美女视频| 秋霞电影一区二区| 欧美日韩中字一区| av在线一区二区| 日韩午夜在线观看视频| 国产成人亚洲精品青草天美| 欧美一区二区三区性视频| 91在线观看一区二区| 日韩欧美电影一二三| 被黑人猛躁10次高潮视频| 国产精品色眯眯| 东方伊人免费在线观看| 日韩成人一区二区| 黄视频网站免费看| 激情五月激情综合网| 欧美变态口味重另类| 催眠调教后宫乱淫校园| 国产精品成人在线观看| 黄色正能量网站| 亚洲高清久久久| 欧美午夜一区二区三区 | 国产在线国偷精品免费看| 日韩亚洲欧美综合| 91精品又粗又猛又爽| 亚洲精品成a人| 91久久精品一区二区| 高清免费成人av| 中文无字幕一区二区三区 | 18禁裸乳无遮挡啪啪无码免费| 亚洲国产美国国产综合一区二区| 色成年激情久久综合| 99精品黄色片免费大全| 中文字幕视频一区| 中文字幕在线观看成人| 成人av在线观| 亚洲激情男女视频| 在线看日韩精品电影| 91小视频在线| 一区二区激情小说| 欧美四级电影网| 女性生殖扒开酷刑vk| 日日夜夜免费精品| 色综合久久天天| 国产在线日韩欧美| 国产亚洲欧美日韩日本| 国产午夜精品久久久久久久久| 国内欧美视频一区二区| 久久久国际精品| 日日操免费视频| 久久99九九99精品| 久久毛片高清国产| 四虎地址8848| 成人黄色网址在线观看| 亚洲欧美日韩综合aⅴ视频| 色偷偷男人天堂| 丰满少妇在线播放bd日韩电影| 国产精品国产馆在线真实露脸 | 精品一区二区三区免费| 国产亚洲欧洲997久久综合| 成人在线观看高清| 91在线云播放| 午夜欧美2019年伦理| 欧美成人伊人久久综合网| 久久视频精品在线观看| 成人av在线播放网址| 亚洲一区二区在线观看视频| 欧美一区二区三区四区在线观看| 成人国产精品久久久网站| 国产精品亚洲第一区在线暖暖韩国| 国产精品日产欧美久久久久| 在线免费观看一区| 久久久午夜精品福利内容| 另类成人小视频在线| 中文字幕中文乱码欧美一区二区| 欧美写真视频网站| 久久久久久久久久久国产精品| 国产麻豆精品一区二区| 26uuu精品一区二区| 谁有免费的黄色网址| 丰满放荡岳乱妇91ww| 亚洲一区二区三区四区在线 | 国产乱人伦偷精品视频不卡| 国产精品传媒视频| 91精品综合久久久久久| 欧美性受xxxx黑人| 一卡二卡三卡四卡五卡| 精品一区二区免费看| 亚洲欧美福利一区二区| 日韩你懂的在线播放| 日韩在线观看视频一区二区| 在线xxxxx| 国产电影精品久久禁18| 亚洲国产aⅴ天堂久久| 国产欧美日韩视频一区二区| 欧美日本高清视频在线观看| 337人体粉嫩噜噜噜| 黑人玩弄人妻一区二区三区| 国产伦理精品不卡| 亚洲午夜在线观看视频在线| 久久久激情视频| 欧美丰满高潮xxxx喷水动漫| 亚洲精品乱码久久久久久不卡| 国产成人自拍网|