หนึ่งในโมดูลยอดนิยมของ Drupal เห็นจะหนีไม่พ้น Webform ที่ใช้สร้างฟอร์มเพื่อรับข้อมูลแบบทางเดียวจากผู้ใช้ไปยังผู้ดูแลระบบ หรือเก็บข้อมูลที่ไม่ต้องการใช้ความสามารถของ node เช่น ฟอร์มสำหรับติดต่อผู้ดูแลระบบ, ฟอร์มสมัครสมาชิก, ฟอร์มแจ้งการชำระเงิน, ฯลฯ
เรื่องมีอยู่ว่า ฟอร์มที่ผมต้องการสร้างนั้นจะต้องมีฟิลด์สำหรับใส่รหัสผ่านด้วย แต่ใน component ของ Webform ไม่มีฟิลด์ password มาให้ ลองค้นไปค้นมาก็พบว่ามันเป็น issue ค้างปีมาตั้งแต่ 2007!!!
จริงๆ การสร้าง component แบบ password เองนั้นก็ไม่ยาก แค่ copy ไฟล์ textfield.inc มา เปลี่ยนชื่อเป็น password.inc แล้วแก้ชื่อฟังก์ชันข้างในจาก *_textfield เป็น *_password ก็เรียบร้อย (คนอื่นเค้าก็ทำกันแบบนี้)
แต่ปกติฟอร์มสำหรับกรอกรหัสผ่านที่ดี ควรจะมีช่อง confirm password ด้วย ซึ่งถ้าทำด้วยวิธีการข้างบน เวลาสร้าง Webform จะต้องสร้างฟิลด์รหัสผ่าน 2 อัน แล้วไปใส่โค้ดเพิ่มในช่อง Additional validation ของ Webform เพื่อให้มันเช็คว่ารหัสผ่านที่ใส่ทั้งสองครั้งตรงกัน สำหรับโค้ดที่ใช้ก็ประมาณนี้
<?php if ($form_values['submitted_tree']['login_information']['password'] != $form_values['submitted_tree']['login_information']['confirm_password']) { form_set_error('submitted][login_information][password', t('The specified passwords do not match.')); } ?>
login_information เป็นชื่อ fieldset ส่วนชื่อฟิลด์จริงๆ คือ password และ confirm_password
วิธีที่ว่ามานี้สำหรับผมขอเรียกว่าวิธี slow and dirty เพราะมันทำให้ชีวิตยุ่งยากขึ้น ถ้ามีการเปลี่ยนชื่อ fieldset หรือชื่อฟิลด์รหัสผ่าน ก็ต้องกลับมาแก้โค้ด validation ทุกครั้ง แต่ก็ใช้งานได้ดีถ้าไม่คิดอะไรมาก
ส่วนวิธี quick and dirty ที่ตั้งใจจะเขียนจริงๆ นั้น พบโดยบังเอิญตอนพยายามแกะ user.module ว่ามันมี form component เฉพาะสำหรับฟิลด์รหัสผ่านให้ด้วย (นึกถึงตอนสร้าง user ใหม่ หรือตอน register user) ซึ่งฟิลด์รหัสผ่านนี้มันจะมาเป็นคู่ และมีระบบ validation มาให้เรียบร้อย แค่กำหนดชนิดของ form component เป็น
'#type' => 'password_confirm'
หลักการเอามาใช้ใน Webform ก็คล้ายๆ กับวิธี slow and dirty คือ copy ไฟล์ textfield.inc มาเป็นต้นแบบ แล้วแก้ไขโค้ดเพื่อกำหนดชนิดของ form component นอกจากนั้นก็แก้ไขโดยคอมเมนต์ตัวเลือกในส่วน default value กับ disabled ออก เพราะคงไม่มีใครกำหนด default value ให้ฟิลด์รหัสผ่านอยู่แล้ว
สรุปง่ายๆ ว่า download ไฟล์ข้างล่างนี้ไปใส่ในไดเร็กทอรี webform/components โดยตั้งชื่อไฟล์เป็น password.inc ก็จะได้ฟิลด์แบบ password พร้อมระบบ confirm และ validation โผล่ขึ้นมาให้เลือกใช้งานตอนสร้าง Webform ครับ

1 comment
Very useful! Thanks!
Post new comment