Элементы формы в виде массивов в Drupal
Использование 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 это или я делаю это worng?
Кроме того, есть ли какая-либо другая альтернатива для достижения того же?
Ответы - Элементы формы в виде массивов в Drupal / Form elements as arrays in Drupal

27.01.2011 09:57:13
Вот пример достижения того, что вы пытаетесь сделать.
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;
}
В вашей функции submit & validate вы получите массив значений под именем вашего поля.
Помните, что включение #tree на вашем элементе является ключом к этому подходу. Кроме того, API формы Drupal является одним из лучших фреймворков форм, с которыми я работал.
Надеюсь, это поможет.


15.03.2011 12:27:24
Я знаю, что на этот вопрос был дан ответ, но я думаю, что есть более простой способ, который менее многословен, и вам нужно только изменить количество полей (или передать его в качестве аргумента при получении формы).
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)