[Lifetype] 一個Lifetype樣板(Template)的繼承架構
- Posted by mouson on 2008/04/23 13:59
- 閱讀 (12614) | 迴響(6) | LifeType
在Lifetype系統裡面,有提供了共用的樣板,讓使用者可以自行選擇樣板來使用,而也有提供使用者自行上傳樣板的功能,當使用者需要為自己客製化使用樣板的時候,就可以由系統共用樣板中複製一份,然後在自行修改為自己所需要的客製化樣板。
但是當有多個使用者客製化使用同一份公用樣板,又遇上了公用樣板有結構上的修改,需要在所有使用此份樣板的部落格都套用上修改時,那就會變成一件非常麻煩的事情,系統管理者必須要去尋訪所有有用這份公用樣板的部落格,並且依依進行修改,其實很不符合經濟效益。
剛好,最近在AZhu Blog System上面也遇到了類似的問題,大家可以發現,目前在系統上面由不務正業紀實(mouson)、資訊筆記(mousontech)、奧斯汀(austin)等三個部落格所組成,而三個部落格其實都是使用Nonzero這一個樣板,只是在細部上的一些細節不太相同,整體架構上其實還是使用同一份樣板的,在從前如果CSS上面有些微的變動,在管理樣板時,就必須要尋訪這三個樣板,然後一一做修改,其實就變成相當的繁瑣,而且不符合在利用的精神。
那如果在Lifetype系統上面也可以有類似樣板繼承的架構,讓使用者依然保有細節自行微調的功能,但是像是CSS、大結構、img等可以共用的資源依然還是歸系統管理,那應該就可以解決目前的問題。
當然,在這邊會提出這樣的需求,其實就代表著mouson我有找到一些解決方案,雖然說還不是非常的完成,但是是一個已經在我的系統上面使用的方案,在這邊提出來給大家做參考。
要達到上述的功能,我們必需要可以做到幾件事情:
1. 公用的樣板必須擺在所有的使用者都可以存取到的地方。
2. 公用樣板中,必需要可以設定某些地方可以讓使用者自行修改。
3. 對於使用者而言,這個公用樣板還是可以像自己的樣板一樣,透過樣板編輯器修改想修改的地方。
這樣的想法其實就好像物件導向程式(OOP)裡面所提到的繼承,公用樣板的部份就像是Base Class,而讓使用者可以修改的地方就像是Base-Class裡面所訂立的Interface,因此只要是繼承這一個Class的Derived Class,就必須去實作(Implement) Base-Class所制定的Interface。
那在Lifetype的樣板系統上面我們要怎麼實作呢?(以下以我這一次實作的nonzero template為例)
1. 公用的樣板必須擺在所有的使用者都可以存取到的地方。
在目前的Lifetype樣板系統裡面,其實就已經有兩個可以公用存取的地方,一個是template資料夾裡面的「default」資料夾,另外一個也是在template資料夾裡的「misc」資料夾,兩者個差異在於misc資料夾可以在各個樣板中透過$misctemplatepath這一個變數當作樣板的路徑去做直接存取,而default資料夾裡面擺得template,則是在所設定的路徑裡面找不到該.template時,就會去詢問default資料夾裡面有沒有這一個template。
因此我們就透過這一個原則,在misc資料夾裡面,新增一個叫做nzr_comm的資料夾,專門擺放nonzero template可以公用的*.template,而在使用者的自己修改資料夾之中,只需要將九個一定要存在的樣板裡面(請參考模版如何運作?),分別針對各個樣板,用$misctemplatepath的變數指向公用樣板的路徑,就可以達到使用者樣板去使用系統所建立的公用樣板的目的了!
2. 公用樣板中,必須要可以設定某些地方可以讓使用者自行修改。
就如同上面所說的,在Base Class裡面,要在建立可以由Derived Class繼承並且實作的介面,因此必須在公用的Template裡面設定可以由使用者客製化的介面。
在目前的Template系統裡面,如果有需要共用的或重複性很高的Template,像是header、footer,那通常會把這些地方的程式碼獨立出來,變成一個template檔,然後在需要使用到他們的地方以{include file="XXXX.template"}的語法來Include他們,而這樣的作法,可以將他們轉移到目前所提出的這個概念。
前面有提到,當樣板中要使用misc資料夾裡面的template時,可以透過$misctemplatepaht變數指定路徑到/template/misc資料夾,而在Lifetype系統裡面,如果需要將路徑指定到目前使用的這個樣板路徑,則使用$blogtemplate的這個變數,而在Lifetype系統裡面,如果在misc裡面的template資料夾使用$blogtemplate變數的話,其變數指到的路徑依然會是使用者目前的template資料夾,而不是misc的這個資料夾。
透過上面所提到的include概念及存取目前blogtemplate的語法結合,如果在公用樣板裡面,如果有需要使用者自己去設定樣板,那就在那個地方使用{include file="$blogtemplate/XXXX.template"}的語法,而使用者只需要針對系統設定需要由使用者修改的做修改,那就可以達到客製化的目的了!
插入公用樣板中需要實作的圖
3. 對於使用者而言,這個公用樣板還是可以像自己的樣板一樣,透過樣板編輯器修改想修改的地方。
由於上面所提到的兩點,因此對於使用者而言,所看到的依然還是如從前的樣板一樣,可以透過Lifetype管理介面的樣板管理做新增刪除,並且透過樣板編輯器PlugIn做樣板的修改及客製化,所以對於使用者的使用習慣上,是沒有太大的轉變的,只需要針對系統設定需要自行修改的地方,為自己做客製化,就可以達到所有使用者依然共用同一份基本樣板,且使用者可以針對自己的使用狀況去做客製化,如此不但可以避免掉系統中有太多重複的樣板內容,也依然滿足使用者客製化樣板的需求。
4. 實作有這樣功能的樣板
4.1. 建立共用樣板
在我所使用的nonzero樣板裡面,針對樣板所需的幾個template做實作,並且在樣板裡面需要由使用者自己實作的地方用{include file="$blogtemplate/XXX.template"},那就可以達到共用樣板又可以讓使用這客製化的目的。
4.2. 建立使用者繼承的樣板
在使用這個樣板中,我只需要建立一個新的使用者樣板,並且針對公用樣板中需要繼承的template建立引用公用樣板的樣板。
在這邊,由於我將公用的使用者樣板擺在misc資料夾裡面的nzr_comm資料夾裡面,所以在include的路徑裡面又多了一個nzr_comm的資料夾名稱。
4.3. 修改需要自行修改的地方
在建立玩公用樣板,以及使用者建立繼承的樣板之後,使用者只需要在針對需要自己客製化的樣板做修改及實作,並且套用此樣板,就可以達到繼承公用樣板的目的了!
目前尚未做到的地方:
1. 目前系統尚無法跟使用者主動告知,目前有哪些樣板可以如此繼承,因此一定需要透過系統公告的方式,給使用者教學,如此的作法是不太人性化的,所以如果可以在系統裡面加上可繼承的樣板列表,那就更好了!
2. 由於將公用的樣板擺放在misc資料夾,而這個資料夾本來就是在擺放預設樣板的地方,所以在系統管理介面裡面是沒有一個可以直接存取編輯misc樣板的介面的,因此目前如果需要修改公用樣板的部份,就必需要透過本地修改在上傳到系統(主機 or Hosting),或進系統內直接修改;如果可以稍做一些修改使系統管理者,也可以透過網頁介面直接做公用樣板修改的話,那這個Template樣板的繼承架構想法就更加的完整了!
相關閱讀:
1. Lifetype 中文Wiki - 模版如何運作?
2. Lifetype 中文Wiki - 模版與 LifeType 物件
相關文章:
[Lifetype] 在每個Post的HTML Title加入文章標題
無名樣式的Template
在LifeType1.2的Summary頁面中,以最新發表的文章呈現最多迴響的文章
在每篇文章加入閱讀人數
於Template中加入文章統計
隨機文章
分享
引用網址
迴響
Re:
- posted by Mark on 2008/04/23 15:33
這也是個方式。
如果要這樣做,應該把 那些可供 override 的樣版都改名,改為 .tpl ...
然後在 template editor 下,將可修改的 extension 設定為 *.css 與 *.tpl
這樣子使用者就可以只修改他看的到的 .tpl 模版了。
另外,要讓使用者知道哪些模版可以這樣做 .... 從模版命名的方式下去著手 ...
並且修改模版的 screen shots ..
這樣使用者就知道哪些模版可以這樣改。
Re:
- posted by mouson on 2008/04/23 17:09
Mark:
我自己目前是使用需要override的樣板名稱前面都加上'_'做分辨,
目前這一個想法還有一些細節還需要再討論。
包含您所說的樣板名稱的命名,
及讓使用者方便的知道哪些是需要override的樣板等等....
也許可以慢慢的修改,讓這個想法變成更加可行的樣板使用方案!
Re:
- posted by 119like on 2008/10/15 11:35
你好,我在
http://forum.lifetype.org.tw/index.php?topic=4380.0
这里给你回复过
麻烦去看看
請問隨機檔案
- posted by beagle on 2008/12/07 17:04
您好
請教一個問題,我看了些有關smarty的文章想尋找可以隨機載入目錄下的文件
我目前是用{include file="xxx.tpl"} 的方式
但如果我希望能夠把xxx改成隨機的方式 請問大大有解決的方式嗎
感謝~
Re:
- posted by mouson on 2008/12/07 21:11
beagle,
不好意思,我對於smarty不熟,但稍微google後發現,他理論上是可以的!
你可以搜尋 「smarty include 動態 」
我有看到,這可能就是你要的答案了吧!
<?php
$smarty = new Smarty();
$html_dir ="default";
$tpl_dir ="tpl";
$smarty->assign("html_dir",$html_dir);
$smarty->assign("tpl_dir",$tpl_dir);
$smarty->display("test.tpl");
?>
test.tpl
{include file=$tpl_dir."/".$html_dir."/main_top.htm" title=foo}









