Envoyer une requete http à chaque modif d'un multiselect

Catégories:

Bonjour,

J’utilise content_taxonomy pour un champ autocomplete, jusque là tout va bien.

Je voudrais que la liste fournie pour l’auto-complétion dépende des choix fait dans d’autres champs de taxo «classiques», en multiselect.

Je vois bien comment modifier la requete sql faite dans content_taxonomy_autocomplete_load() (ou créer une 2e fonction et modifier le callback pour l’appeler), mais il faut connaître les termes sélectionnés dans les autres champs multiselect.

Quelle est la meilleure manière de procéder ?

J’imagine qu’il vaut mieux envoyer toutes les valeurs de tous les multiselect lors de l’appel autocomplete, mais ça obligerait à un gros hack de autocomplete.js, pas top…

Sinon, appeler une url à chaque modif d’un multiselect en passant les valeurs (pour les mettre en session php), mais je ne vois pas trop comment construire un js supplémentaire qui recenserait les multiselect et ajouterait un onChange ou un onBlur sur chacun.

Toute suggestion sera bienvenue.

#

J’ai été voir http://drupal.org/node/114774#javascript-behaviors mais c’est très succint.

Dans mon hook form_alter, un

foreach ($form['taxonomy'] as $vid => $taxonomy_entry) {
  if ($taxonomy_entry['#type'] == 'select') {
    $form['taxonomy'][$vid]['#ahah'] = array(
      'path' => 'eduforge/taxonomy_change/' .$vid,
      'event' => 'change',
      'wrapper' => 'eduforge_taxonomy_change_output',
      'method' => 'replace', // ou append ou after ou before...
      'effect' => 'fade',
    );
  }
}
marche, mais il envoie la totalité du form à chaque modif ! Y’a un moyen de passer des paramètre supplémentaires pour restreindre à l’élément du form concerné ?

Sinon, il reste l’utilisation d’un js perso avec

Drupal.behaviors.sendNewChoice = function (context) {
  $('.form-select', context).each(function () {
    // un test pour filtrer les select taxonomy
    $(this).change(function(){
      // récupérer le vid et les valeurs,
      // et les envoyer à /eduforge/taxonomy_change/<vid>
    });
  });

Y’a plus qu’à se replonger dans le javascript pour écrire le code qui manque…

#

Je continue à me répondre„ s’il y en a que la solution intéresse…

Dans mon module

// ...
drupal_add_js(drupal_get_path('module', 'eduforge') .'/edulibre.js');
// ...
function eduforge_menu() {
  // ...
  $items['eduforge/taxonomy_change'] = array (
    'page callback' => 'eduforge_taxonomy_change',
    'type' => MENU_CALLBACK,
    // ...
  );
  // ...
  return $items;
}
function eduforge_taxonomy_change() {
  drupal_json($_POST); // just for debugging purpose
  // on récupère bien $_POST['taxonomy'][$vid][$i] = $term_id
}
et dans edulibre.js
Drupal.behaviors.sendNewChoice = function (context) {
  $('.form-select:not(.sendNewChoice-processed)',
      context).addClass('sendNewChoice-processed').each(function () {
    var formSelect = $(this); // car $(this) pas propagé
    var id = $(this).attr("id");
    if (id.substr(0,14) == 'edit-taxonomy-') {
      formSelect.change(function(){
      var optionsSerialized = formSelect.serializeArray();
      $.post("/eduforge/taxonomy_change", optionsSerialized,
        function(data){
          alert("On récupère : " + data); // juste pour debug
        }
      );
    });
  }
});

Syndiquer le contenu