使用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是支持这个还是我这样做了?
此外,还有其他方法可以实现相同的目标吗?
答案 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)