Ajout champs formulaire en ajax

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

J'ai un formulaire simple, avec un champs nom et type sur une ligne.

j'ai tout en haut du formulaire un bouton "ajouter un champs" qui appelle une fonction ajax callback.

Voici le code :

function ajout_form($form,$form_state)
{

$path = drupal_get_path('module', 'contact_work');

    $form['#attached'] = array
    (
        'css' => array
        (
            'type' => 'file',
            'data' => $path . '/css/form_theme_admin.css',
        ),
    );

if(empty($form_state['inc']))
{
$i=rand(1,10);
$form_state['inc']=$i;
}

$form['ajout']=array(
'#type'=>'submit',
'#value'=>'+ Ajouter un champs au formulaire',
'#ajax'=>array('callback'=>'ajout_champs_callback','wrapper'=>'sub_champs'),

);

    $form['Champs'] = array(
      '#type' => 'fieldset',
      '#title' => 'Champs '.$form_state['inc'] ,
      '#suffix' => '<div id="sub_champs"></div>',
    );
 

    $form['Champs']['name'.$form_state['inc']] = array(
      '#title' => t('Nom du champs'),
      '#type' => 'textfield',
    );
   
    $form['Champs']['type'] = array(
'#type'=>'select',
'#title'=>'Type de champs',
'#options'=>array('texte'=>'Texte','select'=>'Select','radio'=>'Radio','textarea'=>'Textarea','checkbox'=>'Checkbox'),
    );
  
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Confirmer les champs',
  );

  return $form;

}

$form_state['inc'] est juste une variable dans le formulaire pour voir si le formulaire retourné est different

voici la fonction callback :

function ajout_champs_callback($form, &$form_state) {

//$form_state['inc']++; n'est plus vrai depuis que j'ai mis le rand(), mais de toute façon elle n'etait pas incrementer....

$form_state['rebuild']=TRUE;
return $form['Champs'];

}

Donc se qui se passe, c'est que cela me genere bien une seconde ligne, mais c'est une duplication de la premiere ligne, avec le meme nom dans le fieldset.

J'ai pas mis la variable dans les champs name et type pour le moment, car je voudrais voir se numero s'incrementer dans le fieldset pour m'assurer que cela fonctionne.

Quelqu'un aurait une idée du comment faire pour incrementer cette variable ?

$form_state['rebuild']=TRUE; // qu'il soit present ou non, cela ne change rien

Merci à la communauté :-)

Forum : 
Version de Drupal : 

Voici la solution que j'ai trouvé :

Ici il faut ajouter la fonction submit

$form['ajout']=array(
'#type'=>'submit',
'#submit'=>array('add_champs'), //<= celle ci
'#value'=>'+ Ajouter un champs au formulaire',
'#ajax'=>array('callback'=>'ajout_champs_callback','wrapper'=>'sub_champs'),

);

La fonction de callback on la change par :

function ajout_champs_callback($form, &$form_state) {
return $form['Champs'];
}

On créer la fonction add_more

function add_more($form, &$form_state) {
$form_state['inc']++;
$form_state['rebuild']=TRUE;
}

Il n'y a donc plus qu'a ajouter dans le code du formulaire une boucle sur les champs à dupliquer

Voilou