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/
    1. default/ <= ชื่อ Template
      1. index.html <= ไฟล์ Template
      2. main.html
      3. document/ <= ชื่อ module หรือ owner
        1. stories.html
        2. view.html
      4. gallery/
        1. album.html
        2. view.html

กฏของ Template มีแค่ชื่อไฟล์และไดเร็คทอรี่ ต้องเป็นตัวพิมพ์เล็กเท่านั้น

สำหรับการโหลด Template เข้าสู่ระบบมี 3 วิธี

  1. $template = Template::create($owner, $module, $name);

    วิธีแรก เป็นการโหลด Template ตามโมดูลที่เลือก
    $owner ชื่อโฟลเดอร์ภายใต้ไดเร็คทอรี่ Template
    $module ชื่อโฟลเดอร์ภายใต้ไดเร็คทอรี่ Template เช่นเดียวกันกับ $owner แต่จะมีความสำคัญกว่า หากพบไฟล์ในโฟลเดอร์ที่ตรงกันกับ $module จะใช้ไฟล์ในโฟลเดอร์นี้ แต่ถ้าไม่พบถึงจะไปเลือกใช้ไฟล์จากโฟลเดอร์ $owner
    $name ชื่อไฟล์ HTML สำหรับเป็น Template ไม่ต้องระบุ .html ลงไปด้วย เช่น index หมายถึงไฟล์ index.html
  2. $template = Template::createFromFile($filename);

    วิธีที่สองคือโหลดจากไฟล์ตรงๆ โดยการระบุ $filename เป็นชื่อไฟล์แบบ full path เช่น /path/to/index.tpl
  3. $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/

^