在Drupal中将元素表单作为数组

时间:2011-01-27 06:37:33

标签: drupal drupal-6 drupal-fapi

使用Drupal 6.20。

我们可以设置一些这样的表单元素: -

<input type="select" name="somename[]"><option>ohai</option></select>

然后在PHP中使用

循环它们
foreach ($somename as $name) { ... }

我想在Drupal中做同样的事情。我有一个风格相同的select-elements列表。元素的数量可能会在未来发生变化,因此表单处理必须是动态的。

如果我使用上述方法,每个元素将覆盖前一个元素,因此最终只有一个元素被打印到屏幕上。我不能写name="somename[$someid]",因为它不会将$somename解释为数组。
Drupal是支持这个还是我这样做了?

此外,还有其他方法可以实现相同的目标吗?

2 个答案:

答案 0 :(得分:5)

这是一个实现你想要做的事情的例子。


function test_form( &$form_state )
{
  $form = array();
  $delta = 0;
  $form["test_field"]["#tree"] = TRUE;
  $form["test_field"][$delta++] = array(
        "#type" => "textfield",
        "#title" => "Title",
    );
  $form["test_field"][$delta++] = array(
        "#type" => "textfield",
        "#title" => "Title",
    );
  $form["test_field"][$delta++] = array(
        "#type" => "textfield",
        "#title" => "Title",
    );
  $form["submit"] = array(
        "#type" => "submit",
        "#value" => "Submit",
    );
  return $form;
}

在您的提交和&amp;验证函数,您将获得字段名称下的值数组。

请记住,在元素上启用#tree是此方法的关键。 Drupal的表单API也是我使用过的最好的表单框架之一。

希望这有帮助。

答案 1 :(得分:2)

我知道这个问题已得到解答,但我认为有一种更简单的方法,而且只需更改字段数量(或在获取表单时将其作为参数传递)。

function test_form() 
{
    $form['#tree'] = TRUE; // This is to prevent flattening the form value
    $no_of_fields = 5;     // The number of fields you wish to have in the form

    // Start adding the fields to the form
    for ($i=1; $i<=$no_of_fields; $i++)
    {
        $form['somename'][$i] = array(
            '#title' => t('Test field no. '.$i),
            '#type'  => 'textfield',
        );      
    }
    // Add the submit button
    $form["submit"] = array(
        "#type"  => "submit",
        "#value" => "Submit",
    );  
}

提交$ form_state ['values']时,将包含(除其他外)表单元素值作为数组:

  'somename' => 
    array
      1 => string '' (length=0)
      2 => string '' (length=0)
      3 => string '' (length=0)
      4 => string '' (length=0)
      5 => string '' (length=0)