Элементы формы в виде массивов в Drupal

Элементы формы в виде массивов в Drupal

27.01.2011 09:37:32 Просмотров 42 Источник

Использование 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

Является ответом!
SarfarazSoomro

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 является одним из лучших фреймворков форм, с которыми я работал.

Надеюсь, это поможет.

https://stackoverflow.com/questions/4813457/form-elements-as-arrays-in-drupal/4813576#comment28364643_4813576
Мне жаль, что я не видел этого, прежде чем помещать _1 в начальное имя поля формы,а затем увеличивать его с помощью нового javascript, созданного с помощью строковых манипуляций...Бле...
Max

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)
Закрыть X