關於PHP的模板的確是說來容易做來麻煩的事。隨便一數大概有20種以上的選擇,光pear裡面就包含了5中不同的模板,實在讓人頭痛。
千萬不要人雲亦雲的說這個好那個不好,選擇模板之前最好先搞清楚模板的真正目的是什麼? 簡單地說,模板的核心目的就是一個team work。主要的作用方式有兩種:
1、分離HTML和PHP使網頁設計師和PHP程式設計師合作更加愉快。
2.分離顯示邏輯和事物邏輯,使得核心事務邏輯的變更和應用程式的擴展更加容易和靈活,也就是說使得程式設計師之間合作更加愉快。 (這點常被人們忽略或誤解,總以為把PHP從HTML中弄出去就叫分離顯示邏輯和事物邏輯了,如果這樣當初又何苦讓PHP和html 混在一起呢?)
搞清楚這個模板的真正目的是什麼,就容易做出正確的選擇了。
如果只有你一個php程式設計師但需要和其他的網頁設計人員一起協同工作,那麼選擇能夠分離HTML和PHP的模板就可以了,phplib (現在好像整合到Pear 裡面了http://pear.php.net /package/HTML_Template_PHPLIB )或者
FastTemplate 都是這樣的東西,很簡單容易上手。
如果你的網站介面比較醜陋並且主要由程式設計師來完成,但是功能比較複雜更需要強大的擴充功能,需要分離各個層次包括顯示邏輯,那麼不要用什麼特別的東西,PHP本身就是最好的模板了。要注意的是在這種情況下,你要非常認真的設計你的程序,始終記住要分離的不是PHP和html 而是事務邏輯(business logic )和顯示邏輯(presentation logic)。這也是為什麼我一直對於Smarty 這種東西非常的抵觸, 因為這個Smarty 的語法太複雜了太強大了, 幾乎重新發明了一種腳本語言東西, (即使是PHP的程式設計師也要重新學習它)。更讓人費解的是這種腳本越是強大,越容易讓人將事務邏輯(business logic )和顯示邏輯(presentation logic)混在一起, 破壞了模板的初衷。
如果你既想HTML和PHP分離,得到更好的視覺設計,又想整個系統有非常強大的擴展能力能夠適應html,xml,wml各種介面,而且不用去學習複雜的語法的同時提供較高的運作效率,那麼這就是一個相當有挑戰性的問題了。壞消息是目前還沒有一個成熟的模板真正能夠達到這樣的要求,好消息是完成這樣的一個模板並不是很難,如果你嘗試過Zope或者是ColdFusion就會發現這種模板的影子,
(wact http://wact.sourceforge.net/和phptal http://phptal.sourceforge.net/就是朝這個方向發展,應該很有前途)。
模板和資料的結合(模板的呼叫)方式主要有兩種:推的方式和拉的方式。
推的方式是用PHP將資料推給模板,就是說需要程式設計師明確地為模板中的每一個變數賦值,將他們綁起來。
而拉的方式則像把php 和html 混在一起一樣,模板種的變數主動把資料拉進來。
說到模板就不能不提到另外兩種東西:
phphtmllib 和quickform( http://pear.php.net/package/HTML_QuickForm ) 這兩種東西是用傳統的方式來透過各種頁面構件來完成HTML的頁面的整個頁面的建構完全掌握再程式設計師手裡,也許許多編寫過傳統GUI桌面程式的程式設計師都喜歡這種方式。
更漂亮的方案
如果做商業軟體的話,Flash應該是比較漂亮的方案(別搞錯了,別以為就你知道php支援ming 和swf函式庫可以動態產生Flash,我說的不是這個。)我要說的是支援Flash Remoting 的方案,這種東西才是真正有意義的PHP和flash的結合。由視覺設計師完成flash部分,PHP 程式設計師透過flash remoting 的方式將資料傳送到flash 做成的客戶端。
目前有兩種方案:
AMFPHP
由於Macromedia Flash Remoting 傳輸資料時使用的是一種特有的更有效率資料格式, 所以AMFPHP透過分析資料格式,在伺服器端建構了對應的php類別來接收,解析和編碼這些資料從而達到交換資訊的功能(就像Samba一樣,應該屬於一種Hacking 吧)。
PHPObject
http://ghostwire.com/resources/phpobject/
PHPObject 則採用了另一種方法,透過在flash中嵌入一些actionscript的元件透過開放的格式soap來傳送資料。
其實關於PHP的模板還牽扯到很多其它的問題,一時半會我也只能寫這麼多了。