Bonjour à toutes et à tous,
petit besoin de votre aide.

Je code une nouvelle appli sous CI (CodeIgniter), avec une mise à jour de liste déroulante en AJAX.

Mes listes déroulantes appartiennent à un listing qui affiche plusieurs enregistrements.
Ainsi, j'ai des id= de listes déroulantes formulés selon la forme : id="id_course1", id="id_course2", id="id_course3" etc. qui sont les id_course de chaque liste déroulante de chaque enregistrement, le numéro étant l'index d'auto-incrément de l'enregistrement considéré.

J'ai trouvé sur le net un bout d'AJAX (http://blog.alysson.net/lang/en-us/d...axcodeigniter/) qui solutionne mon problème de mise à jour dynamique de mes listes déroulantes.

Le code fourni utilise 2 paramètres, le nom de la liste déroulante à mettre à jour et une variable (de type tableau, je suppose ?) qui contient les valeurs.
Le code appel mon controleur qui exécute une méthode pour récupérer dans ma base de données, via le modèle, les nouvelles données de la liste déroulante à modifier.

Mais pour reconstruire ma liste déroulante avec les nouvelles valeurs, j'ai besoin de l'identifier avec son numéro d'id => id="id_course1", où 1 est la valeur de l'index de l'enregistrement concerné, je n'ai pas une seule liste déroulante, mais plusieurs différenciées avec un numéro.

Et la routine AJAX ne transmet pas la variable qui contient l'id de la liste déroulante.

Comment ajouter la variable nom_LD à 'url' : '<?php echo site_url('ORDRES_TRANSPORTS/ordres_transports_c/recuperer_valeurs_LD'); ?>/' + valeur_selectionnee,

J'ai fais plusieurs tentative sans succès.

Routine AJAX.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function charger_contenu_LD(nom_LD, valeur_selectionnee)
    {
    //alert('AJAX');
    console.log('AJAX');


    console.table('nom_LD' + nom_LD); // Est un objet dans la console JS, pourquoi ?
    console.log('valeur_selectionnee' + valeur_selectionnee); // Affiche le bon contenu.


    // Requête AJAX appelée en jQuery.
    // Dont le résultat va dans la variable contenu.
    var contenu = $.ajax(
        {
        // Exécution de la fonction recuperer_valeurs_LD() du controleur ordres_transports_c.
        // Qui prend en paramètre valeur_selectionnee.
PB ici =>    'url' : '<?php echo site_url('ORDRES_TRANSPORTS/ordres_transports_c/recuperer_valeurs_LD'); ?>/' + valeur_selectionnee,

        // Lors d'un appel http en mode non asynchrone (?, pourquoi pas asynchrone ?).
        'async' : false

        // La méthode responseText est appliquée au contenu récupéré par AJAX.
        }).responseText;

    console.log(contenu);
    console.table(contenu);

    // La liste déroulante concernée, reçoit le nouveau contenu.
    nom_LD.replaceWith(contenu);
    }
Méthode du contrôleur qui récupère les nouvelles valeurs et qui reconstruit la liste déroulante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public    function recuperer_valeurs_LD($id_etablissement_commanditaire)
        {
    echo 'id_etablissement_commanditaire : ';
    echo $id_etablissement_commanditaire; /!\ Nota : cette valeur n'est pas actualisée à la seconde exécution.

        $liste_courses = $this->ordres_transports_m->liste_courses($id_etablissement_commanditaire);

        /*
        echo '<pre>';
        echo '$liste_courses dans fonction recuperer_valeurs_LD';
        print_r($liste_courses);
        echo '</pre>';
        */
        
        //echo form_dropdown('id_course', $liste_courses, NULL, 'id="id_course"');


        $id_course    = array(    'name'    => 'id_course'                , // Il faut ajouter le numéro d'incrément !
                        'options'    => $liste_courses        ,
                        'selected'    => ''                    ,
                        'attributs'    => 'title="- la valeur inconnu ne sert que pour la recherche
(elle est interdite pour l\'ajout)

- Pour l\'ajout, choisissez obligatoirement une courses"
                                                tabindex="6"
                                                id=id_course' ); // Il faut ajouter le numéro d'incrément !

        echo form_dropdown(    $id_course['name']            ,
                        $id_course['options']        ,
                        $id_course['selected']        ,
                        $id_course['attributs']        );
        }
Code du modèle qui lit la base de données pour les nouvelles valeurs de la liste déroulante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
public    function liste_courses($id_etablissement_commanditaire='')
        {
 
        //echo $id_etablissement_commanditaire;
 
        // Sélection des données pour les autres lignes HAUT.
        $this->db->select('id_course, lieu_depart, lieu_arrivee');
 
 
        if ( $id_etablissement_commanditaire != 'inconnu')
        $this->db->where('id_etablissement_commanditaire '    , $id_etablissement_commanditaire    );
 
        // Tri par lieu de départ.
        $this->db->order_by('lieu_depart', 'asc');
 
        $extraction = $this->db->get('courses')->result_array();
 
        /*
        echo '<pre>';
        echo '$extraction';
        print_r($extraction);
        echo '</pre>';
        */
 
        if ( !empty($extraction) ) 
            {
            // Création des lignes de la liste déroulante HAUT.
            foreach    ( $extraction as $courses_valeur)
                {
                $LD_courses[$courses_valeur['id_course']]
                = $courses_valeur['id_course'] . ' : ' . $courses_valeur['lieu_depart'] . ' ' . html_entity_decode('➜') . ' ' . $courses_valeur['lieu_arrivee'];
 
                }
            }
 
        else
            {
            $LD_courses = ['inconnu' => 'inconnu'];
            }
 
 
        /*
        echo '<pre>';
        echo 'valeurs dans le modèle';
        print_r($LD_courses);
        echo '</pre>';
        */
 
        return $LD_courses;
        }
Tous les essais que j'ai pu faire au niveau de la ligne identifiée par PB ici => ont donné des erreurs CodeIgniter "caractère interdit".


Nota :
dans l'initialisation de mes select dans mon contrôleur, le premier, qui met à jour le second, contient :
'onchange="charger_contenu_LD( $(\'#id_course'.$ordres_transports[$i]['id_ordre_transport'] . '\'), this.value )"'

Le premier paramètre en vert, est vu comme un objet dans la console JS, pourquoi ? => Est un objet du DOM ?
Et je ne sais pas afficher son contenu console.object() n'existe pas. Et s'affiche dans la console avec console.dir(nom_LD);
Alors, que le second en orange est bien vu comme une variable standard.

Petite question supplémentaire :
Pourquoi 'async' : false
et pas 'async' : true ?

async pour asynchrone voudrait dire que le travail se fait de façon asynchrone => true, pourtant ça ne fonction qu'avec false.
Qu'est-ce qui est asynchrone ici ?


Merci pour votre aide !
Nils.



Ca y est !!! J'ai trouvé la réponse (si ça peut aider ...).

Tout d'abord, ce que j'ai compris, c'est que la variable nom_LD est un objet.

Et que pour atteindre son contenu il faut écrire nom_LD[0].l'élément souhaité.
Donc ici : nom_LD[0].id

Ensuite, pour passer plusieurs variables dans une URL CI (CodeIgniter) il faut les séparer par des /
Ce qui donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
'url' : '<?php echo site_url('ORDRES_TRANSPORTS/ordres_transports_c/recuperer_valeurs_LD'); ?>/' + valeur_selectionnee + '/' + nom_LD[0].id,
Il faut ensuite modifier la déclaration de la fonction recuperer_valeurs_LD qui va utiliser ce deuxième paramètre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public    function recuperer_valeurs_LD($id_etablissement_commanditaire,$id_course)
        {
    echo 'id_etablissement_commanditaire : ';
    echo $id_etablissement_commanditaire; /!\ Nota : est maintenant actualisé.

    echo 'id_course : ';
    echo $id_course;


        $liste_courses = $this->ordres_transports_m->liste_courses($id_etablissement_commanditaire);

        /*
        echo '<pre>';
        echo '$liste_courses dans fonction recuperer_valeurs_LD';
        print_r($liste_courses);
        echo '</pre>';
        */
        
        //echo form_dropdown('id_course', $liste_courses, NULL, 'id="id_course"');


        $id_course    = array(    'name'    => $id_course                , 
                        'options'    => $liste_courses        ,
                        'selected'    => ''                    ,
                        'attributs'    => 'title="- la valeur inconnu ne sert que pour la recherche
(elle est interdite pour l\'ajout)

- Pour l\'ajout, choisissez obligatoirement une courses"
                                                tabindex="6"
                                                id='.$id_course );

        echo form_dropdown(    $id_course['name']            ,
                        $id_course['options']        ,
                        $id_course['selected']        ,
                        $id_course['attributs']        );
        }
Bonne lecture à ceux qui tomberont ici ...
A la prochaine.
Nils.