2011-11-01 194 views
2

作爲我正在開發的一個大學項目(基於自定義MVC的項目管理系統)的一小部分,我需要開發一個模板引擎。我不想使用像Smarty這樣的自我係統,因爲我自己編寫了項目的所有其他部分,現在不想再回頭了。定製PHP模板引擎

無論如何,我已經成功地編寫一些簡單的,到目前爲止,我有一個類,創建它的一個實例,一些數據添加到實例,然後傳遞一個模板文件。該文件具有一系列標籤,例如{this},然後替換爲數據。簡單。

我遇到的問題是,當涉及到循環的東西 - 即用戶的表或類別的列表。目前,我有一個頁面模板文件(users.html),其中包含開始和結束標記,並在它們之間有一個名爲{users}的模板標記。然後我有另一個模板文件(users-detail.html),它顯示一個包含用戶信息的表格行。我正在創建一個users-detail.html模板的新實例,添加數據,解析它,然後將輸出(HTML的字符串)到數組中。然後,我循環這個數組,將所有字符串連接在一起,然後將其分配給users.html模板文件中的{users}標記。

正如你可能從這個解釋中得知的那樣,它有點不穩定,並且可能有更好的方法來完成我試圖實現的目標。理想情況下,我希望儘可能避免在模板文件中使用PHP,並且我經常需要在一個模板文件中有多個循環。

如果任何人有任何關於如何實現這一點的提示/建議,或任何教程,我可以按照獲得一些靈感,將不勝感激。

在此先感謝。

+3

查看h2o模板的源代碼 - https:// github。com/speedmax/h2o-php - 應該幫助你在路上 – kieran

+1

爲什麼不看看現有的模板引擎的代碼,你有什麼需要並從中學習?什麼比實際例子更好? – hakre

回答

1

我以前見過這種方法(包括循環內部的另一個模板)。我曾經使用舊版本的vbulletin,該版本確實(或做過)。它讓煩人的事情變得複雜起來,因爲你不能只爲模板添加一個循環 - 沒有爲每個循環層設置一個全新的模板。

我建議你不要沿着Smarty的路線走。

經典,這樣的說法:

我不希望使用關閉自拍系統,如Smarty的,因爲我已經寫了項目的每個另一部分自己,不想回去現在。

...表明你真的應該只是使用Smarty。在現實世界中,這將是你自己重新實現某些東西的可靠理由。但我喜歡你,並且我明白你想要自己實現某些東西(因爲你想學習,你覺得它很有趣,你是一個完美主義者等等)。只要你在你自己的時間做,這是一個個人項目,去做吧。

研究Smarty是如何工作的(不僅僅是語法,而且它是如何編譯模板,存儲編譯版本等)值得研究。你很自在地用PHP編寫一個記號器/解析器,它可以編譯你的模板語言並輸出PHP嗎?如果你足夠先進的話,就去做吧。最簡單的是,你閱讀{foreach from=$something}這樣的標籤,並以某種方式將其翻譯爲<?php foreach ($something as $thing) { ?>。您檢查標記類型等以確保模板標記有效,等等。