为什么以表格为主题的表单无法正确发布数据或显示正确?


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不应该与形式,尽管它正在工作正是我将如何指望它的功能被使用。

主要问题是,当我在一个文本字段中填写一些测试数据并提交时:我在_submit函数中看不到任何提交的值。

既不$form也不$form_state包含我输入到文本字段中的任何值。

我想知道这是否是因为我正在渲染#theme => "table"?有没有人遇到这个问题?我对表单所做的任何更改都可以使我在将表单发布到_submit函数时看到输入的值吗?

Answers:


13

问题是您的textfield元素位于#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个查询:如何将我在一个页面上的1000个结果限制为一个页面中50个结果以及下一页的寻呼机?我在用这个来渲染theme('pager')时遇到问题。
人士Himanshu帕塔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.