คราวที่แล้วเขียนถึงการส่งข้อความจาก Webform โดยใช้โมดูล Privatemsg ไป คราวนี้ก็ยังคงวนเวียนอยู่กับโมดูล Privatemsg เหมือนเดิม
พอดีเว็บที่กำลังทำอยู่ มี requirement ว่าให้ผู้ใช้สามารถส่งข้อความส่วนตัวถึงผู้ดูแลระบบได้เท่านั้น โดยระบบส่งข้อความจะใช้โมดูล Privatemsg เป็นหลัก
วิธีทำที่คิดไว้คร่าวๆ ก็คือต้องแก้ไขฟอร์มสำหรับส่ง private message โดยกำหนดชื่อผู้รับไว้ตายตัวคือ admin จากนั้นก็ disable หรือซ่อนฟิลด์ Recipients ซะ ให้ผู้ใช้กรอกเฉพาะ Subject กับ Body พอ แน่นอนว่าพระเอกของงานนี้คือ Form API
หลักการคือสร้างโมดูลใหม่ แล้ว implement hook_form_alter() ขี้เกียจอธิบายยาว เอาโค้ดไปดูก่อนละกัน :P
/** * Implementation of hook_form_alter(). */ function mymodule_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'privatemsg_new') { $form['privatemsg']['recipient_list'] = array( '#title' => t('To'), '#type' => 'item', '#value' => 'admin', '#weight' => -10, ); $form['privatemsg']['recipient'] = array( '#type' => 'value', '#value' => 'admin', ); } }
อันนี้คือแบบทื่อๆ สุดๆ อธิบายความหมายได้ดังนี้
- เพิ่มฟิลด์ recipient_list เอาไว้โชว์ให้ผู้ใช้เห็นว่า ฟอร์มนี้จะส่งไปให้ admin นะ สังเกตว่า
#typeเป็น item ธรรมดา ไม่มีประโยชน์อื่นนอกจากเอาไว้แสดงผล - เปลี่ยนฟิลด์ recipient เป็นแบบ value แล้วกำหนดค่าเป็น admin
ส่วนที่สำคัญคือฟิลด์ recipient เนื่องจากค่าในฟิลด์นี้ เป็นตัวกำหนดรายชื่อของผู้ใช้ที่ Privatemsg จะส่งข้อความไปให้ ปกติ #type ของฟิลด์นี้จะเป็น textfield แต่เราเปลี่ยนให้เป็น value ซะ ซึ่งมันจะไม่โชว์ในฟอร์ม แต่จะส่งค่าไปด้วยเมื่อผู้ใช้กด submit เป็นการบังคับว่ายังไงๆ ก็ต้องส่งไปหา admin ชัวร์ๆ
แน่นอนว่าถ้าต้องการบังคับให้ส่งไปหามากกว่า 1 คน ก็สามารถระบุลงไปใน #value ของฟิลด์ recipient ได้เลย โดยใช้ลูกน้ำคั่น เช่น 'admin, user1, user2'
จากหลักการนี้เราสามารถปรับเปลี่ยนรูปแบบฟอร์มของ Privatemsg ได้อีกเยอะ ตามแต่ความต้องการ เช่น เปลี่ยนจาก textfield เป็น drop-down list หรืออาจจะกรองรายชื่อ user ตาม role หรือตามข้อกำหนดบางอย่าง ก่อนที่จะเอามากำหนดเป็น value หรือเป็นลิสต์ให้เลือกอีกที เป็นต้น
ในโมดูลที่ใช้จริงจะมีรายละเอียดมากกว่านี้ เช่น ผู้ใช้บางคนจะสามารถส่งข้อความหาใครก็ได้ ก็สามารถทำได้โดยกำหนด permission ให้ผู้ใช้ แล้วมาเพิ่มเงื่อนไขในโค้ดให้ตรวจสอบก่อนจะแก้ไขฟอร์ม ฯลฯ อะไรทำนองนี้ครับ

1 comment
hook_form_alter()คือ จุดอ่อนของผมเลย!Post new comment