แงะ ci-cms

แงะ ci-cms

**วันที่เขียนนี้ stable version ที่ 0.9.2.1

สำหรับคนที่จะใช้ ควรเป็น medium user สำหรับ codeigniter แล้วนะครับ เพราะว่าเนื่องจากตัวนี้เป็นตัวที่ทำกันแบบบ้านๆ ดังนั้น มันจะมี โค้ดแปลกๆติดมา หรือว่า บางระบบที่ดูว่าสมบูรณ์ แต่ทำงานไม่สมบูรณ์ก็มีครับ เราก็ต้องตามแก้กันไป ตัวอย่างเช่น guestbook module เอามาติดตั้งแล้วไม่ทำงาน เพราะว่าเรียกหา captcha library แต่ปรากฏ ตัว stable ไม่ได้ build มาด้วย ต้องไปตามเอามาเองจาก trunk ครับ เป็นต้น

ก่อนอื่น มาดูกันก่อน ว่าเราได้อะไร จาก ci-cms ที่ codeigniter เดิมๆไม่มีบ้าง

 

  1. ระบบ Authentication
  2. ระบบ Admin
  3. ระบบ Module (ด้วย ระบบ matchbox)
  4. ระบบ Multi Language
  5. ระบบ Cache
  6. ระบบ Install system, install/uninstall/update module
  7. Module พื้นฐาน ที่ประกอบด้วย  member, news, pages, search, tag, feed 

เบื้องต้น ก็มีเพียงเท่านี้ แต่เค้าก็มีอีก สองสาม module ให้เราได้ใช้กัน แต่ประเด็น ที่เราเอาตัวนี้มาใช้ก็เพื่อ ให้เรามีระบบพื้นฐาน เพื่อที่จะได้ไม่ต้องเริ่มจาก 0 ใหม่ทุกๆครั้ง ทำงานแบบเดิมๆ แล้วเวลาที่เราจะพัฒนาเพื่อต่อยอดก็ทำให้เป็นแบบ module แทน สามารถแยกพัฒนา และถอดประกอบได้ สบายไป

ทั้งนี้ ผมจะพยายามแบ่งเป็น 3 ส่วนหลักๆ ก็คือ 

  1. ระบบพื้นฐาน ซึ่งจะเป็นส่วน coding (variable, library, controller, view, model) หรือ การทำงานใน section ต่างๆ ซึ่งจะเป็นส่วนทีค่อนข้างใหญ่มาก เพราะว่าอย่างที่บอกว่าเปลี่ยนจากของเดิมไปเยอะ
  2. โครงสร้างไฟล์ การจัดเรียงแฟ้ม และตำแหน่งการทำงานต่างๆ เพราะว่ามีการเปลี่ยนตำแหน่งไฟล์โครงสร้างพื้นฐาน
  3. เทคนิคต่างๆ ที่เพิ่มมา จาก 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 อยู่ครับ (เป็นส่วนที่ทำได้ยาก และซับซ้อนกับระบบได้มากที่สุด)

Create: Modify : 2010-10-22 09:29:45 Read : 5621 URL :