Smarty : Template Engine สำหรับ PHP

หลังจากห่างหายไปเสียนาน เนื่องจากติดภาระกิจทางครอบครัว อย่างที่คุณเชได้แปะประกาศไว้ พอเสร็จภาระกิจดังกล่าวแล้วจะชักช้าอยู่ใย ก็ต้องมาอัพเดดเวบไซท์สุดรักสักเล็กน้อย เพราะกลัวเหล่าบรรดาคนดูจะหนีหายไปเสียหมด แล้วกำลังใจในการเขียนก็จะลดลงตามไปด้วย สุดท้ายเวบ BioLawCom.De อาจกลายสภาพเป็นเวบร้างรกอินเตอร์เนตได้ (ว่าไปนั่น)
เรื่องแรกที่ผมภูมิใจนำเสนอหลังจากห่างหายไปเสียนาน เป็นเรื่องเกี่ยวกับเครื่องมือในการเขียนโปรแกรมตัวหนึ่งที่น่าสนใจไม่น้อยเลยทีเดียว นั้นคือ Smarty ซึ่งเป็นTemplate Engine ที่ใช้กับภาษาเขียนโปรแกรมยอดนิยมอย่าง PHP หากใครอยากรู้ว่า Template Engine คืออะไร ใช้งานอย่างไร มีข้อดีอย่างไร เชิญติดตามออ่านได้เลยครับ ....
ปัญหาที่ใหญ่อย่างหนึ่งที่เจอในการเขียนโปรแกรมเกือบทุกภาษาคือ การแยกส่วนต่าง ๆ ออกจากกัน เพื่อให้นักเขียนโปรแกรมที่มีความรู้ความสามารถในด้านที่แตกต่างกัน สามารถทำงานร่วมกันได้อย่างมีประสิทธิภาพ หลักการที่นิยมใช้ในการแยกส่วนต่าง ๆ ของโปรแกรมออกจากกันหลัการหนึ่งคือ MVC หรือModell View Control โดยจะแยกส่วนต่าง ๆ ของโปรแกรมออกเป็นสามส่วนใหญ่ ๆ คือ
1 Modell คือ ส่วนของการจัดเก็บข้อมูล โดยเฉพาะอย่างยิ่งข้อมูลในฐานข้อมูล ส่วนมากแล้ว นักเขียนโปรแกรมที่รับผิดชอบในส่วนนี้ มีหน้าที่ออกแบบตารางในฐานข้อมูล และความสัมพันธ์ระหว่างตาราง
2 View คือ ส่วนของการติดต่อกับผู้ใช้ ซึ่งก็หมายถึง User Interface นั่นเอง
3 Control คือ ส่วนควบคุมการทำงานของโปรแกรม อาจมองเป็นส่วนเชื่อมระหว่าง Modell และ View ก็ได้ แต่จริง ๆ แล้ว Control มีหหน้าที่ควบคุมการทำงานของโปรแกรมทั้งหมด
ในภาษาเขียนโปรแกรม PHP (ที่เป็นค่าปริยาย) แทบไม่มีเครื่องมือใด ๆ ที่เอื้อต่อการเขียนโปรแกรมแบบ MVC เนื่องเพราะ โดยพื้นฐานแล้ว PHP เป็นภาษาเขียนโปรแกรมที่ถูกออกแบบให้เป็นเครื่องมือสำหรับการเขียนเวบไซท์ส่วนตัว แต่เมื่อ PHP ได้รับความนิยมมากขึ้นเรื่อย และถูกนำไปใช้ในโครงการขนาดใหญ่มากขึ้น จึงมีความจำเป็นอย่างยิ่งในการนำเครื่องมืออื่น ๆ มาใช้ในการเขียนโปรแกรม เพื่อให้เหมาะสมกับงานขนาดใหญ่
Template Engine เป็นเครื่องมือชิ้นหนึ่งที่ช่วยแยกส่วน View และ Control ออกจากกันได้ โดยส่วนของ Control ก็คือส่วนของโปรแกรมที่เขียนขึ้นด้วย PHP ซึ่งไม่จำเป็นต้องมีส่วนของการแสดงผลใด ๆ เลยอยู่ในตัวโปรแกรม (โดยปกติแล้วโปรแกรมที่เขียนด้วย PHP จะมีส่วนของการแสดงผลซึ่งก็คือ HTML รวมอยู่กับส่วนอื่น ๆ ของโปรแกรมอยู่ในไฟล์หนึ่งไฟล์) สำหรับส่วนของการแสดงผลนั้นจะถูกเก็บไว้ในอีกไฟล์หนึ่งซึ่งเรียกว่า Template หน้าที่ของ Template Engine คือรวมสองส่วนเข้าด้วยกัน ในขณะที่โปรแกรมถูกเรียกใช้
ประโยชน์ที่ได้รับในการใช้ Template Engine คือ คนเขียนโปรแกรมและคนออกแบบหน้าตาเวบไซท์สามารถทำงานแยกส่วนกันได้ อีกทั้งการปรับปรุงหน้าตาเวบไซท์ก็สามารถทำได้ง่ายขึ้น เพราะไม่ต้องเข้าไปยุ่งเกี่ยวกับส่วนอื่น ๆ ของโปรแกรม
เทคโนโลยีอื่นที่มีคุณสมบัติคล้ายกับ Template Engine คือ XSLT ที่ใช้กับเอกสาร XML โดย XSLT มีข้อได้เปรียบในเรื่องมาตรฐานที่เป็นกลางกว่า Template Engine แต่การใช้งานยุ่งยากว่า Template Engine เนื่องจากต้องมีการออกแบบเอกสาร XML ก่อน จึงสามารถใช้งาน XSLT ได้ ซึ่งการออกแบบเวบไซท์นั้นไม่จำเป็นต้องมีการออกแบบเอกสาร XML แต่อย่างใด ข้อได้เปรียบอีกอย่างของ Template Engine คือ เรื่องของความเร็ว โดยเฉพาะอย่างยิ่งเอกสารที่มีความซับซ้อนสูง XSLT จะทำงานได้ช้ากว่า Template Engine มาก
Smarty เป็น Template Engine ที่ได้รับการสนับสนุนจาก PHP โดยตรง มีการติดตั้งที่ง่าย เพียงแค่คัดลอกไฟล์ที่จำเป็นลงบนเวบเซิร์พเวอร์ก็สามารถใช้งานได้ทันที (ขั้นตอนการติดตั้งอย่างละเอียดอ่านได้ที่ Smarty Quick Install) ใช้ได้ทั้งกับ PHP 4 และ PHP 5 ใช้งานง่าย และเป็นต่อในเรื่องความเร็ว
ในบลอคของผมบลอคนี้คงไม่กล่าวถึงการใช้งาน Smarty อย่างละเอียด (เอกสารอย่างละเอียดสามารถอ่านได้ที่ Smarty Documentation) แต่ขอยกตัวอย่างการใช้งานเล็ก ๆ น้อย ๆ เพื่อให้ผู้อ่านเห็นภาพการใช้งานที่จัดเจนขึ้น และสามารถเริ่มต้นใช้งาน Smarty ได้ง่ายขึ้น
โค้ด PHP ต่อไปนี้เป็นโค้ดที่ใช้แสดงชื่อ และเบอร์โทรศัพท์ที่สมมติขึ้น โดยให้อยู่ในรูปแบบตาราง และใช้โครงสร้างของ PHP โดยปกติ
<?php $tel = Array("MrBlue" => "08001234567", "MrPink" => "08007654321", "Mrblue" => "08007777777", "MrWhite" => "08006655444" ); echo("<table>"); echo("<tr>"); echo("<th>Name</th>"); echo("<th>Tel.</th>"); echo("</tr>"); foreach($tel as $key=>$value){ echo("<tr>"); echo("<td>$key</td>"); echo("<td>$value</td>"); echo("</tr>"); } echo("</table>"); ?>plain code
เมื่อเรียก Script ดังกล่าวมาใช้งานก็จะได้ผลดังนี้
<table> <tr> <th>Name</th> <th>Tel.</th> </tr> <tr> <td>MrBlue</td> <td>08001234567</td> </tr> <tr> <td>MrPink</td> <td>08007654321</td> </tr> <tr> <td>Mrblue</td> <td>08007777777</td> </tr> <tr> <td>MrWhite</td> <td>08006655444</td> </tr> </table>plain code
สำหรับการใช้งาน Smarty ในขั้นแรกอาจดูยุ่งยากกว่าเล็กน้อย เพราะต้องมีการปรับแต่งค่าต่าง ๆ และต้องเรียนรู้โครงสร้างของ Smarty เพิ่มเติม
<?php $tel = Array("MrBlue" => "08001234567", "MrPink" => "08007654321", "Mrblue" => "08007777777", "MrWhite" => "08006655444" ); require '../libs/Smarty.class.php';// เพิ่ม Class ของ Smarty ลงในสคริป $smarty = new Smarty; // กำหนด Constructuer ของ Smarty $smarty->assign("template_tel",$tel);// ส่งค่าตัวแปร $tel ไปยัง Template $smarty->display('test.tpl');//กำหนดไฟล์ที่ใช้เป็น Template ?>plain code
สำหรับข้อได้เปรียบแรกที่เห็นได้ชัดในการใช้งาน Smarty คือ ในตัวโปรแกรมไม่มี HTML-Tag อยู่เลยแม้แต่น้อย ส่วนของ HTML จะถูกกำหนดใน Template-File ซึ่งในที่นี้ก็คือ test.tpl
<table> <tr> <th>Name</th> <th>Tel.</th> </tr> {foreach key=tel_key item=value from=$template_tel} {*เปรียบได้กับ foreach($template_tel as $tel_key => $value ) ใน php*} <tr> <td>{$tel_key}</td> {*เปรียบได้กับ echo($tel_key); ใน php*} <td>{$value}</td> {*เปรียบได้กับ echo($value); ใน php*} </tr> {/foreach} </table>plain code
การใช้งาน Smarty ต้องสร้างโฟลเตอร์เพิ่มเติมสองโฟลเดอร์คือ templates สำหรับเก็บ Template (*.tpl) และ templates_c สำหรับไฟล์ที่ใช้ในการคอมไพล์ Smarty จะคอมไพล์ Template เมื่อ Template ได้รับการเปลี่ยนแปลงแก้ไขเท่านั้น
การใช้งาน Template Engine จะมีประโยชน์มาก ในกรณีที่โปรแกรมต้องแสดงผลต่างกันภายใต้ปัจจัยที่ต่างกัน ตัวอย่างที่ดีตัวอย่างหนึ่งคือการแก้ปัญหาเรื่องการแสดงผลของ Web-Browser ที่ต่างกัน ที่อาจได้รับการแก้ไขโดยการแสดง HTML-Tag ที่แตกต่างกันในแต่ละ Web-Browser (โดยปกติแล้วสามารถแก้ไขได้โดย CSS ในกรณีที่สุดโต่งมาก ๆ เท่านั้นที่ต้องแก้ไข HTML) การใช้เพียง PHP ในการแก้ปัญหาดังกล่าวเป็นเรื่องที่ยุ่งยากมาก ๆ แต่หากมี Template Engine เข้ามาช่วย การแก้ปัญหาดังกล่าวก็จะง่ายขึ้นมาก โค้ดข้างล่างนี้เป็นหนึ่งตัวอย่างในการแก้ปัญหาดังกล่าว
<?php $tel = Array("MrBlue" => "08001234567", "MrPink" => "08007654321", "Mrblue" => "08007777777", "MrWhite" => "08006655444" ); require '../libs/Smarty.class.php'; $smarty = new Smarty; $smarty->assign("template_tel",$tel); if(preg_match("MSIE",$_SERVER[HTTP_USER_AGENT])){ $smarty->display('bad_browser.tpl'); } else{ $smarty->display('standard.tpl'); } ?>plain code
นอกจากนี้ Template Engine จะมีประโยชน์มากในการออกแบบโปรแกรมจำพวก CMS (Content Management System) จะทำให้โปรแกรมมีความยืดหยุ่นมากขึ้น ทำให้เหล่า web-designer ทำงานได้ง่ายขึ้น และที่สำคัญที่สุดการใช้ Template Engine ทำให้โปรแกรมมีโครงสร้างที่ชัดเจนและสมบูรณ์มากขึ้น
| Ref : biolawcom.de/blog/311 |









