[update 2] PHP Framework -> PHPHoffmanFramework

ตอนนี้ระบบเริ่มนิ่งแล้วหลังจากผ่าน Revision ที่ 53 มา โดยได้ทำการเพิ่ม Add-on Text Editor ของ FCKEditor ลงใน Add-on พื้นฐานข้อมูลระบบแล้ว รวมถึงได้ทำการแยกส่วนของการ Config ของ apps และ core ออกจากกัน แต่ยังแค่ส่วนหนึ่งคาดว่าอีกสักพักจะแยกออกมาทั้งหมด โดยผู้พัฒนาจะไม่จำเป็นต้องเข้าไปยุ่งกับ Config ใน core อีกต่อไป ให้ทำการ Config ใน apps อย่างเดียว และได้เพิ่ม directory ชื่อ userdata เพื่อใช้ในการ upload ไฟล์และต้องการเพิ่มไฟล์ต่าง ๆ ที่นอกเหนือจากระบบหลัก และใน Revision นี้ได้ทำการ upgrade PEAR Date Package เป็น version ใหม่แล้ว รวมถึงแก้ไข bug ในส่วนของลำดับการเรียกใช้ไฟล์ JavaScript ใน Add-on ด้วย

ระบบโดยรวมเป็นไปตามที่กำหนดไว้ทั้งหมด น่าจะออก Beta ได้ตามเวลาที่กำหนด (ถ้าไม่เกิด idea ใหม่ ๆ ที่มีผลกับ Core หลักของระบบชนิดเปลี่ยนยกแผง)

ซึ่งเมื่อตอนเย็นที่วันที่ผ่านมา พอดีว่านั่งเรียนแล็ปวิชา Computer Language แล้วในวิชานี้เรียนภาษาโปรแกรมมิ่งอยู่ 2 ตัวคือ Java Web Application Platform และ PHP โดยช่วงหลังมิดเทอมเป็นเรื่องของ PHP

อาจารย์ได้ให้ทำงานใน LAB โดยสร้าง DB มา 3 ตาราง ซึ่งได้กำหนดมาแล้วว่าเป็นข้อมูลเกียวกับภาพยนต์ โดยตารางหนึ่งและสองเป็น ประเภทภาพยนต์และชื่อนักแสดงและผู้กำกับ ตามลำดับ ส่วนตารางที่สามเป็นข้อมูลภาพบนต์ โดยกำหนดว่าเก็บชื่อ, ปีที่ฉ่าย, ประเภท, นักแสดงนำ และผู้กำกับ โดยมีการดึกข้อมูลนักแสดงนำและผู้กำกับจากตารางนักแสดงและผู้กำกับ โดยในตารางนี้มีฟิลที่กำหนดว่าใครคือนักแสดงและผู้กำกับ หรือเป็นทั้งสองอย่างอยู่ ส่วนประเภทนี่เอามาขากประเภทภาพยนต์ โดยให้ทำระบบจัดการข้อมูลของทั้ง 3 ตารางทั้งใส่ข้อมูล, แก้ไข และลบข้อมูล

นี่คือโจทย์ที่ผมได้รับและจากการอยากทำสอบ PHP Framework ที่ผมสร้างขึ้น เลยได้ลองทำระบบดู จากการทดลองนั้นผมใช้เวลาในการสร้างส่วนติดต่อผู้ใช้งานทั้งหมดซึ่งเป็น Theme หลักของระบบที่มีอยู่แล้ว ในเวลา 1 นาที ในการ Export จาก SVN ผมก็ได้ Theme ที่ตกแต่งเป็น Layout ที่สนับสนุนบน IE และ Firefox ต่อมาก็ใช้เวลาในการสร้างรายงานข้อมูลของทั้ง 3 ตารางอีก 10 นาที ตามด้วยฟอร์มของทั้ง 3 ตารางในการใส่ข้อมูล และแก้ไขอีก 25 นาที โดยได้มีระบบตรวจสอบความถูกต้องด้วย JavaScript เพิ่มลงไปให้เรียบร้อย ต่อมาก็มาจัดการส่วน SQL ก็ใช้เวลาอีก 25 นาที ในการทำ SQL เพื่อใส่ข้อมูล, แก้ไข และลบข้อมูล รวม ๆ แล้ว ใช้เวลาประมาณ 1 ชั่วโมงแต่จริง ๆ นานกว่านั้นเพราะต้องนั่งช่วยเพื่อนทำด้วย ในขณะที่ทำเสร็จเพื่อน ๆ ยังงมกับโค้ดที่ไม่เป็นระเบียบอยู่ แต่ของผมนั้นสามารถเปลี่ยนแปลงได้อย่างมีสัดส่วน ซึ่งตอนนี้สามารถใช้งานได้สมบูรณ์ดีครับ

