ระบุ $ form elements ที่จะแยกออกจาก display หรือไม่


20

ฉันต้องการซ่อนองค์ประกอบบางอย่างในแบบฟอร์มโดยใช้ form_alter หรือไฟล์เทมเพลต ฉันได้อ่านที่ไหนสักแห่งว่าใน Drupal 7 เราสามารถระบุองค์ประกอบของ $ form ดังนั้นมันจะไม่แสดงในรูปแบบ แต่ฉันจำไม่ได้! ไม่ได้ล้าง () แต่มีฟังก์ชั่นอื่น!

คำตอบ:


29

การใช้unset()ไม่ใช่โซลูชันที่ดีสำหรับแบบฟอร์ม (อย่างที่ฉันคิดว่าคุณรู้) เนื่องจากคุณไม่มีทางรู้ว่าตัวจัดการการส่ง / ตรวจสอบความถูกต้องอาจคาดหวังว่าองค์ประกอบที่ไม่มีการตั้งค่าจะมีอยู่เมื่อทำการประมวลผล สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดที่ไม่พึงประสงค์

มีสามวิธีที่คุณสามารถใช้เพื่อ 'ซ่อน' องค์ประกอบของฟอร์มได้อย่างปลอดภัย

  • ใช้'#type' => 'value'ในองค์ประกอบซึ่งจะมีผลกระทบที่ค่าสำหรับองค์ประกอบจะยังคงถูกส่งผ่านไปยังฟังก์ชั่นส่ง / ตรวจสอบกับ#valueตามปกติ นี่เป็นวิธีที่ฉันชอบ
  • ใช้'#access' => FALSEองค์ประกอบเพื่อแสดงว่าไม่ควรส่งออกไปยังหน้าจอ
  • ใช้'#type' => 'hidden'ตามที่ Bart แนะนำไว้ (แม้ว่าการใช้สิ่งนี้จะขึ้นอยู่กับกรณีการใช้งานของคุณฉันคิดว่าคุณกำลังพยายามซ่อนค่าขององค์ประกอบแบบฟอร์มที่คุณไม่ต้องการส่งออกในรูปแบบเป็นอินพุตที่ซ่อนอยู่)

ลืมซ่อน ()
Yusef

2
@zhilevan hide()ไม่ควรใช้กับองค์ประกอบของแบบฟอร์มมันสามารถทำให้กระบวนการส่งแบบฟอร์มทั้งหมดยุ่งเหยิงได้เนื่องจากตัวตรวจสอบความถูกต้องยังคงทำงานสำหรับองค์ประกอบ ตัวอย่างเช่นถ้าคุณhide($form['title']);อยู่บนฟอร์มโหนดคุณจะไม่สามารถส่งฟอร์มได้เนื่องจากฟิลด์ชื่อจำเป็น แต่จะไม่มีการระบุค่า 3 วิธีการดังกล่าวเป็นคนดีที่สุดที่จะใช้ในการสั่งซื้อที่ :)
ไคลฟ์

@ ไคลเอนต์ขอบคุณฉันรู้วิธีการข้างต้นคำถามของฉันคือสิ่งที่เกี่ยวข้องกับการซ่อน () ฉันคิดว่า (ยังจำไม่ได้ว่าฟังก์ชั่น) .. แล้วโปรดอ้างอิงความคิดเห็นของฉันในคำตอบที่ 1 ทำไมdrupal_render($form['base']['prices']['sell_price'])ไม่ทำงาน?
Serjas

รหัสนั้นในไฟล์แม่แบบที่อยู่ในฟอร์มหรือไม่ ไม่เช่นนั้นเหตุผลที่มันไม่ทำงานก็คือในขณะที่คุณสามารถพิมพ์องค์ประกอบการแสดงผลใด ๆ ลงบนหน้าจอได้drupal_render()คุณจะไม่ได้รับแท็ก / โทเค็น / แบบฟอร์มใด ๆ นอกเสียจากว่าคุณจะส่งออก$formอาร์เรย์ทั้งหมด
Clive

ฉันใช้ชุดรูปแบบของ hook และ print_r ($ form) และแม้กระทั่ง drupal_render ($ form ['title']) กำลังทำงานปัญหาคือองค์ประกอบภายใต้แท็บ Vertcal!
Serjas

4

หากคุณกำลังใช้แฟ้มแม่แบบที่คุณสามารถซ่อนสิ่งที่ใช้ซ่อน ()

หากคุณต้องการที่จะซ่อนองค์ประกอบแบบฟอร์มในhook_form_alter, unset()อาจจะเป็นตัวเลือกที่ดีที่สุดของคุณ

หากเป็นการเก็บค่าไว้คุณสามารถใช้'#type' => 'hidden' ได้เช่นกัน


hide เป็นวิธีที่ดีกว่าในการเพิ่มจำนวนองค์ประกอบ
Yusef

สิ่งที่ฉันพยายามทำให้สำเร็จคือรูปแบบโหนดผลิตภัณฑ์ Ubsercart ที่กำหนดเองทั้งหมดที่ฉันต้องการแสดงคือ sell_price และซ่อนองค์ประกอบอื่น ๆ เช่นการจัดส่งน้ำหนัก ฯลฯ แต่drupal_render($form['base']['prices']['sell_price'])จะแสดงแบบฟอร์ม แต่จะไม่บันทึก!
Serjas

4

ฉันพบว่าการใช้ #access to false สามารถทำลายบางรูปแบบหากใช้กับปุ่มส่งหรือคล้ายกัน ในกรณีเหล่านั้นฉันเพิ่งใช้ CSS เพื่อซ่อนองค์ประกอบ:

$form['basic']['submit']['#attributes']['class'][] = 'element-hidden';

ตัวเลือกอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.