A Simple Way to Integrate Webform and PrivateMsg in Drupal

ตอนนี้กำลังปรับแต่งระบบเว็บให้เพื่อนอยู่ครับ หลักๆ คือมีหน้า register ที่สร้างจาก Webform โดยมี requirement ว่า เมื่อผู้ใช้ submit Webform แล้วให้ส่งข้อความไปเตือน admin ว่ามีคนสมัครใช้บริการใหม่ด้วย

ตอบไปว่าเซ็ตนิดเดียวก็ได้แล้ว เพราะนึกว่า Webform มันคงสนับสนุน Privatemsg ด้วย แต่ลอง google ดูก็พบกับคำตอบที่น่าเศร้า เลยต้องหาวิธีทำเอาเอง

ไปๆ มาๆ พบว่าไม่ยากอย่างที่คิด เนื่องจากตอนสร้าง Webform ใหม่ เราสามารถใส่โค้ด additional processing ลงในส่วนของ Webform advanced settings ได้ โดยโค้ดในส่วนนี้จะรันเมื่อข้อมูลที่ส่งเข้ามาผ่านการ validate และพร้อมจะเก็บลงในฐานข้อมูลแล้ว

ดูจาก Privatemsg API ก็พบว่า ฟังก์ชันที่เราต้องการคือ privatemsg_new_thread() แต่ข้อมูลในหน้า documentation จะไม่อัพเดตเท่าที่ควร ยังดีที่ชื่อฟังก์ชันยังเหมือนเดิม และมีคำแนะนำให้ไปอ่านจากคอมเมนต์ของฟังก์ชัน privatemsg_new_thread ในไฟล์ privatemsg.module แทน

แต่พอลองใส่โค้ดเข้าไปแล้ว ทำยังไงมันก็ไม่ส่ง PM มาให้ซักที เลยไปไล่โค้ดใน privatemsg.module พบว่า author ต้องเป็น user ที่มี permission "write privatemsg" เท่านั้น ที่ส่ง PM ไม่ได้ในตอนแรกเพราะ Webform นี้จะถูก submit โดยมี author เป็น Anonymous เสมอ วิธีแก้ก็ตรงไปตรงมาคือกำหนด author ให้เป็น user อื่นแทน

หน้าตา code snippet ที่เอาไปใส่ในส่วน additional processing ก็ประมาณนี้

<?php
  privatemsg_new_thread(array(user_load(2), user_load(30)), 'New user registration', $form_values['submitted_tree']['login_information']['username'] . ' has just submitted the registration form.', array('author' => user_load(1)));
?>

อธิบายคร่าวๆ คือเมื่อมีการ submit Webform จะส่ง PM ไปหา user id 2 และ 30 โดยมี subject และ body ตามที่กำหนด ส่วนสำคัญคือ array('author'... ซึ่งผมใช้ user id 1 (super admin) เพื่อความง่าย แต่จริงๆ จะเป็น user อะไรก็ได้ ขอให้มี permission "write privatemsg" เป็นใช้ได้

ปล. ระหว่าง google เจอโมดูลที่จะทำให้ Privatemsg ดูโปร + ใช้งานสะดวกขึ้นเยอะ มันคือ Private Message Growl ครับ :)

1 comment

Anonymous's picture
onequad (visitor) says:

แจ่มเลยครับ กำลังรอ Privatemsg 1.0 แล้วจะเอามาใช้เหมือนกันครับ

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.