Tại sao biểu mẫu của tôi theo chủ đề là bảng không đăng dữ liệu chính xác hoặc hiển thị chính xác?


10

Tôi đã tạo một hình thức trong quản trị viên.

$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(),
);

Sau đó tôi thêm từng hàng vào nó như sau:

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),
);

}

Các hình thức trông tuyệt vời! Nhưng vấn đề đầu tiên là giá trị được gán #default_valuekhông hiển thị trong biểu mẫu. Khi tôi thay đổi nó thành #valuegiá trị chính xác, DOES xuất hiện. Vì vậy, tôi tự hỏi làm thế nào điều này nên được thực hiện? Các tài liệu Drupal nói #valuekhông nên được sử dụng với hình thức mặc dù nó đang hoạt động một cách chính xác làm thế nào tôi mong chờ nó hoạt động.

Vấn đề chính là khi tôi điền một số dữ liệu thử nghiệm vào một trong các trường văn bản và gửi nó: Tôi không thấy bất kỳ giá trị nào được gửi trong _submithàm của mình .

Cả $formcũng không $form_statechứa bất kỳ giá trị tôi nhập vào các trường văn bản.

Tôi tự hỏi nếu điều này là bởi vì tôi đang kết xuất #theme => "table" ? Có ai gặp phải vấn đề này không? Bất kỳ ý tưởng nào về các thay đổi tôi có thể thực hiện sẽ cho phép tôi xem các giá trị tôi đang nhập khi tôi gửi biểu mẫu cho _submithàm?

Câu trả lời:


13

Vấn đề là các thành phần trường văn bản của bạn nằm dưới thuộc #rowstính của mảng kết xuất.

Drupal thấy bất kỳ khóa mảng nào bắt đầu bằng #thuộc tính / thuộc tính và bất kỳ khóa mảng nào không bắt đầu bằng khóa đó như là một yếu tố cần được tham gia đệ quy. Vì vậy, những đứa trẻ mà bạn có #rowssẽ bị bỏ qua bởi người xây dựng biểu mẫu.

theme_tablesẽ chạy trên mảng kết xuất, các thành phần biểu mẫu của bạn sẽ thực sự được hiển thị ra màn hình, nhưng biểu mẫu sẽ không có bất kỳ kiến ​​thức nào về các giá trị (vì chúng không phải là kỹ thuật con của biểu mẫu).

Theo kinh nghiệm của tôi, cách tốt nhất để thực hiện loại điều này là sử dụng một chức năng chủ đề cụ thể trên thành phần:

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));
}

Sau đó, trong hàm biểu mẫu của bạn, bạn sẽ sử dụng mã như sau

$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)
  );
}

Sau đó, các trường văn bản của bạn sẽ được đăng ký trong biểu mẫu và bạn sẽ có thể thấy giá trị trong $form_statemảng như bình thường.


Cảm ơn bạn đã trả lời hữu ích của bạn. 1 truy vấn: Làm cách nào để giới hạn 1000 kết quả của tôi trên một trang thành 50 kết quả trong một trang và máy nhắn tin cho trang tiếp theo? Tôi gặp vấn đề khi kết xuất chủ đề ('máy nhắn tin') với điều này.
Himanshu Pathak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.