How to Limit Privatemsg Recipients to Specific Users

คราวที่แล้วเขียนถึงการส่งข้อความจาก 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

Anonymous's picture
Gibbo (visitor) says:

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

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.