2011-01-27 83 views
0

使用Drupal 6.20。将表单元素作为Drupal中的数组使用Drupal

我们可以建立某种形式的内容是这样的: -

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

,然后循环通过他们在PHP与

foreach ($somename as $name) { ... } 

我试图做同样在Drupal。我有一个样式相同的select-elements列表。元素的数量可能会在将来发生变化,因此表单处理必须是动态的。

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

此外,有没有其他的选择来实现相同的?

回答

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

在你提交&验证功能,您将获得价值在你的字段名的数组。

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

希望这会有所帮助。

+0

我希望我把_1初始以前见过这个表单字段名称,然后增加新的JavaScript创建的通过字符串操作... bleh ... – 2013-10-04 03:45:13

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 [“值”]将包含(除其他事项外)你的表单元素值作为数组:

'somename' => 
    array 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
     3 => string '' (length=0) 
     4 => string '' (length=0) 
     5 => string '' (length=0) 
相关问题