[ตอนที่ 6] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลเป็นไฟล์
ที่ Index\Main\Controller หลังจากตัดสินใจได้แล้ว ว่าจะเลือกหน้าไหนมาแสดง คชสารก็จะทำการโหลดไฟล์ที่เกี่ยวข้องมาให้ (เหมือนโปรเจ็คก่อนหน้า ถ้าใครยังไม่ได้อ่านรบกวนไปอ่านซะ) ผมจะอธิบายเฉพาะส่วนที่ยังไม่เคยอธิบายเท่านั้น
มาดูกันที่คลาส Index\Pages\View คลาสนี้จะถูกเรียกเมื่อมีการเรียกหน้า pages เพื่อแสดงรายการหน้าเว็บที่ติดตั้งแล้ว ซึ่งในหน้านี้จะมีการใช้งานคลาส DataTable เพื่อแสดงข้อมูลในรูปแบบตาราง
ผมจะไม่อธิบายละเอียดนักนะครับ เพราะจะไปอธิบายอีกทีในหัวข้อ DataTable
ในหน้านี้เราจะทำการระบุข้อมูลที่เป็น Array ให้กับ DataTable ที่ property datas โดยข้อมูลต่างๆจะถูกโหลดมาโดย \Index\Pages\Model::get(-1)
method get ของ Index\Page\Model ตามด้านบนจะรับค่าพารามิเตอร์ $id มา
namespace Index\Pages;
use \Kotchasan\Http\Request;
use \Kotchasan\DataTable;
use \Kotchasan\Text;
class View extends \Kotchasan\View
{
public function render(Request $request)
{
// action
$actions = array('delete' => 'Remove');
// ตารางรายการหน้าเพจ
$table = new DataTable(array(
/* โหลดข้อมูลมาแสดงผลรูปแบบแอเรย์ */
'datas' => \Index\Pages\Model::get(-1),
/* กำหนดการแสดงผลตัวแบ่งหน้า */
'perPage' => $request->cookie('pages_perPage', 30)->toInt(),
/* กำหนดวิธีการจัดรูปแบบข้อมูลแต่ละแถวในการแสดงผลด้วยตัวเอง */
'onRow' => array($this, 'onRow'),
/* คอลัมน์ที่ไม่ต้องแสดงผล */
'hideColumns' => array('id'),
/* คอลัมน์ที่สามารถค้นหาได้ */
'searchColumns' => array('module', 'topic', 'detail'),
/* ตั้งค่าการกระทำของของตัวเลือกต่างๆ ด้านล่างตาราง ซึ่งจะใช้ร่วมกับการขีดถูกเลือกแถว */
'action' => 'index.php/index/model/pages/action',
'actions' => array(
array(
'id' => 'action',
'class' => 'ok',
'text' => 'ทำกับที่เลือก',
'options' => $actions
)
),
/* ส่วนหัวของตาราง และการเรียงลำดับ (thead) */
'headers' => array(
'module' => array(
'text' => 'โมดูล'
),
'topic' => array(
'text' => 'หัวข้อ'
),
'detail' => array(
'text' => 'รายละเอียด'
)
),
/* ปุ่มแสดงในแต่ละแถว */
'buttons' => array(
array(
'class' => 'icon-edit button green',
'href' => 'index.php?module=pagewrite&id=:id',
'text' => 'แก้ไข'
)
),
/* ปุ่มเพิ่ม */
'addNew' => array(
'class' => 'button green icon-plus',
'href' => 'index.php?module=pagewrite',
'text' => 'เพิ่มหน้าเพจ'
)
));
// save cookie
setcookie('pages_perPage', $table->perPage, time() + 3600 * 24 * 365, '/');
return $table->render();
}
// จัดรูปแบบการแสดงผลในแต่ละแถว
public function onRow($item, $o, $prop)
{
$item['topic'] = '<a href="../index.php?module='.$item['module'].'" target=_blank>'.$item['topic'].'</a>';
$item['detail'] = Text::cut(strip_tags($item['detail']), 100);
// คืนค่าข้อมูลทั้งหมดหลังจากจัดรูปแบบแล้วกลับไปแสดงผล
return $item;
}
}
มาดูกันที่คลาส Index\Pages\View คลาสนี้จะถูกเรียกเมื่อมีการเรียกหน้า pages เพื่อแสดงรายการหน้าเว็บที่ติดตั้งแล้ว ซึ่งในหน้านี้จะมีการใช้งานคลาส DataTable เพื่อแสดงข้อมูลในรูปแบบตาราง
ผมจะไม่อธิบายละเอียดนักนะครับ เพราะจะไปอธิบายอีกทีในหัวข้อ DataTable
ในหน้านี้เราจะทำการระบุข้อมูลที่เป็น Array ให้กับ DataTable ที่ property datas โดยข้อมูลต่างๆจะถูกโหลดมาโดย \Index\Pages\Model::get(-1)
namespace Index\Pages;
use \Kotchasan\Http\Request;
use \Kotchasan\Login;
use \Kotchasan\File;
class Model
{
public static function get($id)
{
if ($id === 0) {
// ใหม่
return array(
'id' => 0
);
} else {
$datas = array();
foreach (glob(ROOT_PATH.DATA_FOLDER.'index/*.php') as $item) {
$page = include($item);
if ($id === -1) {
// คืนค่าทุกรายการ
$datas[] = $page;
} elseif ($page['id'] == $id) {
// คืนค่ารายการที่ต้องการ (แก้ไข)
return $page;
}
}
return $datas;
}
}
}
method get ของ Index\Page\Model ตามด้านบนจะรับค่าพารามิเตอร์ $id มา
- $id = -1 เมธอดจะคืนค่ารายการหน้าเพจทั้งหมดกลับไปเพื่อใช้ส่งค่าให้กับ DataTable โดยก่อนส่งกลับจะมีการจัดรูปแบบของข้อมูลให้เหมาะสมสำหรับการใช้งานร่วมกับ DataTable ก่อน (รายละเอียดจะอธิบายเพิ่มเติมที่ DataTable) ซึ่งพารามิเตอร์ -1 นี้จะใช้ร่วมกับหน้านี้นี่เอง
- $id = 0 เมธอดจะคืนค่าเริ่มต้นสำหรับการสร้างรายการหน้าเพจใหม่ ซึ่งจะใช้ร่วมกับการสร้างหน้าเพจนั่นเอง
- $id > 0 เมธอดจะคืนค่าหน้าเพจที่มีข้อมูล id ตรงกับรายการที่เลือก ใช้ในการแก้ไขหน้าเพจ