Kotchasan PHP Framework

[ตอนที่ 6] เวิร์คช้อป CMS อย่างง่าย เก็บข้อมูลเป็นไฟล์

ที่ Index\Main\Controller หลังจากตัดสินใจได้แล้ว ว่าจะเลือกหน้าไหนมาแสดง คชสารก็จะทำการโหลดไฟล์ที่เกี่ยวข้องมาให้ (เหมือนโปรเจ็คก่อนหน้า ถ้าใครยังไม่ได้อ่านรบกวนไปอ่านซะ) ผมจะอธิบายเฉพาะส่วนที่ยังไม่เคยอธิบายเท่านั้น
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 ตรงกับรายการที่เลือก ใช้ในการแก้ไขหน้าเพจ
หมายเหตุ ทั้ง Index\Pages\View และ Index\Menus\View มีการทำงานที่คล้ายกัน ผมจะไม่อธิบายเพิ่มเติมนะครับ