Wie implementiere ich "Ein weiteres Element hinzufügen" für benutzerdefinierte Formulare?

9

Ich schreibe ein Modul, das im Grunde eine Form ist, die eine Beziehung zwischen zwei Endpunkten herstellt.

Ich möchte, dass ein Benutzer mehrere Beziehungen gleichzeitig erstellen kann. Ich möchte eine Schaltfläche hinzufügen, die "Ein weiteres Element hinzufügen" sagt, genau wie Felder, wenn Sie in ihren Einstellungen unbegrenzt auswählen.

Gibt es eine Möglichkeit, dies auch für benutzerdefinierte Formulare zu tun?

Jayaram
quelle

Antworten:

12

Eine Möglichkeit, dies zu tun, besteht darin, die Formularfelder / Feldsätze innerhalb einer for-Funktion festzulegen. Erstellen Sie eine separate Funktion, um den Wert beispielsweise über einen Rückruf der Schaltfläche "Senden" zu erhöhen und das Formular nach dem Inkrementieren neu zu erstellen.

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

Hier ist Code aus form_example_tutorial_9, der Informationen zum Erstellen dynamischer Felder enthält. Diese Informationen sind viel gründlicher als meine Erklärung:

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

allgemeiner Konsens
quelle
8

So haben Sie ein einfaches und funktionierendes Codebeispiel:

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

Schauen Sie sich die Beispielmodule an AjaxAddMore.php(klicken Sie auf den kleinen Link "Quelle anzeigen").

Leymannx
quelle