Smarty::template engine ที่ทันตแพทย์ส่วนใหญ่เลือกใช้

ช่วงนี้มีหลายคนถามผมมา​เกี่ยว​กับ​เรื่องของ​ “Template Engine” ​หลายคน​ ​ก็​เลยคิดว่าน่า​จะ​ทำ​เป็น​บท​ความ​เล็กๆ​ ​ซะหน่อย​ ​เพราะ​ถ้า​เป็น​ ​บท​ความ​ใหญ่ๆ​ ​รับรองเรื่องมันยาว​ ​แน่นอน

พูด​ถึง​ Template Engine ​นั้น​มีหลายตัวมาก​ ​เลย​ทั้ง​ bTemplate, FastTemplate, TemplatePower, TBS (TinyButStrong), PatTemplate, etc.

เรียก​ได้​ว่ามีมากมายเยอะ​แยะ​ไปหมด​ ​แต่ที่ชนะ​ใจผม​และ​ ​คน​ทั่ว​โลก​ ​ทิ้งห่างแบบ​ไม่​เห็นฝุ่น​ ​รวม​ทั้ง​ได้​รับการรับรอง​จาก​ PHP ​โดย​ตรงก็คือ​ “Smarty Template Engine” ​นั่นเอง​ ​ด้วย​ความ​ที่ตัวมันทำ​งาน​ได้​ยืดหยุ่น​ ​มีคน​ใช้​เยอะ​ ​ทำ​ให้​มีการแชร์ข้อมูลมาก​ ​พัฒนาอย่างต่อ​เนื่อง​ ​ที่สำ​คัญ​ Absolutely Free ​ทำ​ให้​หลายๆ​ ​คนเลือกที่​จะ​ใช้​มันสำ​หรับ​ ​พัฒนา​โปรเจค​ใหญ่ๆ​ ​วันนี้ผมก็​เลย​จะ​มา​แนะนำ​คร่าวๆ​ สักหน่อย

ประ​โยชน์ของ​ Template Engine
ประ​โยชน์ของระบบ​ Template ​นั้น​มีมากมายเลยล่ะ​ ​โดย​ผมแบ่งออก​เป็น​ ​ข้อ​ใหญ่ๆ​ ​ได้​ดังนี้

1.​สามารถ​แยก​ Code ​ออก​จาก​ Design ​ได้​ ​ทำ​ให้​การทำ​งาน​ทั้ง​ 2 ​ฝั่ง​ไม่​ต้อง​รองาน​กัน
2.​สามารถ​ทำ​ระบบ​ ​แยก​ Theme ​แบบหลายๆ​ตัว​ ​ได้​เป็น​อย่างดี​ (นึก​ถึง​ระบบ​ WP)
3.​ทำ​ให้​โคดสั้นลง​เพราะ​ไม่​จำ​เป็น​ต้อง​มา​แทรก​ html ​ใดๆ​ ​ใน​หน้า​ Code ​และ​สะดวกต่อการ​ debug ​เพราะ​ไม่​ต้อง​มานั่งไล่​โคดไป​ ​ดู​ html ​ไป
4.​สามารถ​พัฒนาต่อ​ได้​ง่าย​ใน​กรณี​ ​สับมือ​กัน​ทำ​หรือ​ ​ต่อยอด​ ​เพราะ​โคดที่​ต้อง​แก้​ ​มี​แค่ภาษา​โปรแกรมมิ่ง
5.​ไม่​ต้อง​เรียกตัวแปร​ ​ซ้ำ​ซ้อน​ ​ใน​กรณีที่​ ​มีการ​ใช้​ตัวแปร​ ​นั้นๆ​ ​หลายจุด
6.​มี​ plugins ​เสริมต่างๆ​ ​ทำ​ให้​ลดเวลา​ใน​การพัฒนา​ ​เช่น​ (cache, thumnail, captcha, paging, tags, ajax, calendar)
7.​สามารถ​พัฒนา​ Software ​ให้​ดู​เป็น​มืออาชีพ​ ​และ​โคด​ ​มี​ความ​สวยงาม

ความ​เข้า​ใจเบื้องต้น
การ​ใช้​งาน​นั้น​ก็​ไม่​ยากเลยครับ​ ​ก่อน​อื่น​ให้​ดาวน์​โหลด​ ​โปรแกรม​จาก​ที่นี่​ Smarty Download

ก่อน​จะ​ทำ​งาน​กับ​ Smarty ​เรา​จะ​ต้อง​มี​ความ​เข้า​ใจระบบของมันสัก​เล็ก​น้อย​ ​การทำ​งานของ​ Smarty ​นั้น​ ​เป็น​ระบบที่​ ​อ้างอิง​ Template ​จาก​ ​โฟลเดอร์

