Template
คลาสสำหรับจัดการและโหลด Template
\Somtum\Template
โครงสร้างของ Somtum มีการแยกส่วนที่เป็น HTML Template ออกจาก View โดยให้ View เป็นส่วนเตรียมการแสดงผลแทน เพื่อลดความซับซ้อนของโค้ดใน Controller และทำให้ระบบ Template เหมาะสมสำหรับทำเป็น CMS (สามารถเปลี่ยน Template ได้บนเว็บ)
การเริ่มต้นใช้งาน Template เริ่มจากการกำหนดไดเร็คทอรี่ของ Template ก่อน
\Somtum\Template::init('skin/'.self::$cfg->skin);
'skin/'.self::$cfg->skin คือชื่อไดเร็คทอรี่เก็บ Template นับจาก root ของ Server ซึ่ง $cfg->skin มาจากการตั้งค่าระบบ ถ้าต้องการเปลี่ยน Template ก็แค่เปลี่ยนค่าของตัวแปรนี้ ซึ่งค่าเริ่มต้นของตัวแปรนี้คือ default ซึ่งหมายถึง Template จะถูกเก็บอยู่ที่ /skin/default/ นั่นเอง
โครงสร้างของ Template ยังถูกแบ่งออกเป็นโฟลเดอร์ตามโมดูลได้อีก ทำให้การใช้งานในลักษณะของ CMS สมบูรณ์ขึ้น เช่นในกรณีที่ต้องการติดตั้งโมดูลเราสามารถติดตั้ง Template ของโมดูลเพิ่มเติมได้แยกกัน จาก Template ส่วนอื่นๆ
- skin/
- default/ <= ชื่อ Template
- index.html <= ไฟล์ Template
- main.html
- document/ <= ชื่อ module หรือ owner
- stories.html
- view.html
- gallery/
- album.html
- view.html
- default/ <= ชื่อ Template
กฏของ Template มีแค่ชื่อไฟล์และไดเร็คทอรี่ ต้องเป็นตัวพิมพ์เล็กเท่านั้น
สำหรับการโหลด Template เข้าสู่ระบบมี 3 วิธี
- $template = Template::create($owner, $module, $name);
วิธีแรก เป็นการโหลด Template ตามโมดูลที่เลือก
$owner ชื่อโฟลเดอร์ภายใต้ไดเร็คทอรี่ Template
$module ชื่อโฟลเดอร์ภายใต้ไดเร็คทอรี่ Template เช่นเดียวกันกับ $owner แต่จะมีความสำคัญกว่า หากพบไฟล์ในโฟลเดอร์ที่ตรงกันกับ $module จะใช้ไฟล์ในโฟลเดอร์นี้ แต่ถ้าไม่พบถึงจะไปเลือกใช้ไฟล์จากโฟลเดอร์ $owner
$name ชื่อไฟล์ HTML สำหรับเป็น Template ไม่ต้องระบุ .html ลงไปด้วย เช่น index หมายถึงไฟล์ index.html - $template = Template::createFromFile($filename);
วิธีที่สองคือโหลดจากไฟล์ตรงๆ โดยการระบุ $filename เป็นชื่อไฟล์แบบ full path เช่น /path/to/index.tpl - $template = Template::createFromHTML($html);
วิธีที่สามคือโหลดจากโค้ด HTML $html คือตัวแปรสตริงค์เก็บโค้ด HTML ที่ต้องการสร้างเป็น Template
สำหรับคำสั่งในการแสดงผล Template ใช้คำสั่ง
echo $template->render();
ซึ่งจะคืนค่าเป็น HTML สำหรับส่งกลับไปแสดงผลยังบราวเซอร์ได้ทันที
นอกจากนี่คลาส Template ยังมีฟังก์ชั่นอื่นๆเพิ่มเติม ได้แก่
// คืนค่าไดเร็คทอรี่ของ Template ที่กำลังใช้งานอยู่ เช่น skin/defalut
$skin = $template->get();
// คำสั่งสำหรับตรวจสอบว่ามีไฟล์ Template ถูกเลือกอยู่หรือไม่ คืนค่า true ถ้ายังไม่มีไฟล์ Template ถูกเลือก หรือ ไฟล์ Template ว่างเปล่า
$template->isEmpty();
// โหลดไฟล์ Template ตามโมดูลที่ต้องการ คืนค่าเนื้อหาของไฟล์ Template
$html = Template::load($owner, $module, $name);
// ฟังก์ชั่นทดแทนฟังก์ชั่น preg_replace เพื่อให้รองรับ modifier e ซึ่งถูกตัดออกใน PHP 7 ซึ่งจะถูกใช้ในการ แทนที่ข้อความลงใน Template
$skin = pregReplace($patt, $replace, $skin)
ตัวอย่างการใช้งาน Template
<!DOCTYPE html>
<html>
<head>
<title>{TITLE}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
{CONTENT}
</body>
</html>
โค้ด HTML ด้านบนคือโค้ดสำหรับไฟล์ Template ชื่อ index.html และจะเห็นว่าใน Template จะมีตัวแปรอยู่ 2 ตัว คือ {TITLE} และ {CONTENT} ซึ่งตัวแปรทั้งสองตัวจะถูกแทนที่ด้วยเนื่อหาที่ต้องการ
// เรียกใช้งาน Template ค่าเริ่มต้น หรือ skin/default
\Somtum\Template::init('skin/'.self::$cfg->skin);
// โหลด Template index.html
$template = \Somtum\Template::create('', '', 'index');
// แอเรย์เก็บตัวแปรของ Template
$contents = array(
'/{TITLE}/' => 'ตัวอย่าง',
'/{CONTENT}/' => 'Hello world!',
);
// แทนที่เนื่อหาที่ต้องการลงใน Template และแสดงผล
echo $template->pregReplace(array_keys($contents), array_values($contents), $template->render());
ผลลัพท์ก็จะได้ตามนี้
<!DOCTYPE html>
<html>
<head>
<title>ตัวอย่าง</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
Hello world!
</body>
</html>
ข้อดีของ Template แบบนี้คือสามารถทำงานได้รวดเร็ว และเนื่องจากไม่มีตัวแปรที่สามารถประมวลผลได้ ทำให้ปลอดภัยจากการแทรกคำสั่งที่ไม่พึงประสงค์ และ ยังได้เนื้อหาของ Template ทีแยกออกเป็นส่วนๆ ง่ายต่อการบำรุงรักษาด้วย
ตัวอย่างการใช้งาน Template เบื้องต้นอยู่ใน projects/template/