Как реализовать «Добавить еще один элемент» для пользовательских форм?

9

Я пишу модуль, который в основном представляет собой форму, которая создает связь между двумя конечными точками.

Я хочу, чтобы пользователь мог создавать несколько отношений одновременно. Я хочу добавить кнопку с надписью «добавить другой элемент» так же, как поля, когда вы выбираете неограниченное в их настройках.

Есть ли способ, которым я могу сделать это для пользовательских форм тоже?

Jayaram
источник

Ответы:

12

Один из способов сделать это - установить поля формы / наборы полей внутри функции for. Создайте отдельную функцию для приращения значения, например, с помощью обратного вызова кнопки отправки и перестройте форму после приращения.

for($x=1; $x<=$variabletoincrement; $x++){
(insert form fields/field sets )
}

Вот код из form_example_tutorial_9, который показывает информацию о том, как создавать динамические поля. Эта информация намного тщательнее моего объяснения:

http://api.drupal.org/api/examples/form_example!form_example_tutorial.inc/function/form_example_tutorial_9_add_name/7

http://api.drupal.org/api/examples/form_example%21form_example_tutorial.inc/function/form_example_tutorial_9/7

generalconsensus
источник
8

Чтобы иметь простой и рабочий пример кода:

function MYMODULE_MYFORM($form, &$form_state) {

  // #tree will ensure the HTML elements get named distinctively.
  // Not just name=[name] but name=[container][123][name].
  $form['#tree'] = TRUE;

  if (empty($form_state['number_names'])) {
    $form_state['number_names'] = 1;
  }

  for ($i = 1; $i <= $form_state['number_names']; $i++) {

    $form['container'][$i] = array(
      '#type' => 'container',
    );
    $form['container'][$i]['name'] = array(
      '#type' => 'textfield',
      '#attributes' =>array('placeholder' => t('Name')),
      '#size' => 20,
      '#required' => TRUE,
    );
  }

  $form['add_item'] = array(
    '#type' => 'submit',
    '#value' => t('Add another name'),
    '#submit' => array('MYMODULE_MYFORM_add_item'),
  );

  if ($form_state['number_names'] > 1) {

    $form['remove_item'] = array(
      '#type' => 'submit',
      '#value' => t('Remove latest name'),
      '#submit' => array('MYMODULE_MYFORM_remove_item'),
      // Since we are removing a name, don't validate until later.
      '#limit_validation_errors' => array(),
    );
  }

  // $form['submit'] = array(
  //   '#type' => 'submit',
  //   '#value' => 'Submit',
  // );

  return $form;
}

function MYMODULE_MYFORM_add_item($form, &$form_state) {

  // All we need is to increase the number used in our for loop above ...
  $form_state['number_names']++;
  // ... and rebuild our form.
  $form_state['rebuild'] = TRUE;
}

function MYMODULE_MYFORM_remove_item($form, &$form_state) {

  // Just the other way around until only one item is left ...
  if ($form_state['number_names'] > 1) {
    $form_state['number_names']--;
  }
  // ... and form rebuild again.
  $form_state['rebuild'] = TRUE;
}

Drupal 8

Проверьте примеры модуля AjaxAddMore.php(нажмите на небольшую ссылку «Просмотр источника»).

leymannx
источник