ด้านล่างคือรูปที่จัดการตารางรายการภาพยนต์ครับ

เอาแค่นี้แล้วกันครับ ส่วนอื่น ๆ ไว้มีเวลาจะเอามาโพสต่อนะครับ ง่วงแล้วไปนอนหล่ะครับ

ทำไมทำ PHP Framework เองหล่ะ ? คำถามโดนใจ และอยากตอบยาว ๆ

พอดีว่าเมื่อวาน เพื่อนฟิวส์ถามว่า

"ทำไมทำ PHP Framework เองหล่ะ"

วันนี้เลยมาตอบแบบยาว ๆ เสียหน่อย

คือในตอนแรกเริ่มเดิมทีเนี่ย ผมก็เขียน Class ต่าง ๆ ใช้งานเองอยู่มากมาย ทั้ง Class สำหรับ Query ฐานข้อมูล MySQL หรือ Class วันที่อย่าง thai_datetime ที่รองรับวันที่ภาษาไทย และปี พ.ศ. โดยรวมก็รู้สึกว่าทำงานกับพวกนี้สะดวกขึ้นมาก โยน Object ไปๆ มาๆ ง่ายและง่ายเสร็จเร็ว

แต่พอมาระยะหลัง ๆ งานที่ได้รับมันเป็นงานที่เกี่ยวกับข้อมูลจำนวนมาก ๆ การทำแบบนั้นสิ้นเปลื้องทรัพยากรอย่างมาก และบางครั้งเกิดความซ้ำซ้อน และโค้ดโปรแกรมรกอย่างเห็นได้ชัด รวมไปถึงการที่ผมเริ่มเขียน PHP แบบรวมไฟล์เดียว คือ process ทุกอย่างจะทำงานภายใต้ index ไฟล์ ทำให้การลาก if-else ของหน้าต่าง ๆ มันยาว และยุ่งยาก เลยนั่งคิดว่าจะทำยังไงดี

คราวนี้คิดออกว่าเราทำไม ไม่ทำการอ้างอิงหน้าแบบ Class ไป Method เสียเลยหล่ะ (ในตอนต่อไปขอเรียก Class ว่า Model) คือเมื่อ เขียนโปรแกรมต้องการข้อมูลเกี่ยวกับอะไรก็เรียก Model และตามด้วย Method ที่ต้องการ

ตัวอย่างเช่น

ต้องการอ่านข่าว id ที่ 1234 ระบบก็ไปเรียก Model "News" และ Method "Show" โดยส่ง id "1234" เข้าไปใน Method แล้วเมื่อได้ข้อมูลแล้วก็แสดงผลออกมา

ตอนแรกก็กะทำแค่นั้น แต่ไป ๆ มา ๆ มันเข้าเค้า MVC เว้ย เลยศึกษา RoR อยู่พักนึง เลยเข้าใจเลยว่าไอ้ที่จะทำเนี่ยมันคล้าย ๆ กัน เลยจัดการดัดแปลงแนวคิดใหม่ จากการที่จะเรียก Model ตรง ๆ เป็น ไปเรียก Method ของ Controller (Controller-Method) แทน แล้ว Controller-Method จะไปเรียกใช้ Model และ Method ที่เกี่ยวข้องทั้ง ๆ มาใช้งาน ซึ่งคราวนี้ Model มีอิสระต่อการเรียกใช้ข้อมูลของฐานข้อมูลมากขึ้น สามารถปรับแต่งและแก้ไขคำสั่ง SQL ได้ตามต้องการ โดยการจัดการข้อมูลในฐานข้อมูลต้องสอดคล้องกับความหมายของ Model นั้น ๆ เมื่อ Controller-Method สั่งให้ Model ทำงานเสร็จแล้ว Model จะทำการบันทึกสถานะที่จำเป็นในการแสดงผลใส่ลง Observer-Data (ตัวตรวจจับข้อมูลที่ต้องการ) ไปยัง View ให้ View จัดการแสดงผลข้อมูลตามที่ Controller-Method สั่งมาอีกที แล้วเจ้า View เนี่ยจะเอาข้อมูลใน Observer-Data มาใช้งานตามแต่ View จะใช้

ตัวอย่างเดิมแต่เปลี่ยนแนวคิดใหม่