/templates/

เมื่ออ่านค่า​ได้​ทั้ง​หมด​แล้ว​จะ​ถูก​ Compile ​ออกมา​เป็น​ php ​เก็บ​ไว้​ใน​โฟลเดอร์

/templates_c/

ซึ่ง​โฟลเดอร์พวกนี้​เรา​สามารถ​แก้ตำ​แหน่ง​ ​ของมัน​ได้​ ​ที่​ต้อง​ทำ​แบบนี้​เพราะ​จะ​ได้​ลดเวลา​ ​ใน​การอ่านข้อมูล​และ​ ​แสดงผล​ ​ไม่​ต้อง​มาทำ​ซ้ำ​ทุกๆ​ ​ครั้ง​ ​อันนี้​เป็น​จุดที่ผมคิดว่า​เหนือกว่า​ Template Engine ​ยี่ห้อ​อื่นๆ​

รูปแบบการ​ใช้​งานเบื้องต้น

  1. <?php
  2. include (’smarty/Smarty.class.php’); // include ​ตาม​ path
  3. $smarty = new Smarty(); // ​เรียก​ Obj
  4. $smarty->compile_check = true; // ​ตั้งค่า​ ​ว่า​จะ​ให้​ re-compile ​หรือ​ไม่​ ​ถ้า​ระบบนิ่ง​แล้ว​ ​ตัง​เป็น​ false ​ไปเลย​ ​จะ​ช่วย​ลดการ​ใช้​งาน​ ​ทรัพยากรระบบ​ได้
  5.  
  6. $smarty->assign(‘title’, ‘Introduce Smarty’); // ​ทดลอง​ assign ​ค่า​ ​แบบ​ single
  7. $smarty->assign(array(‘charset’=>‘utf-8′, ‘keywords’=>‘1, 2, 3′)); // ​ทดลอง​ assign ​ค่า​แบบ​ multiple
  8. $smarty->assign(‘years’, array(‘2004′, ‘2005′, ‘2006′)); // ​ทดลอง​ assign ​ค่า​ ​แบบ​ array
  9.  
  10. $smarty->display(‘index.tpl’); // ​อันนี้​จะ​เป็น​การเรียกไฟล์ที่​ ​อยู่​ใน​ /templates/index.tpl ​มา​ใช้​งาน
  11. ?>

  1. <html>
  2. <head>
  3. <title>{$title}</title>
  4. <meta http-equiv="content-type" content="text/html; charset={$charset}​" />
  5. <meta name="keywords" content="​{$keywords}​" />
  6. </head>
  7. <body>
  8.  
  9. {foreach from=$year item=x}
  10.     {$x}
  11.  
  12. {/foreach}
  13.  
  14. </body>
  15. </html>


การใช้คำสั่งเปรียบเทียบค่า

หลายๆ​คนที่​เขียนโปรแกรมมาคง​จะ​ชิน​กับ​การเทียบค่า​ ​โดย​ใช้​ ​พวกคำ​สั่ง​ if, else ​ดี​อยู่​แล้ว​ ​แต่คราวนี้​เรา​จะ​ย้ายคำ​สั่งพวกนี้มา​เขียน​ใน​ tpl ​แทนครับ​ !

  1. <?php
  2. #include smarty
  3. #
  4. #
  5. $currentpage = basename($_SERVER[‘PHP_SELF’]);
  6. $smarty-assign(‘currentpage’, $currentpage);
  7. $smarty->display(‘condition.tpl’);
  8. ?>

  1. <html>
  2. ….
  3.  
  4. <ul>
  5. <li>{if $currenpage eq ‘index.php’}<b>Home</b>{else}Home{/if}</li>
  6. <li></li>
  7. <li></li>
  8. </ul>
  9.  
  10. ….
  11. </html>

นี่​เป็น​การเปรียบเทียบค่าง่ายๆ​ ​ใน​ไฟล์​ tpl ​ครับ​ ​ซึ่ง​สามารถ​เรียก​ได้​เหมือนการเขียนโปรแกรมบน​ php ​เลย​ ​ลองศึกษา​ ​ตารางค่าการเปรียเทียบเพิ่มเติม​จาก​ที่นี่

http://smarty.php.net/manual/en/language.function.if.php

นอก​จาก​ค่าพื้นฐานพวกนี้​แล้ว​ Smarty ​ยัง​มี​ ​คุณสมบัติ​ ​ใน​การนำ​ Function ​เข้า​ไป​ใช้​ ​หลายรูปแบบ​ ​ทั้ง​แบบ​ modifier, function, block, outputfilter, prefilter, postfilter

