แงะ ci-cms
**วันที่เขียนนี้ stable version ที่ 0.9.2.1
สำหรับคนที่จะใช้ ควรเป็น medium user สำหรับ codeigniter แล้วนะครับ เพราะว่าเนื่องจากตัวนี้เป็นตัวที่ทำกันแบบบ้านๆ ดังนั้น มันจะมี โค้ดแปลกๆติดมา หรือว่า บางระบบที่ดูว่าสมบูรณ์ แต่ทำงานไม่สมบูรณ์ก็มีครับ เราก็ต้องตามแก้กันไป ตัวอย่างเช่น guestbook module เอามาติดตั้งแล้วไม่ทำงาน เพราะว่าเรียกหา captcha library แต่ปรากฏ ตัว stable ไม่ได้ build มาด้วย ต้องไปตามเอามาเองจาก trunk ครับ เป็นต้น
ก่อนอื่น มาดูกันก่อน ว่าเราได้อะไร จาก ci-cms ที่ codeigniter เดิมๆไม่มีบ้าง
- ระบบ Authentication
- ระบบ Admin
- ระบบ Module (ด้วย ระบบ matchbox)
- ระบบ Multi Language
- ระบบ Cache
- ระบบ Install system, install/uninstall/update module
- Module พื้นฐาน ที่ประกอบด้วย member, news, pages, search, tag, feed
เบื้องต้น ก็มีเพียงเท่านี้ แต่เค้าก็มีอีก สองสาม module ให้เราได้ใช้กัน แต่ประเด็น ที่เราเอาตัวนี้มาใช้ก็เพื่อ ให้เรามีระบบพื้นฐาน เพื่อที่จะได้ไม่ต้องเริ่มจาก 0 ใหม่ทุกๆครั้ง ทำงานแบบเดิมๆ แล้วเวลาที่เราจะพัฒนาเพื่อต่อยอดก็ทำให้เป็นแบบ module แทน สามารถแยกพัฒนา และถอดประกอบได้ สบายไป
ทั้งนี้ ผมจะพยายามแบ่งเป็น 3 ส่วนหลักๆ ก็คือ
- ระบบพื้นฐาน ซึ่งจะเป็นส่วน coding (variable, library, controller, view, model) หรือ การทำงานใน section ต่างๆ ซึ่งจะเป็นส่วนทีค่อนข้างใหญ่มาก เพราะว่าอย่างที่บอกว่าเปลี่ยนจากของเดิมไปเยอะ
- โครงสร้างไฟล์ การจัดเรียงแฟ้ม และตำแหน่งการทำงานต่างๆ เพราะว่ามีการเปลี่ยนตำแหน่งไฟล์โครงสร้างพื้นฐาน
- เทคนิคต่างๆ ที่เพิ่มมา จาก codeigniter ที่เดิมไม่มี
ระบบพื้นฐาน
การสร้าง module อ่านได้ที่ http://code.google.com/p/ci-cms/wiki/Modules
ตัวแปรต่างๆ
tablename - $this->db->dbprefix('ชื่อtable'); //เติม prefix ของระบบ
hook header - $this->plugin->add_action('header', array(&$this, 'ชื่อ function ใน module นั้น')); // จะไปเรียก function มาแสดงผลที่ header เช่นการเพิ่ม javascript หรือ css
ตัวแปรที่ header - $this->system->site_name, $this->system->meta_keywords, $this->system->meta_description, $title, $meta_keywords, $meta_description
ตัว theme ปัจจุบัน - $this->system->theme;
ภาษาทั้งหมดที่มีในระบบ - $this->locale->get_active();
ภาษาที่ user เลือก - $this->session->userdata('lang');
uri ที่เปิดล่าสุด - $this->session->userdata('last_uri');
*อยากดูเต็มๆ ดูได้ที่ $this->session;
ระบบ ภาษา (language)
เป็นคำบรรยายแบบ .po file ใช้โปรแกรม poedit ในการสร้างและแก้ไข http://www.poedit.net/download.php#win32
คำบรรยาย (language) - ใช้ echo __("ชื่อคำแปลภาษา", "ชื่อmodule"); //ถ้าไม่มี จะเอา parem แรกมาแสดง
View
เรียก view - $this->layout->load("ตัวแปร", "ชื่อview");
โครงสร้างไฟล์
Module
จะวาง module ทั้งแฟ้มที่ ./application/modules/ โดยในแต่ละแฟ้ม แต่ละ module นั้น ก็จะมีแฟ้ม controllers, models, views, locale , libraries ของตัวเองต่างหาก รวมทั้งไฟล์ setup.xml ที่จะบรรจุรายละเอียดของ module นั้นๆ , (ชื่อmodule)_install.php ทำหน้าที่ action ในจังหวะที่เรากด install , (ชื่อmodule)_routes.php ทำหน้าที่route เพิ่มเติม ที่เหลือ ดูได้ที่ http://code.google.com/p/ci-cms/wiki/Modules
Logs
เก็บที่ ./application/logs
Cache
เก็บที่ ./cache
Library
เก็บที่ ./libraries
เทคนิคที่เพิ่มมา
ระบบ Cache
cache ที่เพิ่มมานี้ เป็น sql cache ซึ่งถูกเรียกใช้ใน model เป็นหลัก เรียกได้ทันทีไม่ต้อง load อะไรเพิ่ม
- อ่านค่า cache - $this->cache->get($cache_id, $cache_group = NULL, $skip_checking = FALSE); // cache_id ใช้อ้างอิง (ควรเดายาก),group คือชื่อ table name
- เขียน cache - $this->cache->save($cache_id, $data, $cache_group = NULL, $ttl = NULL);
- ลบ cache ตัวเดียว - $this->cache->remove($cache_id, $cache_group = NULL);
- ลบ cache ทั้งกลุ่ม - $this->cache->remove_group($cache_group);
- ลบ cache หลายตัว - $this->cache->remove_ids($cache_ids, $cache_group = NULL); // $cache_ids เป็น array
ทั้งนี้ควรลบ cache ทุกครั้งหลัง update, delete
ระบบ Captcha
- สร้าง captcha - $this->captcha->image(); //จะ return syntag ที่พร้อมแสดงผลหน้าเว็บได้ทันที
- ตรวจสอบ captcha - $this->captcha->verify() != 200; //แปลว่าไม่ผ่าน
ข้อความ notification
แสดงข้อความ notification ออกมา
<?php if (isset($notice) || $notice = $this->session->flashdata('notification')):?>
<p class="notice"><?=$notice;?></p>
<?php endif;?>
เวลาใช้ ก็กำหนดตามนี้เลย $this->session->set_flashdata('notification', __("ข้อความ notify", "ชื่อ module"));
สิ่งที่พบ และควรปรับปรุง
ระบบ template ยังไม่ดีพอ ไม่รองรับการใช้งานทุกรูปแบบ เนื่องจาก เมื่อเราเรียก $this->layout->load แล้วเราต้องการเขียน javascript ใส่ที่ url นี้ เราก็จะต้องเรียก $this->plugin->add_action('header', array(&$this,'ชื่อ function')) แต่ปัญหาคือ เราไม่สามารถส่งค่าไปให้ทำงานได้ และจริงๆ ส่วนของ css ที่เราต้องการเขียนเพิ่มเติม ก็ควรตั้งค่าเพิ่มหรือลดได้ใน view แต่ว่าตัวนี้บังคับด้วยวิธีการเดียวกัน
jqueryที่ติดมาเก่ามาก อันนี้แก้เองได้
ถ้าจะเอามาใช้จริงจัง อาจจะ update version ใหม่ไม่ได้ โดยเฉพาะเมื่อมีการ แก้ engine หลักๆเอง แต่ก็เข้าใจว่าเป็นการทำเองแบบบ้านๆ
performance - ถือว่า performance ค่อนข้างต่ำมาก เพราะว่า แค่เปิดหน้าเว็บ ที่ยังไม่มีข่าว ก็ load time ถึง 1.2 วินาทีแล้ว ซึ่งจากประเด็นนี้ ทำให้ผมเลิกใช้เลย 555 นั่งแกะมาตั้งนาน พึ่งจะเห็น performance เท่าที่ดูน่าจะเกิดจากตัว matchbox ที่มีการทำงานซับซ้อนเรียกวกไปวนมามากมาย ทำให้ช้า
หลังจากที่ผมแกะตัวนี้เสร็จ ทีแรกตั้งใจจะแกะ และเขียนคู่มือให้ตัวเองใช้ แต่สุดท้ายก็ไม่ได้ใช้ เลยกลายเป็นตอนนี้ผมกำลังนั่งเขียนเองอยู่ครับ โดยจะเป็น CMS ที่เกิดจาก CodeIgniter เช่นเดียวกันแต่ใช้ ci-modular เข้ามาทำระบบ module และระบบ Tank auth เป็นระบบ authen นอกเหนือจากนั้น ก็เขียนเองทั้งหมดครับ โดยตอนนี้เขียนไปถึงในส่วน multi language อยู่ครับ (เป็นส่วนที่ทำได้ยาก และซับซ้อนกับระบบได้มากที่สุด)
tag : ci-modular,modular, codeigniter, codeigniter modular, cms, codeigniter cms