ต้องการอ่านข่าว id ที่ 1234 ระบบก็ไปเรียก Controller "News" และ Controller-Method "Show" เสร็จแล้ว Controller-Method มีการทำงานอะไร ต่าง ๆ มากมาย เช่นมีการใช้ Model พื้นฐานอย่าง News และอาจจะมี Model "ความดิดเห็น" และ "ข่าวที่เกี่ยวข้อง" อื่น ๆ อีก เพื่อเอาไปแสดงผล โดยส่ง id "1234" เข้าไปใน Controller-Method ด้วย เพื่อเอาข่าวที่ 1234 ออกมา เมื่อได้ข้อมูลครบแล้ว ก็เข้าไปใส่ใน Observer-Data ซึ่งเมื่อได้ข้อมูลแล้วก็แสดงผลออกมาโดยเอาไปจัดการรูปแบบต่าง ๆ ให้สวยงานในส่วนของ View ชื่อ "ShowNews" โดยส่วนของ View จะถูกครอบอีกชั้นด้วย Theme หลักของระบบอีกที

ซึ่งระบบจะประมาณนี้ แต่สุดท้ายก็มีการแยกส่วนหลัก ๆ เป็น Core, Add-on, Warrper Class, Page และ Apps ซึ่งอาจจะมีอะไรมากกว่านี้อีกหน่อย แต่คงไม่ต่างจากข้างบนมากนัก

จากสิ่งเหล่านี้ ทำให้ผมได้แนวคิดมากมาย และการทำแบบนี้มันทำให้รู้ว่า "กูก็ทำได้วะ" เอาแนวคิดที่เราเคยทำอะไรมามากมายใส่มันลงไป

อีกอย่างคือ Framework หลาย ๆ ตัวของเมืองนอกมักเขียนคำสั่ง SQL เพียว ๆ ไม่ค่อยได้ และมักจะทำให้เราเสร็จ ซึ่งผมไม่ชอบเท่าไหร่ เพราะมันควบคุมและย่อคำสั่ง SQL ลำบากมาก หรือทำไม่ได้เลย ซึ่งทำให้ประสิทธิภาพตกไป ใน Framework ผมเลยไม่มีการจัดการ SQL สำเร็จรูปมากมาย อาจมีคำสั่งพื้นๆ เช่นนับจำนวน Record ในตาราง หรือตัวช่วยแบ่งหน้า อะไรพวกนี้ นิดหน่อยซึ่งเป็นงานที่ทำซ้ำ ๆ และใช้กันเยอะอยู่แล้ว เอามาใส่เป็นแบบสำเร็จรูป ส่วนคำสั่ง insert, update, delete อาจจะทำส่วนง่าย ๆ ไว้ในกรณีที่ต้องการลบข้อมูลที่ใช้ primary key อ้างอิงเป็นหลัก แต่ถ้าใช้ตัวอื่น ๆ ด้วย ก็สามารถใช้ SQL Query ทั่วไปแทนได้เลย

อีกสิ่งหนึ่งที่อยากทำคือ อยากมีอะไรสักอยากที่รู้สึกว่าตัวเองทำได้ไม่แพ้ Framework ของต่างชาติบ้าง แม้มันจะดีหรือห่วย ได้ทำก็ถือว่าคุ้มและ คิดซะว่า "ทำเอามัน" ถ้าทำได้ดี คนชอบก็ถือว่ากำไรชีวิต ถ้าไม่ดี มันห่วยมาก ๆ หาดีไม่ได้เลย ก็แค่เลิกทำ แต่ถ้ามันยังมีความดีอยู่บ้างก็เอามาปรับแต่งให้มันดีขึ้น เอาของคนอื่น ๆ มาดูแล้วปรับแต่ง และหาจุดบกพร่องของ Framework ตัวเองแล้วแก้ไขซะ และดูว่าจุดบกพร่องของคนอื่นคือะไร เอามาปรับเป็นจุดเด่นของเราเสีย

การพัฒนา Framework ตัวนี้พยายามให้มันอยู่บนพื้นฐานของ Add-on มากกว่า Core คือไม่อยากใช้อะไรก็เอา add-on ออก พยายามไม่ให้ตัวที่เป็น Core ผูกติดกับ Add-on แต่ให้ Add-on มันมาผูกกับ Core เอง เพราะเวลาเอา Add-on ออกมันจะได้ไม่มีปัญหา ซึ่งมันต่างกับ Framework บางตัวที่มีอะไรให้ใช้มากมาย แต่บางครั้งมันมากเกินไปหนัก Framework แล้วมันเอาออกไม่ได้ ซึ่งมันทำให้ประสิทธิภาพตกไปเลย ซึ่งพยายามไม่ให้เกิดกับตัวนี้ (หวังไว้นะ)

