มีอะไรใหม่ใน Joomla! 1.6 Controller
แก้ไขล่าสุด ใน วันอาทิตย์ที่ 13 กุมภาพันธ์ 2554 เวลา 03:25 น. เขียนโดย ประสิทธิ์ เก็บทรัพย์ วันจันทร์ที่ 07 กุมภาพันธ์ 2554 เวลา 09:44 น.
หลังจากที่ Joomla! 1.6 รุ่น Stable ได้ออกมาแล้วอย่างเป็นทางการ ก็เริ่มมีเสียงเรียกร้องจากกลุ่มผู้ใช้ JONGman สำหรับการใช้งานบน Joomla! 1.6 จึงได้เริ่มหันมา port ตัว JONGman 1.0 มาเป็น JONGman 2.0 สำหรับ Joomla! 1.6 ซึ่งก็ได้สัมผัสการใช้งานจริงๆ ถึงการปรับปรุงในส่วนของ MVC Pattern ทีใช้ในการพัฒนา extension สำหรับ Joomla! 1.6 หลังจากที่ก่อนๆ เคยได้แค่ฟังเขาเล่าว่าในทีม Joomla! Bug Squad (JBS) ซึ่งก็มี Concept หลายๆอย่างที่มีการเปลี่ยนแปลงให้มีรูปแบบมากขึ้น ซึ่งข้อมูลเหล่านี้บางส่วนได้จาก Lead Team Member ของ Joomla! บางส่วนก็จากการศึกษา code ของตัว Component ต่างๆ แต่ใน Joomla! Component ต่างๆ ยังเป็นแบบพื้นๆ ยังไม่ค่อยเห็นการประยุกต์ใช้งานมากเท่าไร
ในส่วนของ Component ต่างๆ ใน Joomla! 1.6 จะได้รับการปรับปรุงให้เป็นแบบ MVC มากขึ้น โดย Component ตัวอย่างที่ใช้เป็นรูปแบบได้ก็คือ Banners และ WebLinks สำหรับในบทความนี้ผมจะพูดถึงการเปลี่ยนแปลงรูปแบบในส่วนของ Controller และ Component Dispatcher กัน
Component Dispatcher ใน Joomla! 1.6
สำหรับท่านที่ยังใหม่กับ MVC ตัว Component Dispatcher ก็คือไฟล์แรกของ Component ที่ Joomla! ทำการเรียกใช้ซึ่งจะมีชื่อตาม Component ของเราโดยตัดเอา com_ ออกจากชื่อ เช่น Component ผมชื่อ com_jongman ตัวไฟล์ที่ Joomla! จะทำการโหลดขึ้นมา run ก็คือ <JOOMLA_ROOT>/components/com_jongman/jongman.php สำหรับส่วนของ site ซึ่งหน้าที่ของ Dispatcher ก็คือทำการเลือกและสร้าง Controller ที่ต้องใช้งานตาม input ที่ได้จากผู้ใช้ผ่าน URI นั่นเอง หลังจากนั้นมันจะทำการเรียกใช้งาน method ของ Controller ตามชื่อตัวแปร task ใน Request ที่ได้ และทำการ Redirect ถ้าหากว่าหลังจากทำการทำงานตาม task แล้วมีการกำหนด Redirect URL ไว้ ซึ่ง code ในส่วนของ Dispatcher จะสั้นมากเนื่องจากว่าส่วนของการเลือก Controller Class ที่จะสร้างใน Joomla! 1.6 เราไม่ต้องเขียนเองแล้วครับ เพราะมันจะไปอยู่ใน JController แทนครับ สบายจริงๆ สำหรับ Code ในส่วนของ Banners เป็นตามนี้ครับ

ลองดูจาก code ครับจะเห็นว่ามันสั้นมากๆ ถ้าเทียบกับ code ที่เราเคยเขียนใน Joomla! 1.5 เนื่องจากส่วนของการเลือกว่าจะใช้ Controller ตัวใดจะไปอยู่ในส่วนของ JController ซึ่งในบรรทัดที่ 21 จะเห็นส่วนของชื่อ Component ที่ส่งไปให้ JController กับบรรทัดที่ 13 ซึ่งเป็นส่วนของการตรวจสอบ ACL ตามรูปแบบใหม่ของ Joomla! 1.6 ที่เราจะต้องเปลี่ยนใน component ของเรา ลองมาดูส่วนของ JONGman dispatcher บ้างครับ

