Kotchasan PHP Framework

โปรเจ็ค site เว็บไซต์แบบง่ายๆ

โปรเจ็ค site เป็นโปรเจ็คอย่างง่ายๆ ใช้แสดงการสร้างเว็บไซต์ ที่มีเมนู และไม่ต้องใช้ฐานข้อมูล และตัวอย่างการใช้งาน Template Engine ด้วย (ตัวอย่างนี้ไม่มีการใช้ CSS และ Javascript ในโปรเจ็ค)
        
  • site/     
              
    1. modules/         
                    
      1. index/             
                          
        1. views/                 
                                
          1. menu.php Index\Menu\View คลาสสำหรับจัดการแสดงผลเมนู
          2.                 
                          
        2.                 
        3. controllers/                  
                                
          1. index.php Index\Index\Controller 
          2.                     
          3. menu.php Index\Menu\Controller คอนโทรลเลอร์สำหรับจัดการเมนู
          4.                 
                          
        4.             
                    
      2.         
              
    2.         
    3. settings/         
                    
      1. config.php ค่ากำหนดของแอพพลิเคชั่น
      2.         
              
    4.         
    5. skin/         
                    
      1. default/ ชื่อ template ที่ใช้งานอยู่             
                          
        1. about.html เนื้อหาหน้า about หรือ module=about
        2.                 
        3. home.html เนื้อหาหน้า home หรือ module=home
        4.                 
        5. index.html Template หลัก
        6.             
                    
      2.         
              
    6.         
    7. index.php
    8.     
        

มาดูกันที่คอนโทรลเลอร์หลักของโปรเจ็ค (Index\Index\Controller) กันเลย
<?php
/*
 * @filesource index/controllers/index.php
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */


namespace Index\Index;

use \Kotchasan\Http\Request;
use \Kotchasan\Template;
use \Kotchasan\Date;

/**
 * default Controller
 *
 * @author Goragod Wiriya <admin@goragod.com>
 *
 * @since 1.0
 */

class Controller extends \Kotchasan\Controller
{

    /**
     * แสดงผล
     *
     * @param Request $request
     */

    public function index(Request $request)
    {
        // เริ่มต้นการใช้งาน Template
        Template::init(self::$cfg->skin);
        // ถ้าไม่มีโมดูลเลือกหน้า home
        $module = $request->get('module', 'home')->toString();
        // สร้าง View
        $view = new \Kotchasan\View;
        // template default
        $view->setContents(array(
            // menu
            '/{MENU}/' => createClass('Index\Menu\Controller')->render($module),
            // web title
            '/{TITLE}/' => self::$cfg->web_title,
            // โหลดหน้าที่เลือก (html)
            '/{CONTENT}/' => Template::load('', '', $module),
            // แสดงเวลาปัจจุบัน
            '/{TIME}/' => Date::format()
        ));
        // ส่งออกเป็น HTML
        $view->renderHTML();
    }
}

ลองมาดูรายละเอียดกันทีละบรรทัดเลยครับ

คำสั่งแรกเป็นคำสั่งเริ่มต้นใช้งาน Template ค่าพารามิเตอร์ที่ส่งให้คือ ชื่อเท็มเพลท (ซึ่งกำหนดอยู่ใน settings/config.php)
Template::init(self::$cfg->skin);
ถัดมาเป็นคำสั่งรับค่าที่ส่งมาจาก Router (ที่ส่งผ่านมาทางออปเจ็ค Request) ถ้าเทียบกับตัวแปร Global ก็จะเป็น $_GET['module'] โดยหากไม่มีการกำหนดค่านี้มา จะมีการส่งค่า "home" มาแทน (เช่นการเรียกหน้าหลัก)
$module = $request->get('module', 'home')->toString();
คำสั่งเรียกใช้ View หลักของคชสาร
$view = new \Kotchasan\View;
คำสั่งเริ่มต้นกำหนดข้อมูลลงใน Template
$view->setContents(array(
....
));

เป็นการเรียกไปยังคอนโทรลเลอร์ของเมนูเพื่อสร้างเมนู แล้วนำมาแทนที่ลงบน Template ที่ตำแหน่ง {MENU}
'/{MENU}/' => createClass('Index\Menu\Controller')->render($module)
เป็นการแสดงข้อความที่มาจาก config (ตัวแปรนี้มีค่าเริ่มต้นอยู่ที่ Config::$web_title) หากต้องการกำหนดเองสามารถเขียนใส่ไว้ใน settings/config.php ได้ ('web_title' => 'ไตเติลของเว็บไซต์')
'/{TITLE}/' => self::$cfg->web_title
เป็นการให้ Template โหลดไฟล์ตามชื่อ $module มาแสดงผล และนำมาแทนที่ลงใน Template ที่ตัวแปร {CONTENT} (ไฟล์จะถูกโหลดจากโฟลเดอร์ Template ในชื่อ $module.html เช่น ถ้าหน้าที่เรียกคือ module=about ก็จะเป็นการโหลด about.html มาแสดง)
'/{CONTENT}/' => Template::load('', '', $module)
เป็นการแสดงเวลาปัจจุบันจาก Server ใส่ลงใน {TIME}
'/{TIME}/' => Date::format()
สุดท้ายเป็นคำสั่งให้ View สร้างไฟล์ HTML
$view->renderHTML();
ไฟล์ถัดมาคือ index/controllers/menu.php หรือคลาส Index\Menu\Controller ทำหน้าที่เรียก Index\Menu\View เพื่อสร้างเมนูเท่านั้น
<?php
/*
 * @filesource index/controllers/menu.php
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */


namespace Index\Menu;

/**
 * default Controller
 *
 * @author Goragod Wiriya <admin@goragod.com>
 *
 * @since 1.0
 */

class Controller extends \Kotchasan\Controller
{
    /*
     * Initial Controller.
     *
     * @param array $modules
     *
     * @return string
     */


    public function render($module)
    {
        // สร้างเมนู
        return createClass('Index\Menu\View')->render($module);
    }
}

สุดท้าย index/views/menu.php (คลาส Index\Menu\View) เป็นโค้ด PHP ธรรมดาใช้ในการสร้างโครงสร้างของเมนู โดยในโค้ดจะมีการสร้างเมนูและส่งกลับไปใส่ลงใน Template ผ่านคอนโทรเลอร์ที่เรียกมา
<?php
/*
 * @filesource index/views/menu.php
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */


namespace Index\Menu;
/*
 * default View
 *
 * @author Goragod Wiriya <admin@goragod.com>
 *
 * @since 1.0
 */


class View extends \Kotchasan\View
{

    /**
     * ฟังก์ชั่นสร้างเมนู
     *
     * @param array $module หน้าที่เรียก มาจาก Controller
     *
     * @return string
     */

    public function render($module)
    {
        // รายการเมนู
        $menus['home'] = array('หน้าหลัก', 'index.php');
        $menus['about'] = array('เกี่ยวกับเรา', 'index.php?module=about');
        // สร้างเมนู
        $menu = '';
        foreach ($menus as $key => $values) {
            $c = $module == $key ? ' class=select' : '';
            $menu .= '<li'.$c.'><a href="'.$values[1].'"><span>'.$values[0].'</span></a></li>';
        }
        return $menu;
    }
}

สำหรับส่วนอื่นๆที่ผมไม่ได้กล่าวถึงคือ ไฟล์ config และ template ซึ่งไม่มีอะไรจะอธิบายครับ สามารถทำความเข้าใจจากไฟล์ได้โดยตรง