การใช้งาน mosDBTable
แก้ไขล่าสุด ใน วันพฤหัสบดีที่ 30 กันยายน 2553 เวลา 23:39 น. เขียนโดย MrS Siam วันพุธที่ 04 มิถุนายน 2551 เวลา 02:34 น.
ในบทความก่อนหน้านี้ ผมได้มีการพูดถึง database class ตัวหนึ่งของ Joomla! ซึ่งทำให้เราสามารถ insert หรือ update ฐานข้อมูลได้โดยไม่ต้องเขียน sql query ซึ่งทำให้เราได้เห็นประสิทธิภาพในการใช้งาน Joomla! ในตอนนี้ผมจะนำท่านมารู้จักกับอีก class หนึ่งของ Joomla! คือ mosDBTable ซึ่งถือว่าเป็นหัวใจของ class ในส่วนของ article ของ Joomla! โดย mosDBTable จะเป็น abstract class หมายความว่าเราจะไม่สามารถสร้าง object จากมันได้ตรงๆ เราจะต้องทำการสืบทอด (inherite) จาก mosDBTable ก่อน แล้วจึงจะสร้าง object ในบทความนี้ท่านจะได้รู้ว่าเมื่อใดท่านจึงจะสมควรใช้ mosDBTable หรือ การใช้ mosDBTable จะทำให้ท่านเขียนโปรแกรมโดยใช้ Joomla! ได้สะดวก และรวดเร็วขึ้นได้อย่างไร ผมเองยังไม่ได้ดู core ของ 1.5 มากนักจึงยังไม่ได้ดูว่าใน Joomla! 1.5 มีอะไรใหม่บ้าง หรือ class นี้ยังอยูหรือไม่ แต่อย่างน้อย คิดว่าก็น่าจะต้องมี class ในลักษณะนี้แน่ๆ
คุณสมบัติของ mosDBTable
สำหรับ mosDBTable จะมีคุณสมบัติหรือเรียกว่า default property ที่เราจะได้จากการ inherite มาจากมันก็คือ ในเรื่องของ function การทำ check-in และ check-out ตัว record การเพิ่ม hit count และการ publish หรือ unpublish รวมทั้งการ update ลำดับการแสดงผล (ordering) นอกจากนี้ยังมีเรื่องของการ automatic bind หรือ การ get ค่าจาก form มาให้แก่ object โดยอัฒโนมัติ รวมทั้ง function ในการ load และ store หรือ save ข้อมูลลงฐานข้อมูล
Automatic Bind
Automatic Bind อันนี้ผมเรียกเองนะครับ โดยปกติเวลาเราเขียน component เราจะต้องมีการรับค่าจากตัวแปร $_GET หรือ $_POST หรือ $_REQUEST โดยจะใช้ command
$name = mosGetParam($_POST, 'name', '');
แต่ถ้าเรามีตัวแปรที่เป็น object ของ class ที่ inherite จาก mosDBTable และมีชื่อ property เหมือนกับตัวแปรใน form เราสามารถใช้ function bind ในการรับค่าตัวแปรจาก $_GET, $_POST หรือ $_REQUEST ในที่นี้ผมขอเรียกว่า INPUT นะครับให้กับ object ได้โดย class จะทำการให้ค่าเฉพาะ object property ที่มีชื่อตรงกับตัวแปรใน INPUT เท่านั้น ถ้าเป็นค่าอื่นๆ ก็จะไม่มีการเปลี่ยนแปลง
/** * myTable database table class * @package MyComponent */ class myTable extends mosDBTable { /** @var int Primary key */ var $id=null; /** @var string */ var $title=null; /** @var boolean */ var $published=null; /** * @param database A database connector object */ function myTable( &$db ) { $this->mosDBTable( '#__myTable', 'id', $db ); } }
จากตัวอย่างของ class definition ด้านบนถ้าเรามีตัวแปรใน form คือ id, title และ published เราจะสามารถทำการรับค่าจาก INPUT โดยใช้ bind ได้ โดยไม่ต้องใช้ mosGetParam ถึงสามาครั้งในการรับค่า และสามารถใช้ method store() ในการบันทึกข้อมูลลงฐานข้อมูลได้เลย โดยที่ field ของตารางจะต้องมีชื่อเหมือนกับ class property ถ้ามีค่าที่ไม่ตรงกัน หรือขึ้ยต้นด้วย underscore _ mosDBTable ก็จะข้ามไป รวมทั้งค่าของ property ที่มีค่าเป็น NULL ด้วย
global $database; // Declare an instance of the myTable class. $row = new myTableClass( $database ); // Load record with primary key $id. $row->load( $id ); // Update the title field in the database object. if (!$row->bind( $_POST )) { mosErrorAlert( $row->getError() ); } // Save the updated record back to the database. if (!$row->store()) { mosErrorAlert( $row->getError() ); }
Check-in และ Check-out
การทำ check-in และ check-out ใน record ที่ทำการแก้ไขจะใช้สำหรับการ lock ไม่ให้มีการแก้ไขพร้อมๆ กันโดยผู้ใช้หลายๆคน นั่นคือ ถ้าเราทำการ check-out เอกสารจะเป็นการป้องกันไม่ให้คนอื่นแก้ไข record เดียวกัน จนกว่าเราจะทำการบันทึกจึงจะเป็นการ check-in
Published
การ published หรือการตั้งค่าว่าจะให้แสดงเนื้อหาหรือไม่ ซึ่ง mosDBTable จะมี method ในการทำ function นี้
Hit Count
นับจำนวนผู้ชมเนื้อหาหรือ object ของเรา ซึ่งสามารถทำได้โดยการเรียกใช้ method ของ mosDBTable
Ordering
การจัดอันดับในการแสดงว่าจะให้อยู่ในลำดับใด ซึ่งมีทั้งการแก้ไขโดยตรง หรือการเลื่อนขึ้น หรือเลื่อนลง เช่นกัน mosDBTable ก็มี function ให้ใช้เช่นกัน
สำหรับการใช้งานลึกๆ ต้องดูจาก API อีกทีนะครับ ที่ Joomla! Help หรือหากมีเวลาผมจะ update บทความนี้ให้อีกที ตอนนี้มึนกับการนำ code มาใส่ใน content มากๆ เลยครับ คือมันแสดงไม่ได้ดังใจซักที ไม่ว่าจะเป็น Joomla! core GeShi หรือ Geshibot Mambot ก็ตาม สงสัยต้องศึกษา code ดูหน่อยแล้วครับ
| การ insert หรือ update ฐานข้อมูลโดยไม่ต้องเขียน query< ย้อนกลับ | ถัดไป >ทำให้ผู้ใช้ redirect กลับมายังคอมโพเนนท์หลังจากการ login |
|---|


