ด้วยความที่ใช้ smarty มาเป็น template engine จนติด พอผมมาเริ่มใช้ zend framework ก็เลยหาอ่านบทความว่า จะเอา smarty นี้มาใช้ร่วมกันได้ไหม เพราะว่า มีหลายอย่างที่ทำกับ smarty แล้วง่ายดี และยังไม่อยากจะปรับทุกสิ่งทุกอย่าง เข้า Zend_View (จริงๆ แล้วจะบอกว่าขี้เกียจก็ไม่ผิด) ซึ่งก็พบว่า สามารถเอามาใช้ร่วมกันได้ ไม่มีปัญหา เพราะทาง zend เค้าออกแบบ framework ตัวนี้มาให้ยืดหยุ่นมากทีเดียว เราสามารถจะเพิ่มเติม หรือปิดไม่ใช้ อะไรก็ได้

และพอเริ่มจะเอา smarty มาใช้จริงๆ ก็เริ่มหาอ่านว่าชาวบ้านเขาทำกันยังงัย ก็พบที่เขาถกกันอยู่ 2 สายหลักๆ ดังนี้

1. Extends Zend_View และผสาน Smarty เข้าไป

สร้าง View เป็นของตัวเอง เช่นอาจจะชื่อ Smarty_View โดย extends มาจาก Zend_View (หรือ Zend_View_Abstract) เช่น

class Smarty_View extends Zend_View_Abstract
{
}

แล้วทำการ overide method ของ Zend_View ด้วยส่วนหนึ่ง เพื่อผสานเอา smarty เข้ามา อ่านรายละเอียดได้ที่นี่ วิธีนี้ก็เหมือนการเอา smarty มาผสาน (intregate) เข้ากับ Zend_View โดยเรายังสามารถใช้ความสามารถของ Zend_View ได้อย่างเต็มที่ และเขียน template ได้แบบ smarty แต่วิธีนี้ จะยุ่งหน่อยตอนที่จะ overide method บางส่วนของ Zend_View เช่น ในบทความที่ไปดูมา เขาต้อง overide method ต่างๆ ได้แก่ __construct(), _run(), assign(), escape(), output() และ isCached() และตอนเรียกใช้งานก็จะใช้ในแบบของ Zend_View คนที่ติด smarty (อย่างผม) ที่วันๆ นั่งเรียก assign() ก็ต้องมีปรับกระบวนกันนิดหน่อย

2. ปิด Zend_View ซะ แล้วก็ใช้ Smarty แทน

อีกสาย เค้ามองว่า เค้าไม่ชอบ Zend_View ลองอ่านได้ที่นี่ และเทอดทูล smarty ว่าเป็น template engine ที่ดีที่สุดในโลก (โลกของคนรัสเซีย หรือเปล่าหว่า อิอิ)

ข้อความต้นฉบับ ".... Zend_View has ability to use your own filters and helper functions, but with Smarty you don't need them because Smarty has its own plugins, filters, modifiers. Just forget about Zend_View and use best template engine for PHP in the world!"

อีกเหตุผลคือ เขามองว่า เขาจะไม่ใช้ Zend_View จะใช้ smarty เท่านั้น จึงไม่มีเหตุผลที่จะต้อง extends (ดังที่เราจะทราบอยู่แล้วว่า การ extends มาจาก class แม่นั้น จะสืบทอดทุกอย่าง (ที่ไม่ใช่ private) มาจากแม่ด้วย) สายนี้เขาจึงแนะนำให้ปิด การเรียกใช้ Zend_View โดยให้เซตค่า 'noViewRenderer' เป็น true ใน Zend_Controller_Front เช่น

...
$frontController->setParam('noViewRenderer', true);
...

แล้วในตอน implement action ต่างๆ ใน controller ก็เรียกใช้งาน smarty แล้วการ assign() หรือ fetch() หรือ display() ที่เราคุ้นเคย ก็จะได้เหมือนเดิม ลองดูรายละเอียดได้ที่นี่

โดยส่วนตัวผมเอง ผมก็ใช้แบบสายที่ 2 คือปิด Zend_View และใช้ smarty แทน ไม่ใช่ไม่ชอบ Zend_View หรืออะไรหรอกน้ะครับ แต่ผมชอบ smarty มากกว่า และ smarty ก็เก่งมาก ทั้งยังมี plugins ส่วนตัวที่เขียนเก็บเอาไว้บ้างนิดหน่อย ถ้าจะทิ้งไปก็เสียดาย :)

แต่ท่านไหนจะใช้อะไร อย่างไร ก็แล้วแต่ชอบ แล้วแต่วาระ โอกาส และสิ่งแวดล้อมของงานก็แล้วกันน้ะครับ :)