จะเห็นว่ามีความแตกต่างกันน้อยมาก มีส่วนที่เพิ่มมาคือการกำหนด default view สำหรับ JONGman เนื่องจาก JController จะใช้ชื่อ view เหมือนกับ component ถ้าเราไม่กำหนดค่า เช่น Banners ตัว default view ก็คือ banners แค่ JONGman ต้องการให้เป็น cpanel
Master Controller
ในตัว Component Banners ถ้าเราดูใน root folder ของทั้ง frontend และ backend ของมันเราจะพบว่ามีๆไฟล์ชื่อ controller.php อยู่ในนั้นจะมี Class ชื่อ BannersController หรือ <Extname>Controller โดยที่ <Extname> คือชื่อของ Component โดยที่ Class ตัวนี้จะสืบทอดต่อจาก JController เราจะเรียก class ตัวนี้ว่า Master Controller ซึ่งจะรับผิดชอบในการแสดงผลทั้งหมดทั้งในรูปแบบของรายการ (List) หรือ ฟอร์มสำหรับการเพื่มหรือแก้ไข (Item) โดยในกรณีที่ใน URI ไม่ได้กำหนด task หรือกำหนด task ไม่ใช่รูปแบบของ controller.method ตัว JController จะทำการใช้งาน Class ตัวนี้ซึ่งรูปแบบการเรียกใช้มีดังนี้
-
index.php?option=com_jongman
-
index.php?option=com_jongman&view=resources
-
index.php?option=com_jongman&view=resource&layout=edit
ในทุกๆ กรณีเราจะเห็นว่า task ไม่ได้อยู่ในรูปแบบของ controller.method ดังนั้น Controller ที่ถูกเรียกใช้คือ Master Controller โดยมีรายละเอียดดังนี้
-
กรณีที่ 1 ไม่มีการหนด view จะใช้ default view สำหรับ JONGman คือ cpanel ตามด้านบน คือ task คือ default task ก็คือ display และ layout คือ default.php และเรียกใช้งาน model ชื่อเดียวกับ view คือ cpanel (method display จะ load model ชื่อเดียวกับ view)
-
กรณีที่สอง ใช้ view คือ resources ส่วนของ task ไม่มีการกำหนดใช้ default task คึอ display และทำการสร้าง model ชื่อ resources เช่นเดียวกัน
-
กรณีที่ 3 มีการกำหนด view คือ resource ซึ่งตัว controller จะสร้าง model ชื่อเดียวกันคือ resource.php ส่วน task คือ display และใช้ layout คือ edit.php
จะเห็นว่า task ของมันก็คือ display ทั้งหมด เพียงแต่จะต่างกันที่ view และ layout โดยที่ view ที่มีชื่อเป็น plural หรือมี s ต่อท้ายคือ การแสดงรายการ ส่วนประเภท singular name คือ การแสดง record เพียงหนึ่ง record หรือการแสดง form นั่นเอง
Subcontrollers
Controller กลุ่มนี้จะอยู่ใน folder ชื่อ controllers โดยจะถูกเรียกใช้โดยการกำหนด task ในรูปของ controller.method เช่น resource.edit เป็นต้น ซึ่ง task ก็คือ method ของ controller นั่นเอง โดยใน JController จะมีการ reset ตัว task จาก controller.method เป็น method อย่างเดียวหลังจากได้ class ของ controller ที่จะเรียกใช้แล้ว โดยการทำงานของ controller เหล่านี้หลังจากการทำงานแล้วจะ redirect กลับไปที่ master controller เสมอ
ในส่วนของ subcontrollers ใน Joomla! 1.6 จะมี class ให้เรามากขึ้นคือ
-
JControllerAdmin ซึ่งจะสืบทอดมาจาก JController อีกที โดยใน JControllerAdmin จะไม่มีการรองรับการใช้งาน method display แต่จะมี method เกี่ยวกับการทำงานที่ไม่ต้องใช้ view คือ delete publish reorder saveorder และ checkin โดยใน method เหล่านี้จะมีการกำหนด redirect link ไว้ให้เรียบร้อย โดยมันจะทำการหา view ที่จะ redirect มายัง master controller โดยใช้ค่าจาก $view_list หรือถ้าไม่มีก็ใช้ชื่อของ controller ปัจจุบันที่ใช้งานอยู่ ดังนั้นในกรณีนี้เราจึงต้องใช้ controller ในรูปของ Plural name เช่น resources.delete มันจะ redirect มาที่ &view=resources
-
JControllerForm ซึ่งเช่นกันสืบทอดมาจาก JController โดยมี public methods คือ add edit และ cancel นอกนั้นจะเป็น protected methods ที่ใช้สำหรับการตรวจสอบสิทธิ และการหา link ที่จะ redirect กลับไป master controller นอกจากนี้ยังมี getModel ที่ใช้สำหรับการหา Model ที่จะใช้งาน เนื่องจากใน JController ซึ่งเป็น class แม่จะใช้ชื่อเดียวกับตัว Controller ซึ่งเราสามารถเปลี่ยนแปลงโดยการ override มัน ถ้าเราสังเกตุจะพบว่าจริงๆ แล้ว task เหล่านี้มันจะเกี่ยวข้องกับ view หรือ form ที่แสดงให้ผู้ใช้เพื่อรับ input แต่ใน class นี้มันจะทำการดึงค่า ID ของ record และใส่ไว้ใน session ก่อนจะ redirect ไปยัง Master Controller โดยในส่วนของ model ตอนที่ใช้งานกับ Master Controller คือชื่อ view เช่น resource, resources แต่สำหรับกรณี add หรือ edit ชื่อของ view จะอยู่ในรูป Singular name เป็นหลักเช่น resource เป็นต้น ในขณะที่กรณีของ cancel จะเป็นการกลับไปที่รายการ ดังนั้นชื่อ view จะเป็นรูปแบบ Plural name คือ resources เป็นต้น
หลังจากเขียนเรื่องนี้มาเป็นรอบที่สอง ก็คิดว่าน่าจะสื่อสารได้เข้าใจมากขึ้น หลังจากที่ครั้งแรกเขียนเป็นภาษาอังกฤษที่ docs.joomla.org อาจจะต้องกลับไป update อีกหลายรอบทีเดียว หากท่านใดอ่านแล้วมีคำแนะนำก็ยินดีรับไว้เพื่อปรับปรุงต่อไปครับ
| ประโยชน์ของ Discover ใน Joomla! 1.6+ สำหรับ Programmer< ย้อนกลับ |
|---|


