×

คำเตือน

JFolder::create: Path not in open_basedir paths.

ปกติเราอาจจะเคยเห็นในการเรียกใช้งานโมเดลจะมีการส่งค่าพารามีเตอร์อยู่ตัวหนึ่งให้กับโมเดล คือ ignore_request ซึ่งจะมีค่าเป็น True วันนี้ผมจะมาพูดถึงค่าพารามีเตอร์ตัวนี่้ของโมเดลกันว่าหมายถึงอะไร และใช้งานตอนไหน

ในการเรียก JModelLegacy::getInstance($type, $prefix, $config) หรือ JModel::getInstance() เราจะสามารถส่งค่าพารามีเตอร์ได้สามตัว ซึ่งเป็นการส่งค่าแบบ Optional คือไม่บังคับทั้งหมด เนื่องจากมันมีค่าโดยปริยายหรือค่าเบื้องต้นอยู่แล้ว โดยเฉพาะการเรียกที่ตัวคอนโทรลเลอร์ แต่มีบ้างเหมือนกันที่เราจำเป็นต้องเรียกโมเดลของคอมโพเนนท์อื่นๆ หรีือโมเดลอื่นๆ ที่ไม่ใช่โมเดลที่คอนโทรลเลอร์โหลดให้เรา ในการเรียกใช้งานผ่าน $controller->getModel() เราก็ส่งพารามีเตอร์ได้สามาตัวเช่นกันนะครับ โดยที่ตัวแรกคือ ชื่อของโมเดล ตัวที่สองคือ Prefix เป็นชื่อคอมโพนเนนท์ตามด้วย Model ส่วนตัวที่สามนี่เป็นอาเรย์ครับ ส่งค่าได้มากมายและ ignore_request ก็เป็นหนึ่งในนั้น

ignore_request มันคืออะไร

ความหมายก็ตามตัวแหละครับ คือให้โมเดลไม่ต้องสนใจ REQUEST ในโปรโตคอล HTTP ครับสำหรับการกำหนดค่า State ของโมเดล โดยในการทำงานของโมเดลจะมีฟังก์ชันอยู่ตัวหนึ่งที่ชื่อ populateState() ซึ่งจะถูกเรียกใช้งานเพียงหนึ่งครั้งเมื่อเรามีการเรียกใช้งานฟังก์ชัน getState() ของโมเดลเพื่อทำการอ่านค่าจาก REQUEST หรือ Session แล้วกำหนดค่าให้กับตัวโมเดล แต่หากเราส่งพารามีเตอร์ ignore_request ไปก็คือเราจะทำการกำหนดค่า State ของโมเดลเองครับ ไม่ใช้ทั้งจาก REQUEST และจาก Session ด้วย ดูดโค้ดชุดแรกที่มีการใช้งาน populateState() ครับ

$model = JModel::getInstance('Courses', 'RegonlineModel');
$items = $model->getItems();

 โดยในส่วนของ getItem ปกติก็จะมีการเรียกใช้งาน getState เพื่อหาค่าพารามีเตอร์อยู่แล้วและจะทำให้เกิดการเรียกใช้งาน populateState ของโมเดลโดยอัตโนมัติ แต่ในตัวอย่างที่สองเราต้องทำการกำหนดค่า State เองครับ ไม่งั้นก็เป็นค่าว่างๆ

$model = JModel::getInstance('Courses', 'RegonlineModel', array('ignore_request'=>true));

$model->setState('filter.start_date', $date);
$items = $model->getItems();

ในส่วนของตัวอย่างนี้เราไม่ต้องการให้โมเดลเรียกใช้งาน populateState() แต่จะกำหนดค่าพารามีเตอร์ให้เอง ซึ่งจะเกิดขึ้นตอนที่เราต้องใช้งานโมเดลนั้น ในตำแหน่งที่ไม่ได้ผ่านตัวคอนโทรลเลอร์ เช่นการเรียกใช้งานจากโมดูล (module) เป็นต้น คิดว่าพอเห็นภาพกันนะครับ ซึ่งข้อดีก็คือเราจะได้ไม่ต้องมาเขียน query ใหม่อีก งานเพิ่มแถมอาจจะมีความผิดพลาดเพิ่มขึ้นได้อีก หากจะแก้ก็ต้องแก้หลายจุดอีกนะครับ ปกติอย่าคิดแค่เขียนโปรแกรมให้เสร็จแต่คิดถึงการดูแลรักษาด้วย ผมเองเคยเขียนโค้ดด้วย Delphi ใช้งานประมาณ 7-8 ปีต้องปรับปรุงต้องแก้ไข รู้เลยว่างานบำรุงรักษาโปรแกรมให้ใช้งานได้นานๆ ไม่ง่ายนะครับ แล้วจะรู้ว่านรกมีจริง

 

comments