Problème Ajax et Formulaire

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,

Je viens vers vous car j'ai un problème avec l'Ajax et Drupal. Mon objectif et de pouvoir récupérer une valeur dans une liste et de la sauvegarder sur le projet actuel que je visualise. Mes url ressemblent à ça :

homeproject?projet=3154

En fait je récupère l'id du projet en cours de visualisation, je charge plusieurs valeur que je mets dans ma liste comme ceci :

function header_eltmission_form($form, &$form_state) {
  //if(current_path() != 'homeuser') {

    $elmissionvalues['AVC'] = "Avant-Contrat";
    $idPjt = $_REQUEST['projet'];
    $mission = _getElementMissionNode_ByPjt($idPjt);

    if(isset($mission)){
      foreach ($mission as $value) {
        $elmissionvalues[t($value->title)] = t($value->title);
      }
    }

    $form = array();
    $form['list_eltmission'] = array(
      '#type' => 'select',
      '#attributes' => array('name' => array('list_eltmission')),
      '#prefix' => '<div class=\'block block-block contextual-links-region\'>',
      '#suffix' => '</div>',
      '#options' => array_unique($elmissionvalues),
      '#ajax' => array(
        // 'callback' is a function that will be called when this element changes.
        'callback' => 'header_eltmission_callback',
        // 'wrapper' is the HTML id of the page element that will be replaced.
        'wrapper' => 'replace_textfield_div',
      ),
    );

    // This entire form element will be replaced whenever 'changethis' is updated.
    $form['replace_textfield'] = array(
      '#type' => 'fieldset',
      '#prefix' => '<div id="replace_textfield_div">',
      '#suffix' => '</div>',
    );

    // An AJAX request calls the form builder function for every change.
    // We can change how we build the form based on $form_state.
    /*if (!empty($form_state['values']['list_eltmission'])) {
      $form['replace_textfield']['#description'] = t("La valeur '@value' a été mise à jour sur le projet", array('@value' => $form_state['values']['list_eltmission']));
    }*/
    return $form;
  //}
}

function header_eltmission_callback($form, $form_state) {
  $valeur = $form_state['values']['list_eltmission'];
  $idPjt = str_replace("/homeproject?projet=", "", $form['#action']);

  $node = node_load($idPjt);
  $node->field_pjt_element_de_mission = array('und'=>array(array('value'=>$valeur)));
  node_save($node);

  return $form['replace_textfield'];
}

J'affiche ensuite ma liste avec un alter page :

function header_eltmission_page_alter(&$page) {
  if(current_path() != 'homeuser') {
    $page['header'] = array(
        t('Mission') => drupal_get_form('header_eltmission_form'),
    );
  }
}

Le code fonctionne très bien. Quand je choisis une première fois un choix dans la liste tous fonctionne, aucune erreur n'est produite la node ce save. mais au deuxième choix dans la liste j'ai l'erreur suivante :

"Un choix interdit a été détecté. Veuillez contacter l'administrateur du site."

je ne comprend pas pourquoi elle apparaît, si quelqu'un peut m'aider svp ?

Merci

Forum : 
Version de Drupal : 

EN mettant :

'#validated' => TRUE,

dans ma création du select je n'ai plus l'erreur... Est ce une bonne technique ou dois je faire autrement ?

Par contre la liste n’apparaît seulement après rafraîchissement du cache et si je vais sur un autre projet celle ci n'est plus disponible(elle n'est plus présente) pourquoi ?

Bonsoir,

ta fonction de callback ne peut retourner qu'un élément du formulaire :

  • Callback element needs only select the portion of the form to be updated.
  • Since #ajax['callback'] return can be HTML or a renderable array (or an
  • array of commands), we can just return a piece of the form.

++