ทำไม hook_form_alter () ยุ่งจัง?


40

นี่คือตัวอย่างที่ฉันเพิ่งพบ ฉันกำลังพยายามใส่ HTML ลงในฉลากของฟิลด์ของฉัน

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

เหตุใดจึงมีแอตทริบิวต์ #title สามรายการที่มีการใช้งานเพียงหนึ่งเดียว


1
อาร์เรย์ $ form นี้จะถูกสร้างที่ไหน? ฉันรู้ว่าเราไม่มีรูปแบบ $ กับโครงสร้างนี้ใน hook_form_alter
โมฮัมหมัดอาลีอัคบารี

ขอบคุณสำหรับสิ่งนี้. ฉันดึงผมออกมา โครงสร้างอาเรย์นั้นไร้สาระ
JM01

คำตอบ:


72

สิ่งที่คุณเห็นคือ Drupal เป็นตัวแทนของเขตข้อมูลในฟอร์ม มันพังลงมาเช่นนี้

  • ลูกของอาเรย์ด้านนอก$form['field_back']['und']( 'und'สำหรับ'undefined') เป็นภาษาต่าง ๆ ที่ฟิลด์ได้รับการแปล ใน Drupal คุณจะแนะนำให้ใช้LANGUAGE_NONEสำหรับ'und'ในรหัส
  • เด็ก ๆ ในแต่ละอาเรย์ภาษาเช่น$form['field_feedback']['und'][0]เป็นตัวแทนรายการที่แตกต่างกันสำหรับฟิลด์ ตัวอย่างเช่นถ้าข้อมูลมี cardinality ไม่ จำกัด และมีรายการหลายเขตข้อมูลที่พวกเขาจะแสดงเป็น$form['field_feedback']['und'][0], $form['field_feedback']['und'][1]ฯลฯ
  • สุดท้ายคุณมีองค์ประกอบเข้าฟอร์ม (s), $form['field_feedback']['und'][0]['value']ค่าฟิลด์ของตัวเองเช่น ในกรณีนี้ชื่อคอลัมน์คือvalueสำหรับเขตข้อมูลอ้างอิงโหนดพิมพ์มันจะเป็นnidและอื่น ๆ หากเขตข้อมูลมีคอลัมน์ข้อมูลหลายคอลัมน์ที่เชื่อมโยงอยู่คุณจะเห็นเด็ก ๆ เพิ่มขึ้นเช่นกัน เหล่านี้จะถูกแสดงด้วยฟิลด์ข้อความ / เลือกกล่อง / เครื่องมือพิเศษและในที่สุดจะให้ค่าสำหรับฟิลด์

ความจริงที่ว่าชื่อได้ถูกเพิ่มเข้าไปในองค์ประกอบต่าง ๆ ตลอดทั้งลำดับชั้นเป็นเรื่องเล็กน้อยที่จะซื่อสัตย์ ไม่ว่าหัวเรื่องนั้นจะแสดงบนแบบฟอร์มหรือไม่นั้นก็จะเป็นการตั้งค่าเฉพาะของอาเรย์สำหรับการเรนเดอร์ที่แต่ละอัน#titleมีอยู่

ในการเปลี่ยนชื่อเรื่องในวิดเจ็ตแบบฟอร์มที่เกิดขึ้นจริงคุณจะต้องกังวลเกี่ยวกับองค์ประกอบแบบฟอร์มที่ด้านล่างสุดของอาร์เรย์: เช่นองค์ประกอบอินพุตจริง ( $form['field_feedback']['und'][0]['value']ฯลฯ )

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


3
กล่าวโดยย่อคือการเพิ่ม#titleให้กับบางสิ่งที่ Drupal ไม่ได้พิจารณาว่าอาร์เรย์ API ของฟอร์มไม่มีผลใด ๆ แม้ในกรณีนั้นจะไม่มีการกล่าว #title ว่าจะต้องคำนึงถึงเนื่องจากไม่ได้เป็นคุณลักษณะสำหรับทุกองค์ประกอบของฟอร์มที่ Drupal นำมาใช้ API ฟิลด์ทำให้เรื่องซับซ้อนขึ้นเนื่องจากจะเพิ่มอาร์เรย์ปกติให้กับอาร์เรย์ฟอร์ม แต่นั่นไม่ทำให้เกิดความสับสนกับ Drupal ที่มองหา#typeเพื่อให้รู้จักองค์ประกอบของฟอร์ม
kiamlaluno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.