ทำไมแบบฟอร์มของฉันมีธีมเป็นตารางไม่โพสต์ข้อมูลอย่างถูกต้องหรือแสดงอย่างถูกต้อง


10

ฉันได้สร้างแบบฟอร์มในผู้ดูแลระบบ

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'table',
  '#header' => array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff')),
  '#rows' => array(),
);

จากนั้นฉันจะเพิ่มแต่ละแถวลงไปเช่น:

foreach ($type_fields as $field_name => $attrs) {
  $stuff = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
  );

$form['things']['#rows'][] = array(
  array('data' => 'label'),
  array('data' => $field_name),
  array('data' => $field_name),
  array('data' => $stuff),
);

}

แบบฟอร์มดูดีมาก! แต่ปัญหาแรกคือค่าที่กำหนดให้#default_valueไม่แสดงในแบบฟอร์ม เมื่อฉันเปลี่ยน#valueเป็นค่าที่ถูกต้องจะปรากฏขึ้น ดังนั้นฉันสงสัยว่าจะทำอย่างไรดี? เอกสาร Drupalกล่าวว่า#valueไม่ควรใช้กับรูปแบบถึงแม้มันจะทำงานว่าวิธีการที่ผมจะคาดหวังให้ฟังก์ชั่น

ปัญหาหลักคือเมื่อฉันกรอกข้อมูลการทดสอบบางอย่างในหนึ่งใน textfields และส่งมัน: ฉันไม่เห็นค่าใด ๆ ที่ส่งมาใน_submitฟังก์ชั่นของฉัน

ไม่มี$formหรือ$form_stateไม่มีค่าใด ๆ ที่ฉันป้อนลงในฟิลด์ข้อความ

ฉันสงสัยว่านี่เป็นเพราะฉันกำลังแสดงผล#theme => "table"หรือไม่ มีผู้ใดประสบปัญหานี้หรือไม่ ความคิดเห็นเกี่ยวกับการเปลี่ยนแปลงใดที่ฉันสามารถทำได้ซึ่งจะทำให้ฉันเห็นค่าที่ฉันป้อนเมื่อโพสต์ฟอร์มไปยัง_submitฟังก์ชัน

คำตอบ:


13

ปัญหาคือองค์ประกอบข้อความของคุณอยู่ภายใต้#rowsคุณสมบัติของเรนเดอร์เรนเดอร์ของคุณ

Drupal เห็นว่าคีย์อาเรย์ใด ๆ ที่เริ่มต้นด้วย#คุณสมบัติ / แอตทริบิวต์และคีย์อาเรย์ใด ๆ ที่ไม่ได้ขึ้นต้นด้วยสิ่งนั้นเป็นองค์ประกอบที่ต้องเข้าร่วมซ้ำ เช่นเด็ก ๆ ที่คุณอยู่ภายใต้#rowsจะถูกละเว้นโดยผู้สร้างแบบฟอร์ม

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

ในประสบการณ์ของฉันวิธีที่ดีที่สุดในการทำสิ่งนี้คือการใช้ฟังก์ชั่นชุดรูปแบบเฉพาะในองค์ประกอบ:

function MYMODULE_theme() {
  return array(
    'MYMODULE_textfield_table' => array(
      'render element' => 'element'
    )
  );
}

function theme_MYMODULE_textfield_table($vars) {
  $element = $vars['element'];

  $rows = array();
  foreach (element_children($element) as $key) {
    $rows[] = array(
      array('data' => 'label'),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => render($element[$key]))
    );
  }

  $header = array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff'));
  return theme('table', array('header' => $header, 'rows' => $rows));
}

จากนั้นในฟังก์ชั่นแบบฟอร์มของคุณคุณจะต้องใช้รหัสดังนี้

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'MYMODULE_textfield_table'
);

foreach ($type_fields as $field_name => $attrs) {
  $form['things'][] = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
    '#extra_data' => array('field_name' => $field_name)
  );
}

หลังจากนั้นฟิลด์ข้อความของคุณควรลงทะเบียนในแบบฟอร์มและคุณควรจะเห็นค่าใน$form_stateอาร์เรย์ตามปกติ


ขอบคุณสำหรับคำตอบที่เป็นประโยชน์ของคุณ 1 ข้อความค้นหา: วิธี จำกัด ผลลัพธ์ 1,000 รายการของฉันในหน้าเดียวให้เหลือ 50 รายการในหนึ่งหน้าและเพจเจอร์สำหรับหน้าถัดไป ฉันมีปัญหาในการเรนเดอร์ธีม ('เพจเจอร์') กับสิ่งนี้
Himanshu Pathak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.