อีกอย่างที่ำอยากทำคือทำให้ได้อย่าง RoR กะว่าจะทำ Bat File แล้วเขียนให้มันสร้าง Model, View และ Controller ด้วยคำสั่งเดียว -_-‘ แต่คงยากหว่ะ เอาแค่นี้ก่อนดีกว่า ฮ่า …..  ทำคนเดียวไม่ได้ทำหลายคน ค่อยเป็นค่อยไปแล้วกัน

[update] ความคืบหน้าของ PHP Framework

ตอนนี้ปรับแต่งและแก้ไขไปแล้วโดยตอนนี้อยู่ที่ version 0.1a (alpha test) revision ที่ 46 แล้ว ปรับแต่งระบบภายในหลายส่วน แต่หลัก ๆ คือแยกส่วนของ Page และภาษาสำหรับการแสดงผลของ Core ออกจาก Apps ซึ่งตอนแรกรวมกันอยู่

โดยเหตุผลหลักๆ มาจากว่า Core จะมี Page และภาษาสำหรับแสดงผลพื้นฐานของมันเอง เอาไว้ให้ Module, Warpper Class, Function, CSStyle และ Add-on มาอ้างอิง ซึ่งจะได้ง่ายต่อการใช้พัฒนา Core ในภายหลัง และสามารถเอาไปปรับแต่งให้รองรับกับภาษาอื่น ๆ ได้โดยแค่แปลี่ยนแปลง ที่ Core เท่านั้น และการแยกครั้งนี้ช่วยให้ลดความซ้ำซ้อนลงไปได้เยอะ

ส่วน Apps ที่เขียนขึ้นมา ก็เข้าไปใช้และปรับแต่งแยกจากกัน จะได้ไม่สับสน แล้วง่ายต่อการ Upgrade ตัว Framework ในอนาคตต่อไป ไม่งั้นตอน upgrade นี่มึนแน่ ๆ

คาดว่าถ้าการพัฒนาระบบที่ทำอยู่ไม่มีอะไรผิดพลาดและเกิด bug ขึ้นระหว่างการพัฒนาระบบที่ทดสอบอยู่จะประกาศตัว 0.1a revision 46 เป็น 0.1b ทันที แต่คาดว่าคงมีจุดรั่วหลายส่วนตัวเลข revision คาดจะทะลุ 50 แน่ ๆ ซึ่งตอนนี้ Architecture Diagram ไม่นิ่งอย่างแรง และเริ่มอ่านลำบาก เดี่ยวเขียนใหม่อีกรอบท่าจะดี

ส่วน Module และ Add-on บางส่วนอาจจำเป็นต้องปรับแต่งเพิ่มอีกนิดหน่อยให้มีความยิดหยุ่นต่อการปรับแปลี่ยนในครั้งนี้ครับ

ส่วนชื่อของ Framework ตัวนี้อย่างไม่เป็นทางการ แต่ของเป็น codename ไว้ก่อนคือ Hoffman ครับ (ชื่อ Notebook Thinkpad ตัวนี่แหละ -_-‘)

[Update 1, 13:28] ด้านล่างนี้คือโครงสร้างของ Directory ของ Framework นี้

สวัสดีปีใหม่ครับ และปีนี้สิ่งใหม่ในการพัฒนาโปรแกรมบน PHP กำลังเกิด (ย้อนหลังนานมาก T_T )

ในช่วงวันปีใหม่ที่ผ่านมา ก็ไม่ได้แตกต่างจากวันอื่น ๆ มากเท่าไหร่ เพราะว่าตัวเองไม่ได้ออกไปเที่ยวไหนเลย ทำงานปั่น PHP Framework อย่างเดียว จริง ๆ โครงการนี้ออกแบบและร่างแนวคิดมาได้สัก 1-2 เดือนแล้ว แต่ว่ากว่าจะลงตัวก็ในช่วงเกือบปีใหม่ และดันงานให้เสร็จในช่วงวันหยุดยาวปีใหม่ โดยเพิ่งจะเอาเข้า SVN ส่วนตัวเมื่อคืนนี้เอง ตอนนี้ขั้นตอนการ Alpha Test อยู่โดยในช่วงนี้การทดสอบระบบนั้นจะนำไปใช้งานจริงกับระบบร้านค้าบนอินเตอร์เน็ต (E-Commerce) โดยนี้คาดว่าจะออก Beta Test ตอนปลายเดือนนี้เป็นอย่างเร็วที่สุด

โดยหลักการของระบบ Framework นี้โดยรวมใช้หลักการ MVC (Model-View-Controller) ซึ่งการพัฒนาในครั้งนี้เข้าใกล้หลักการ MVC เกือบ 90% อาจจะมีบางส่วนที่ไม่เข้าหลักการด้วยเหตุผลด้านข้อจำกัดของภาษา PHP และระยะเวลาในการพัฒนาระบบโดยรวม

