Come implementare "Aggiungi un altro elemento" per i moduli personalizzati?


9

Sto scrivendo un modulo che è fondamentalmente una forma che crea una relazione tra due punti finali.

Voglio che un utente sia in grado di creare più relazioni contemporaneamente. Voglio aggiungere un pulsante che dice "aggiungi un altro elemento" proprio come hanno i campi quando selezioni illimitato nelle loro impostazioni.

C'è un modo in cui posso farlo anche con moduli personalizzati?

Risposte:


12

Un modo per farlo è impostare i campi modulo / set di campi all'interno di una funzione for. Creare una funzione separata per aumentare il valore tramite una richiamata del pulsante di invio, ad esempio, e ricostruire il modulo dopo l'incremento.

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

Ecco il codice da form_example_tutorial_9 che mostra informazioni su come creare campi dinamici. Questa informazione è molto più approfondita della mia spiegazione:

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


8

Per avere un esempio di codice semplice e funzionante:

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

Dai un'occhiata ai moduli di esempio AjaxAddMore.php(fai clic sul piccolo link "Visualizza sorgente").

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.