โดย​ที่บางคำ​สั่งของ​ php ​เรา​สามารถ​นำ​เข้า​ไป​ใช้​ได้​โดย​ตรง​ ​อาทิ​เช่น​ in_array, arry_key_exists, etc.

การสร้าง function ขึ้นเองเพื่อใช้งานร่วมกับ smarty

การสร้าง​ Function ​เพื่อเอา​ไป​ใช้​ใน​ไฟล์​ TPL ​ของ​ Smarty ​ทำ​ได้​หลายแบบมากๆ

1.Block
การสร้าง​ ​แบบ​ Block ​นั้น​คือเรา​จะ​ทำ​การสร้างฟังก์ชั่นมา​เพื่อ​ให้​ ​ข้อมูล​ใน​ block ​ทั้ง​หมดทำ​งานตามที่​ Function ​กำ​หนด​ ​เช่น

// block.php

  1. <?php
  2. function dupContent($params, $content, &$smarty, &$repeat) {
  3. $content = str_repeat($content, $params[‘num’);
  4. return $content;
  5. }
  6.  
  7. $smarty->register_block("dubContent", "dupContent");
  8. ?>

// block.tpl

  1. <html…
  2.  
  3. {dupContent num=2}
  4. Hello Smarty
  5. {/dupContent}
  6.  
  7. …html>

จาก​ตัวอย่างข้างบน​ถ้า​เรารัน​ ​โปรแกรมเราก็​จะ​ได้​ค่าออกมา​เป็น

Hello Smarty Hello Smarty

—————————————————-
2.Function
การสร้าง​ Function ​เพื่อ​เข้า​ไป​ใช้​ใน​ไฟล์​ tpl ​ก็​ไม่​ยากอีกเช่น​กัน​ออก​จะ​ง่ายกว่า​ด้วย​ซ้ำ​ลองมาดูตัวอย่าง​กัน

// function.php

  1. <?php
  2. function timer($params) {
  3. return date($params[‘format’], time());
  4. }
  5.  
  6. $smarty->register_function("timer", "timer");
  7. ?>

// function.tpl

  1. <html…
  2. {timer format="d/m/Y H:i:s"}
  3. …html>

จาก​ตัวอย่างด้านบนเรา​จะ​ได้​ค่าออกมา​เป็น​เวลาปัจจุบัน​ใน​รูปแบบ​ dd/mm/yyyy hh:mm:ss

—————————————————-
3.modifier
เป็น​การสร้าง​ function ​เพื่อไปเปลี่ยนแปลงค่าปัจจุบัน​ ​โดย​ไม่​จำ​เป็น​ต้อง​นำ​เข้า​ตัวแปร​ ​เป็น​ array ​ตัวอย่างเช่น

// modifier.php

  1. <?php
  2. function hello($str, $var1, $var2) {
  3. return $var1.‘ ‘.$var2.‘ ‘.$str;
  4. }
  5.  
  6. $smarty->register_modifier(‘hello’, ‘hello’);
  7. $smarty->assign(‘myname’, ‘Tee++;’);
  8. ?>

// modifier.tpl

  1. <html…
  2. {$myname|hello:’Posted by ‘:’Mr.’}
  3. …html>

จาก​ตัวอย่างนี้​เรา​จะ​ได้​ค่าออกมา​เป็น​ “Posted by Mr.Tee++;”

—————————————————-

นอก​จาก​นี้​ยัง​มีการสร้าง​ function ​เข้า​ไป​ใช้​งานอีก​ 3 ​รูปแบบคือ

1.prefilter
เป็น​อีกรูปแบบนึง​โดย​การ​ใช้​งานเรา​จะ​สร้าง​ function ​และ​ register ​โดย​ใช้​คำ​สั่ง​ register_prefilter(“function_name”)

โดย​ไฟล์​ tpl ​ทั้ง​หมด​จะ​ถูกทำ​งานก่อนที่​จะ​ compile

2.postfilter
คล้ายๆ​ prefilter ​แต่ทำ​งานหลังการ​ compile

3.outputfilter
คล้ายๆ​ 2 ​ตัวบนแต่​จะ​ทำ​งานก่อนที่​ไฟล์​ tpl ​จะ​ถูกแสดงผล

ถ้าใครสนใจอยากศึกษาต่อผมขอแนะนำให้ไปโหลด CHM manual มาดูเลยครับ จาก http://smarty.php.net/

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

5 Comments »

 
 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>