โดยระบบโดยรวมนั้นจะใส่ Module ต่าง ๆ เหล่านี้ลงไปนี้ Core ของระบบ ( Core = แกนหลักของระบบโดยรวม) 

  • Module จัดการเชื่อมต่อกับฐานข้อมูล MySQL รองรับ MySQL 5.0 และการทำ Transaction ด้วย โดยตัวมันเป็นเป็น Sub-Module กับ Object อีกที โดยเอาแนวคิดจาก Object ใน Java ที่ Class ทุกตัวจะสืบทอดจาก Class Object ทั้งหมด แต่ในความเป็นจริง แล้วมีเพียงไม่กี่ Module ที่เข้าข่ายนี้เนื่องจากบางส่วนเป็น OpenSource Module จากข้างนอกการปรับแต่งบางครั้งก็ลำบากในการพัฒนาต่อ
  • Module จัดการวันที่ทั้งไทย (พ.ศ.) และสากล (ค.ศ.) โดยได้เขียนส่วนเพิ่มเติมจาก Generic date handling class for PEAR v 1.41 2006/11/22 และเพิ่อลบข้อเสียของ function Date ใน PHP ที่ไม่สามารถรองรับวันที่ได้น้อยกว่าปี ค.ศ. 1970 และการใช้งานที่ยุ่งยาก รวมถึงไม่รองรับปี พ.ศ. ด้วย
  • Module อ่าน HTML และ XML (Parser) ซึ่งพัฒนาสืบทอดต่อจาก HTML/XML Parser Class 1.0 ของ Dennis Pallett โดยได้เขียนส่วนเพิ่มเติมสำหรับจัดการ Permission ของระบบโดยการกำหนด Permission ของระบบอ้างอิงจากไฟล์ XML แทนฐานข้อมูลแบบเดิม ๆ เพื่อลดการ Process Query ของ DBMS (ใช้การ Parse จาก XML เร็วกว่าเยอะ เพราะมันลด Transaction และ Process ใน DBMS ไปเยอะพอสมควรเมื่อเทียบกับการ Parse ข้อมูลจาก XML ) และคาดว่าจะเขียน Module สำหรับจัดการพวกนี้ด้วย ซึ่งยังมีการเอามาใช้ประโยชน์ในการอ่านไฟล์ XML เพื่อใส่ addon ใหม่ ๆ เข้าระบบด้วย (จะกล่าวต่อไป) โดยใช้หลักการแบบเดียวกับ Membo และ CMS อื่น ๆ ที่เมื่อมีการลง Component ใหม่ ๆ ลงไปนั้นเอง
  • Module ทำ Pagination (แบ่งหน้าข้อมูล) สำหรับการแสดงผลรายการข้อมูลยาว ๆ ให้แบ่งเป็นหน้า ๆ
  • Moduel HTML Form สำหรับสร้าง Form บน PHP แบบง่าย ๆ และสามารถกำหนด Option เสริมตามมาตรฐาน XHTML อื่นๆ เพิ่มเติมได้ โดยจุดเด่นของ HTML Form นี้คือตัว Form Set ชื่อ Select Datetime ซึ่งเป็นส่วนของการกรอกข้อมูลเกียวกับวันที่และเวลา ที่เราไม่ต้องมานั่งเขียน Selection Form ในแบบเดิม ๆ ให้เสียเวลาอีกต่อไป
  • Module จัดการระบบ upload โดยใน Module นี้ได้เพิ่มความสามารถดักจับคุณสมบัติไฟล์บนพื้นฐานแบบ MEME Type แทนนามสกุลไฟล์แบบเดิม ๆ ได้ด้วย (แต่ก็ยังใช้การดักจับนามสกุลไฟล์แบบเดิมได้ถ้าต้องการ) โดยภายในมี Form สำหรับ upload ให้เสร็จ จริง ๆ ตอนนี้กำลังเอาไปใส่ใน Module HTML Form แทน อาจมีการปรับเปลี่ยนในรุ่น Beta Test อีกที หรือไม่เจ้าตัว Upload นี้อาจจะเป็น Sub-Module ของ HTML Form ไป หรืออีกทางคือให้มันถูกกำหนด Prepackage ที่ต้องมีก่อนใช้งานแทนก็ได้ ซึ่งแบบหลังจะดีในแง่การการเข้ากันได้ในรุ่น Alpha Test 
  • Module จัดการ MVC ซึ่งผมใช้ชื่อว่า "Apps" ซึ่งเจ้า Apps นี้มันเป็น Sub-Module ของ MySQL  อีกทีหนึ่ง โดยตัวมันเองก็มี Sub-Module ของมันอีก 3 ตัวคือ Model, View และ Controller ซึ่งตัวที่ใช้แน่ ๆ คือ Model และ Controller แต่เจ้าตัว View นี่ดิ -_-‘ มันไม่มีบทบาทอะไรเลย เพราะบทบาทมันถูกใช้ไปแล้วใน Warpper Class ชื่อ Observer Data และ Theme (จะกล่าวต่อไปว่ามันคืออะไร) คาดว่าเจ้า View นี่จะถูกออกแบบใหม่อีกรอบให้ใช้ความสามารถจาก Observer Data และ Theme และจัดการอื่น ๆ ในส่วนที่ Observer Data และ Theme ไม่มีหน้าทีครอบคลุมถึงส่วน View (จริง ๆ ในตอนนี้ Alpha Test นี้มันทดแทนได้หมดแลย นะเนี่ย -_-‘)

