[Lifetype] 一個Lifetype樣板(Template)的繼承架構

TemplateExtend

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"},那就可以達到共用樣板又可以讓使用這客製化的目的。

LifetypeTemplateExtend_01

LifetypeTemplateExtend_02

4.2. 建立使用者繼承的樣板

在使用這個樣板中,我只需要建立一個新的使用者樣板,並且針對公用樣板中需要繼承的template建立引用公用樣板的樣板。

LifetypeTemplateExtend_03

在這邊,由於我將公用的使用者樣板擺在misc資料夾裡面的nzr_comm資料夾裡面,所以在include的路徑裡面又多了一個nzr_comm的資料夾名稱。

LifetypeTemplateExtend_05

4.3. 修改需要自行修改的地方

在建立玩公用樣板,以及使用者建立繼承的樣板之後,使用者只需要在針對需要自己客製化的樣板做修改及實作,並且套用此樣板,就可以達到繼承公用樣板的目的了!

LifetypeTemplateExtend_04

目前尚未做到的地方

1. 目前系統尚無法跟使用者主動告知,目前有哪些樣板可以如此繼承,因此一定需要透過系統公告的方式,給使用者教學,如此的作法是不太人性化的,所以如果可以在系統裡面加上可繼承的樣板列表,那就更好了!

2. 由於將公用的樣板擺放在misc資料夾,而這個資料夾本來就是在擺放預設樣板的地方,所以在系統管理介面裡面是沒有一個可以直接存取編輯misc樣板的介面的,因此目前如果需要修改公用樣板的部份,就必需要透過本地修改在上傳到系統(主機 or Hosting),或進系統內直接修改;如果可以稍做一些修改使系統管理者,也可以透過網頁介面直接做公用樣板修改的話,那這個Template樣板的繼承架構想法就更加的完整了!

相關閱讀:

1. Lifetype 中文Wiki模版如何運作?
2. Lifetype 中文Wiki模版與 LifeType 物件

This entry was posted in LifeType. Bookmark the permalink.

6 Responses to [Lifetype] 一個Lifetype樣板(Template)的繼承架構

  1. Mark says:

    這也是個方式。

    如果要這樣做,應該把 那些可供 override 的樣版都改名,改為 .tpl …

    然後在 template editor 下,將可修改的 extension 設定為 *.css 與 *.tpl

    這樣子使用者就可以只修改他看的到的 .tpl 模版了。

    另外,要讓使用者知道哪些模版可以這樣做 …. 從模版命名的方式下去著手 …

    並且修改模版的 screen shots ..

    這樣使用者就知道哪些模版可以這樣改。

  2. mouson says:

    Mark:

    我自己目前是使用需要override的樣板名稱前面都加上’_'做分辨,
    目前這一個想法還有一些細節還需要再討論。
    包含您所說的樣板名稱的命名,
    及讓使用者方便的知道哪些是需要override的樣板等等….

    也許可以慢慢的修改,讓這個想法變成更加可行的樣板使用方案!

  3. 119like says:

    你好,我在

    http://forum.lifetype.org.tw/index.php?topic=4380.0

    这里给你回复过

    麻烦去看看

  4. mouson says:

    我已經在lifetype的forum上回應您囉!
    希望可以幫上您的忙

  5. beagle says:

    您好

    請教一個問題,我看了些有關smarty的文章想尋找可以隨機載入目錄下的文件

    我目前是用{include file="xxx.tpl"} 的方式

    但如果我希望能夠把xxx改成隨機的方式 請問大大有解決的方式嗎

    感謝~

  6. mouson says:

    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}

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*

您可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>