ฉันต้องการซ่อนองค์ประกอบบางอย่างในแบบฟอร์มโดยใช้ form_alter หรือไฟล์เทมเพลต ฉันได้อ่านที่ไหนสักแห่งว่าใน Drupal 7 เราสามารถระบุองค์ประกอบของ $ form ดังนั้นมันจะไม่แสดงในรูปแบบ แต่ฉันจำไม่ได้! ไม่ได้ล้าง () แต่มีฟังก์ชั่นอื่น!
ฉันต้องการซ่อนองค์ประกอบบางอย่างในแบบฟอร์มโดยใช้ form_alter หรือไฟล์เทมเพลต ฉันได้อ่านที่ไหนสักแห่งว่าใน Drupal 7 เราสามารถระบุองค์ประกอบของ $ form ดังนั้นมันจะไม่แสดงในรูปแบบ แต่ฉันจำไม่ได้! ไม่ได้ล้าง () แต่มีฟังก์ชั่นอื่น!
คำตอบ:
การใช้unset()
ไม่ใช่โซลูชันที่ดีสำหรับแบบฟอร์ม (อย่างที่ฉันคิดว่าคุณรู้) เนื่องจากคุณไม่มีทางรู้ว่าตัวจัดการการส่ง / ตรวจสอบความถูกต้องอาจคาดหวังว่าองค์ประกอบที่ไม่มีการตั้งค่าจะมีอยู่เมื่อทำการประมวลผล สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดที่ไม่พึงประสงค์
มีสามวิธีที่คุณสามารถใช้เพื่อ 'ซ่อน' องค์ประกอบของฟอร์มได้อย่างปลอดภัย
'#type' => 'value'
ในองค์ประกอบซึ่งจะมีผลกระทบที่ค่าสำหรับองค์ประกอบจะยังคงถูกส่งผ่านไปยังฟังก์ชั่นส่ง / ตรวจสอบกับ#value
ตามปกติ นี่เป็นวิธีที่ฉันชอบ'#access' => FALSE
องค์ประกอบเพื่อแสดงว่าไม่ควรส่งออกไปยังหน้าจอ'#type' => 'hidden'
ตามที่ Bart แนะนำไว้ (แม้ว่าการใช้สิ่งนี้จะขึ้นอยู่กับกรณีการใช้งานของคุณฉันคิดว่าคุณกำลังพยายามซ่อนค่าขององค์ประกอบแบบฟอร์มที่คุณไม่ต้องการส่งออกในรูปแบบเป็นอินพุตที่ซ่อนอยู่)hide()
ไม่ควรใช้กับองค์ประกอบของแบบฟอร์มมันสามารถทำให้กระบวนการส่งแบบฟอร์มทั้งหมดยุ่งเหยิงได้เนื่องจากตัวตรวจสอบความถูกต้องยังคงทำงานสำหรับองค์ประกอบ ตัวอย่างเช่นถ้าคุณhide($form['title']);
อยู่บนฟอร์มโหนดคุณจะไม่สามารถส่งฟอร์มได้เนื่องจากฟิลด์ชื่อจำเป็น แต่จะไม่มีการระบุค่า 3 วิธีการดังกล่าวเป็นคนดีที่สุดที่จะใช้ในการสั่งซื้อที่ :)
drupal_render($form['base']['prices']['sell_price'])
ไม่ทำงาน?
drupal_render()
คุณจะไม่ได้รับแท็ก / โทเค็น / แบบฟอร์มใด ๆ นอกเสียจากว่าคุณจะส่งออก$form
อาร์เรย์ทั้งหมด
หากคุณกำลังใช้แฟ้มแม่แบบที่คุณสามารถซ่อนสิ่งที่ใช้ซ่อน ()
หากคุณต้องการที่จะซ่อนองค์ประกอบแบบฟอร์มในhook_form_alter
, unset()
อาจจะเป็นตัวเลือกที่ดีที่สุดของคุณ
หากเป็นการเก็บค่าไว้คุณสามารถใช้'#type' => 'hidden' ได้เช่นกัน
drupal_render($form['base']['prices']['sell_price'])
จะแสดงแบบฟอร์ม แต่จะไม่บันทึก!
ฉันพบว่าการใช้ #access to false สามารถทำลายบางรูปแบบหากใช้กับปุ่มส่งหรือคล้ายกัน ในกรณีเหล่านั้นฉันเพิ่งใช้ CSS เพื่อซ่อนองค์ประกอบ:
$form['basic']['submit']['#attributes']['class'][] = 'element-hidden';
ตัวเลือกอื่น