โดยด้านบนคือ Core ของระบบ ซึ่งในตอนนี้มี Module อยู่ 7 ตัว และคาดว่าจะมีเพิ่มในอนาคตเพื่อเพิ่มความสามารถ และปรับแก้ข้อผิดพลาดด้วย

ต่อมาในส่วนของ Add-on นั้นเป็นส่วนเพิ่มเติมในระบบทั้งหมด โดยเมื่อต่อการใส่ Add-on ลงใน Framework นั้นต้องมีการเขียนไฟล์ XML ตาม Schema ที่กำหนดไว้ (มีพร้อมใน Framework แล้ว) เพื่อให้ Core อ่านคุณสมบัติของ Add-on ได้ทั้งหมด โดยมี Add-on มาตรฐานอยู่ 4 ตัวคือ

  • HTML Form Validation ซึ่งได้เป็นเขียน PHP Class เพื่อใช้งานร่วมกับ JavaScript Form Validator Version 2.0.2 จาก JavaScript-coder.com และใน JavaScript ดังกล่าวได้เพิ่มส่วนของการตรวจสอบความถูกต้องของการกรอกวันที่ เช่นกรอกวันที่ 31 ในเดือนกุมพาพันธ์ และความเหมือนกันของข้อมูล ซึ่งมันถูกใช้ในการตรวจทานรหัสผ่านและอีเมล เป็นต้นด้วย
  • JavaScript ShowHide Link Area เป็นการนำข้อดีของ CSS และ XHTML มาใช้ร่วมกัน โดยเป็นการเขียน PHP Class เพื่อสร้าง JavaScript สำหรับสร้าง Link เพื่อบังคับการแสดงและซ่อนพื้นที่ที่เราต้อง
  • Lightbox v2.02  จาก Lokesh Dhakar เป็น JavaScript ที่ใช้ในการแสดงผลรูปภาพขนาดจริงที่มี Effect สวยงามมาก (ใน Blog ผมก็ใช้ Lightbox นี้เช่นกัน)
  • Mod Msg Digest เป็นการนำ Message-Digest Algorithm 5 (md5) มาใช้ประโยชน์ในการทำ Message-Digest Data อีกครั้งโดยใช้การซ่อนรหัสลงในชุดข้อมูลขยะอีกรอบหนึ่ง

