web-dev-qa-db-fra.com

Ajouter des champs à former dynamiquement avec ajax et récupérer des valeurs

J'essaie d'ajouter une combinaison de champ de texte et une zone de sélection à un formulaire dynamiquement en utilisant Drupal 7 Ajax, lorsque je clique sur un bouton.

Mais j'ai 2 problèmes ici:

  1. Je ne peux pas ajouter plus d'un ensemble de champs dans le formulaire avec Ajax
  2. Après avoir soumis le formulaire, je ne suis pas en mesure de récupérer les valeurs du formulaire. Ils sont vides. J'ai les champs comme "name_1", "select_1", "name_2", "select_2", etc.

Je veux savoir s'il existe un moyen de le résoudre, avec/sans utiliser un fieldset.

Mon code de module personnalisé:

function my_form_form($form, &$form_state, $no_js_use = FALSE) {  
  $form['#tree'] = TRUE;
  $form['add_more'] = array(
    '#type' => 'button',
    '#value' => t('Add More'),
    '#href' => '',
    '#ajax' => array(
    'callback' => 'ajax_simplest_callback',
    'wrapper' => 'names-fieldset-wrapper',
  );
  $form['names']['name_1'] = array(
    '#type' => 'textfield', 
    '#title' => t('Name 1'),  
    '#attributes'=>array('id'=>'name_1', 'name'=>'name_1'),           
  );
  $form['names']['select_1'] = array(
    '#type' => 'select', 
    '#title' => t('Select 1'),    
    '#attributes'=>array('id'=>'select_1', 'name'=>'select_1'), 
    '#options'=>array('1'=>'One', '2'=>'Two', '3'=>'Three'),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),  
  );
  $form['#submit'][] = 'my_form_add_more_submit';       
  return $form;
}
function ajax_simplest_callback($form, &$form_state) {
  if (empty($form_state['num_names'])) {
    $form_state['num_names'] = 1;
  }
  else {
    $form_state['num_names']++;
    $form_state['rebuild'] = TRUE;
  }

  for ($i = 1; $i < $form_state['num_names']; $i++) {       
    $form['names']['name_'.$i+1] = array(
      '#type' => 'textfield', 
      '#title' => t('Name '.$i+1),    
      '#attributes'=>array('id'=>'name_'.$i+1, 'name'=>'name_'.$i+1), 
    );    
    $form['names']['select_'.$i+1] = array(
      '#type' => 'select', 
      '#title' => t('Select '.$i+1),    
      '#attributes'=>array('id'=>'select_'.$i+1, 'name'=>'select_'.$i+1), 
      '#options'=>array('1'=>'One', '2'=>'Two', '3'=>'Three'),
    );
  }
  return $form['names'];
}

function my_form_add_more_submit($form, &$form_state) {
  print_r($form_state['values']);
  exit();
}
6
shasi kanth

Ne définissez aucun champ #required à vrai.

 $form['markup'] = array(
        '#type' => 'markup',
        '#prefix' => '<div id="my-wrapper">',
        '#suffix' => '</div>',
    );
 $form['markup']['myfield'] = array(
        '#type' => 'textfield', 
        '#size' => 12,
    );
1
Sumit Madan

Vous devez reconstruire votre formulaire dans votre fonction de formulaire afin que vos valeurs soient intégrées au formulaire. Vous souhaitez également utiliser les ensembles de champs et leur arborescence pour rendre les données un peu plus organisées.

function my_form_form($form, &$form_state, $no_js_use = FALSE) {

        $form['add_more'] = array(
          '#type' => 'button',
          '#value' => t('Add More'),
          '#ajax' => array(
            'callback' => 'ajax_simplest_callback',
            'wrapper' => 'replace-this',
            'method' => 'replace',
           ),
        );

        $form['names'] = array(
          '#type' => 'fieldset',
          '#title' => 'Names',
          '#prefix' => '<div id="replace-this">',
          '#suffix' => '</div>',
          '#tree' => TRUE,
        );

        // build the initial field if this is not being rebuilt 
        // from ajax request
        if (!array_key_exists('clicked_button', $form_state)) {
          $form['names'][0] = array('#type' => 'fieldset');
          $form['names'][0]['name'] = array(
            '#type' => 'textfield',
            '#title' => t('Name'),
            '#parent' => 'test',
          );
          $form['names'][0]['select'] = array(
            '#type' => 'select',
            '#title' => t('Select'),
            '#parent' => 'test',
            '#options'=>array('1'=>'One', '2'=>'Two', '3'=>'Three'),
          );
        } else {
          // otherwise add the fields for each existing value
          foreach ($form_state['input']['names'] as $i => $value) {
            $form['names'][$i] = array('#type' => 'fieldset');
            $form['names'][$i]['name'] = array(
              '#type' => 'textfield',
              '#title' => t('Name'),
              '#default_value' => $form_state['input']['names'][$i]['name'],
            );
            $form['names'][$i]['select'] = array(
              '#type' => 'select',
              '#title' => t('Select'),
              '#default_value' => $form_state['input']['names'][$i]['select'],
              '#options'=>array('1'=>'One', '2'=>'Two', '3'=>'Three'),
            );
          }

          // add the additional field for a new entry
          $last = count($form_state['input']['names']);
          $form['names'][$last] = array('#type' => 'fieldset');
          $form['names'][$last]['name'] = array(
              '#type' => 'textfield',
              '#title' => t('Name'),
          );
          $form['names'][$last]['select'] = array(
              '#type' => 'select',
              '#title' => t('Select'),
              '#options'=>array('1'=>'One', '2'=>'Two', '3'=>'Three'),
          );
        }

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

        return $form;
    }

    function ajax_simplest_callback($form, &$form_state) {
        return $form['names'];
    }

    function my_form_add_more_submit($form, &$form_state) {
        print_r($form_state['values']);
        exit();
    }
1
thumbson