โปรเจ็ค site เว็บไซต์แบบง่ายๆ
โปรเจ็ค site เป็นโปรเจ็คอย่างง่ายๆ ใช้แสดงการสร้างเว็บไซต์ ที่มีเมนู และไม่ต้องใช้ฐานข้อมูล และตัวอย่างการใช้งาน Template Engine ด้วย (ตัวอย่างนี้ไม่มีการใช้ CSS และ Javascript ในโปรเจ็ค)
มาดูกันที่คอนโทรลเลอร์หลักของโปรเจ็ค (Index\Index\Controller) กันเลย
ลองมาดูรายละเอียดกันทีละบรรทัดเลยครับ
คำสั่งแรกเป็นคำสั่งเริ่มต้นใช้งาน Template ค่าพารามิเตอร์ที่ส่งให้คือ ชื่อเท็มเพลท (ซึ่งกำหนดอยู่ใน settings/config.php)
ถัดมาเป็นคำสั่งรับค่าที่ส่งมาจาก Router (ที่ส่งผ่านมาทางออปเจ็ค Request) ถ้าเทียบกับตัวแปร Global ก็จะเป็น $_GET['module'] โดยหากไม่มีการกำหนดค่านี้มา จะมีการส่งค่า "home" มาแทน (เช่นการเรียกหน้าหลัก)
คำสั่งเรียกใช้ View หลักของคชสาร
คำสั่งเริ่มต้นกำหนดข้อมูลลงใน Template
เป็นการเรียกไปยังคอนโทรลเลอร์ของเมนูเพื่อสร้างเมนู แล้วนำมาแทนที่ลงบน Template ที่ตำแหน่ง {MENU}
เป็นการแสดงข้อความที่มาจาก config (ตัวแปรนี้มีค่าเริ่มต้นอยู่ที่ Config::$web_title) หากต้องการกำหนดเองสามารถเขียนใส่ไว้ใน settings/config.php ได้ ('web_title' => 'ไตเติลของเว็บไซต์')
เป็นการให้ Template โหลดไฟล์ตามชื่อ $module มาแสดงผล และนำมาแทนที่ลงใน Template ที่ตัวแปร {CONTENT} (ไฟล์จะถูกโหลดจากโฟลเดอร์ Template ในชื่อ $module.html เช่น ถ้าหน้าที่เรียกคือ module=about ก็จะเป็นการโหลด about.html มาแสดง)
เป็นการแสดงเวลาปัจจุบันจาก Server ใส่ลงใน {TIME}
สุดท้ายเป็นคำสั่งให้ View สร้างไฟล์ HTML
ไฟล์ถัดมาคือ index/controllers/menu.php หรือคลาส Index\Menu\Controller ทำหน้าที่เรียก Index\Menu\View เพื่อสร้างเมนูเท่านั้น
สุดท้าย index/views/menu.php (คลาส Index\Menu\View) เป็นโค้ด PHP ธรรมดาใช้ในการสร้างโครงสร้างของเมนู โดยในโค้ดจะมีการสร้างเมนูและส่งกลับไปใส่ลงใน Template ผ่านคอนโทรเลอร์ที่เรียกมา
สำหรับส่วนอื่นๆที่ผมไม่ได้กล่าวถึงคือ ไฟล์ config และ template ซึ่งไม่มีอะไรจะอธิบายครับ สามารถทำความเข้าใจจากไฟล์ได้โดยตรง
- site/
- modules/
- index/
- views/
- menu.php Index\Menu\View คลาสสำหรับจัดการแสดงผลเมนู
- controllers/
- index.php Index\Index\Controller
- menu.php Index\Menu\Controller คอนโทรลเลอร์สำหรับจัดการเมนู
- settings/
- config.php ค่ากำหนดของแอพพลิเคชั่น
- skin/
- default/ ชื่อ template ที่ใช้งานอยู่
- about.html เนื้อหาหน้า about หรือ module=about
- home.html เนื้อหาหน้า home หรือ module=home
- index.html Template หลัก
- index.php
มาดูกันที่คอนโทรลเลอร์หลักของโปรเจ็ค (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
'/โปรเจ็ค site เว็บไซต์แบบง่ายๆ/' => 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 ซึ่งไม่มีอะไรจะอธิบายครับ สามารถทำความเข้าใจจากไฟล์ได้โดยตรง