ต่อมาในส่วนอขง Warpper Class (เอาแนวคิดมาจากภาษา Java อีกตามเคย) เป็น Class ที่ไม่จำเป็นต้อง Initialize Object แต่สามารถใช้งานได้ทันที โดยจริง ๆ แล้วมันก็ทำงานคล้าย ๆ กับ Function ทั่วไปนั้นแหละ เพียงแต่ว่าการใช้ Function มีผลต่อชื่อที่อาจซ้ำกับ Function พื้นฐานในอนาคตได้ (ตอนนี้ Function บางตัวที่ผมเขียนในอดีตก็ดันไปซ้ำกับ Function พื้นฐานใน PHP 5 เสียแล้ว) เลยจำเป็นต้องเขียนใน Warpper Class แทน และยังเป็นการจัดกลุ่ม Function ด้วย โดย Warpper Class นั้นในตอนนี้มีอยู่ 5 ตัวคือ

  • HTTP-Page เป็น Class ที่เอาไว้สร้าง URL, Redirect หน้าเว็บ และกรองข้อมูลจาก Request Variables พวก ENV, GET, POST, COOKIE, SERVER ต่าง ๆ ให้เป็นไปตามข้อมูลที่ควรจะเป็นเช่นการกรอง Injection Data จาก QueryString หรือการเปลี่ยน arg_separator ใน PHP จาก & เป็น ; เพื่อให้เป็นไปตามคำแนะนำของ XHTML 4.0 โดยใน Class นี้ยังรองรับการสร้าง URL ด้วยวิธี mod_rewrite ด้วย (โดยมาตรฐานแล้วจะเปิดการใช้งาน mod_rewrite เป็นค่าเริ่มต้น)
  • Observer Data เป็น Class ที่สร้างขึ้นเพื่อใช้ในการสื่อสารระหว่าง Model, View และ Controller
  • SuperGlobals เป็น Class ที่ใช้ในการเรียกใช้ข้อมูลชนิด Predefined Variables นั้นเอง โดยแทนที่จะทำงานผ่านตัวแปร Predefined Variables โดยตรงก็ใช้ Class นี้แทน โดยมี Method ที่่ช่วยในการจัดการข้อมูลใน Predefined Variables ได้ด้วย รวมถึง Method ในการสร้าง Temp Data ลง Sessionเพื่อใช้ประโยชน์ในบางกรณีที่ต้องการใช้ข้อมูลข้ามหน้ากัน 
  • Theme เป็น Class ที่ใช้ในการเพื่อ, ปรับแต่ง และสร้าง ส่วนขยายของ Theme ทั่วไปให้มีความสามารถมากขึ้นเช่นเพิ่ม JavaScript และ CSS ลงไปใน Theme หลักจาก Add-on และจะเพิ่มเองภายหลังก็ได้ โดยไม่จำเป็นต้อเข้าไปแก้ใน Theme หลักแต่อย่างใด 
  • Permission เป็น Class ที่สร้างขึ้นเพื่อตรวจสอบสิทธิ์ในการใช้งานเช่น Guest, User และ Admin โดยตัวมันเองนั้นจะอ่านไฟล์ XML ที่สร้างตาม Schema Permission ที่กำหนดไว้ โดย Permission นี้จะตรวจสอบการเข้าถึง Controller และ Controller Method ซึ่ง Controllre นั้นเป็นตัวดักจับ Event อยู่แล้ว การตั้ง Permission ที่อิงกับ Controller จึงถือว่าปลอดถัยต่อข้อมูลมากที่สุด เพราะ Controller นั้นจะเป็นตัวจับคู่ Model และ View เข้าด้วยกัน ถ้า Controller ถูกจำกัดการทำงาน ก็ไม่มีทางที่ View จะส่งข้อมูลให้กับ Model และ Model จะส่งข้อมูลกลับไปให้ View ได้

ทั้งนี้ทั้งนั้นระบบ Framework นี้ไม่ได้ถูกทำขึ้นเพื่อใช้แค่ MVC เท่านั้น เรายังสามารถสร้างหน้าทั่วไป ในที่นี้ขอเรียกว่า ‘Page’ ได้เหมือนการเขียน HTML ทั่วไป เพียงแต่ข้อมูลที่มีจะถูกนำไปใส่ใน Theme โดยอัตโนมัติ โดยการเรียกหน้านั้นทำผ่าน URL "page" ของระบบ

โดยอย่างที่บอกไปแล้วว่าใน Framework นี้รองรับการสร้าง URL แบบ Rewrite ซึ่งสามารถเลือกที่จะไม่ใช้ก็ได้ในกรณีที่ Server ไม่รองรับ โดยไม่ต้องแก้ไข URL ใน Link ต่าง ๆ ใหม่ ซึ่ง URL ใน Link ต่าง ๆ นั้นต้องสร้างจาก Metod "url" ใน HTTP-Page เท่านั้น

จริงรายละเอียดมีมากกว่านี้ครับ แต่ว่าขอเอาแค่นี้ก่อนแล้วกัน ส่วน Diagram ของระบบยังไม่ขอเอามาลงเพราะระบบยังไม่นิ่งพอครับ

กำลังบ้า Ruby on Rails ภาค MVC

เพิ่งแก้ Blog จากการใช้ Category มาเป็น Tag แทนด้วยเหตุผลที่ว่ามันทำให้การค้นหาและจัดหมู่นั้นทำได้ง่ายกว่ามาก ซึ่งช่วงนี้กำลังหาสิ่งใหม่ ๆ เข้าตัว เริ่มด้วยการศึกษาหลักการ Design Pattern ต่าง ๆ ของ GoF และ Model-view-controller (MVC) ที่เป็น Design Pattern อีกแบบหนึ่งที่ได้รับความนิยมมาก โดยตัวที่เอาประกอบการศึกษาก็คือ Ruby on Rails (RoR) ซึ่งเป็นการใช้ภาษา Ruby มาเป็นภาษาในการพัฒนาและทำเป็น Framework ที่ชื่อว่า Rails นั้นเอง โดยรวมยังไปไม่ถึงไหน แต่ที่แน่ ๆ การพัฒนาทำได้รวดเร็วและง่ายมาก ๆ แต่สิ่งหนึ่งที่ต้องเข้าใจคือ MVC เสียก่อน เพราะไม่งั้นพัฒนาไปแล้ว งง แน่ ๆ

