web-dev-qa-db-fra.com

Comment implémenter "Ajouter un autre élément" pour les formulaires personnalisés?

J'écris un module qui est essentiellement un formulaire qui crée une relation entre deux points d'extrémité.

Je veux qu'un utilisateur puisse créer plusieurs relations à la fois. Je veux ajouter un bouton qui dit "ajouter un autre élément" tout comme les champs ont lorsque vous sélectionnez illimité dans leurs paramètres.

Existe-t-il un moyen de le faire également pour les formulaires personnalisés?

9
Jayaram

Pour ce faire, vous pouvez définir les champs de formulaire/jeux de champs dans une fonction for. Créez une fonction séparée pour incrémenter la valeur via un rappel de bouton de soumission par exemple et reconstruisez le formulaire après avoir incrémenté.

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

Voici le code de form_example_tutorial_9 qui montre des informations sur la façon de créer des champs dynamiques. Cette information est beaucoup plus approfondie que mon explication:

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

12
generalconsensus

Pour avoir un exemple de code simple et fonctionnel:

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

Consultez l'exemple de module AjaxAddMore.php (cliquez sur le petit lien "Voir la source").

8
leymannx