Model-view-controller (MVC) เป็นการแยกการพัฒนา Software ออกมาเป็น 3 ส่วนหลัก ๆ  (หรือบางคนเรียกกว่า 3 Layer) ซึ่งได้แก่ Model, View และ Controller

  • Model เป็นการตัดสินใจ (Domain logic) ในการเข้าถึงและใช้งานข้อมูล (Raw data) ซึ่งเป็นไปตามกฎที่ตั้งไว้ (Business Rule) 
  • View เป็นส่วนของการนำข้อมูลที่ได้จาก Model มาแสดงผลให้ผู้ใช้ได้ทราบข้อมูลผ่านทางส่วนติดต่อกับผู้ใช้งาน (User Interface,UI)
  • Controller เป็นส่วนที่ตอบรับและโต้ตอบการทำงานของผู้ใช้ (Event และ Responds) โดยจะเป็นตัวกระตุ้นให้ Model และ View ทำงานไปในทิศทางเดียวกัน

ขั้นตอนการทำงานของ MVC แบบคราว ๆ

เหตุการณ์สมมติ "นักเรียนต้องการส่งคำตอบในการทำข้อสอบให้กับครูผู้สอน" การทำงานแบบ MVC จะมีลักษณะดังนี้

  1. เมื่อนักเรียนกดปุ่ม Submit เพื่อส่งข้อสอบ ซึ่งอยู่ที่ View จะส่งคำร้องนี้ไปยัง Controller (1) จะทำการรับการโต้ตอบจากปุ่ม Submit และสร้าง handler หรือ callback ขึ้นมา เพื่อใช้ติดต่อระหว่าง Layer
  2. Controller ทำการเลือก Model ที่ตรงกับข้อมูลของผู้ใช้ที่ส่งข้อมูลเข้ามา (2) แล้ว Model ทำการตรวจสอบความถูกต้องของข้อมูลตามกฎที่ตั้งไว้ (Business Rules) ถ้ามีข้อผิดพลาดจะส่งคำร้องไปยัง View (5) ให้ทำการสร้างหน้าแจ้งข้อผิดพลาดออกมาและจบการทำงานทันที แต่ถ้าไม่มีข้อผิดพลาดจะใส่ข้อมูลนั้นลงฐานข้อมูล โดยที่ Model จะเป็นคนจัดการข้อมูลในฐานข้อมูลเองทั้งหมด (3) แล้ว Controller จะบอกให้ View (4) จะทำการสร้างส่วนติดต่อกับผู้ใช้ใหม่ขึ้นมาโดยไปดึงผลคะแนนที่ได้มาจาก Model (5) ออกมาแสดงที่ส่วนติดต่อผู้ใช้งาน (User Interface,UI)
  3. และการทำงานจะเป็นแบบไหนไปเรื่อย ๆ จนกว่าโปรแกรมจะจบการทำงาน

จากตัวอย่างด้านบนคงจะพอเห็นภาพแล้วว่าการติดต่อระหว่าง Model, View และ Controller แล้ว เมื่อเราสามารถแยกการทำงานของโปรแกรมของเราได้ในรูปแบบนี้ จะทำให้การดูแลและแก้ไขระบบเป็นไปด้วยความรวดเร็ว และลดความซับซ้อนในการสร้างลงไปมาเลยทีเดียว

ซึ่งในการเขียน RoR นั้นก็ใช้หลักการแบบนี้เช่นกัน และตัว Framework เองนั้นออกแบบมาให้มีความสามาถในการสร้างงานที่สูงมาก (High Productivity) กล่าวคือเราไม่จำเป็นต้องออกแบบฟอร์มเองทั้งหมด แต่ตัว Framework จะออกแบบมาให้แล้ว และเรามาปรับแต่งฟอร์มทีหลัง โดยตัวฟอร์มจะมีความสอดคล้องกับข้อมูลที่ออกแบบใน Database มากที่สุด แถมด้วยระบบตรวจสอบข้อมูลในฟอร์มแบบซึ่งสามารถปรับแต่งแก้ไขได้ง่ายมาก ๆ

สำหรับตอนนี้ก็คงต้องกลับไปนั่งเล่นกับมันก่อน เดี่ยวมาเล่าต่อครับ ;)