Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-04-2008 13:05:17

JiBe
Membre
Lieu: Brabant Wallon, Belgique
Date d'inscription: 27-06-2007
Messages: 16

[Résolu]Reconstruction d'un select avec ajax

Bonjour,

Le principe est simple, je souhaiterait construire une liste déroulante suivant le choix d'un paramètre, un peu comme une liste de localité en fonction d'un code postal.



JS avec JQuery (ce code ne fonctionne pas wink )

Code:

$(function() {
    $('#client_id').change(function() {
        $.ajax({
            type:"GET",
            url: "/devispv/findrelevephotovoltaique/client_id/" + this.value,
            dataType: "json",
            success: function(response) {
                var obj = document.getElementById('select_releve_photovoltaique_id');
                var optionData = response;
                alert(response);
                alert(optionData);
                obj.options.length = null;
                
                
                for (key in optionData) {
                    alert('cle:' + key + ' - valeur: ' - optionData[key]);
                    //obj.options = new Option(response[key], key);
                }
            }
        });
    });
});

Controller

Code:

public function findrelevephotovoltaiqueAction() {
    if ($this->_request->isXmlHttpRequest()) {
        require_once 'RelevesPhotovoltaiqueModel.php';
        //$this->_helper->layout->disableLayout();
        //$this->_helper->viewRenderer->setNoRender(true);
        //$this->_helper->viewRenderer->setNeverRender(true);
        $id = $this->_request->getParam('client_id');
        $relevesPhotovoltaique = new RelevesPhotovoltaiqueModel();
        $list = $relevesPhotovoltaique->getMultiOptions('client_id', $id);
        //echo $list;
        $this->_helper->json($list);
        //echo header('content-type: application/json');
        //echo Zend_Json::encode($list);
        
    }
    else {
        $this->_redirect('/');
    }
}

Modèle

Code:

    public function getMultiOptions($filterName = null, $filterValue = null) {
        if ($filterName != null && $filterValue != null) {
            $where = $filterName . "=" . $filterValue;
        }
        else {
            $where = null;
        }
        
        $rows = $this->fetchAll($where);
        $options = array();
        foreach ($rows as $row) {
            $options[$row->id] = $row->id;
        }
        return $options;
    }

le retour de la requête est un objet, si j'enlève le dataType: "json" j'ai un truc du style {"1":"1"}

Merci d'avance pour vos lumières,

A+ JiBe

Dernière modification par JiBe (24-04-2008 18:51:54)

Hors ligne

 

#2 24-04-2008 13:51:06

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Résolu]Reconstruction d'un select avec ajax

Tu as vu donc code ??

Tu mets

$options[$row->id] = $row->id; 

Ce qui correspond bien à la phrase JSON {"1":"1"}

quel est ton problème ?
Tu n'as pas qqchose comme ca à faire :
$options[$row->id] = $row->valeur; 

Voici un code javascript qui remplit un select (attention, il n'utilise pas JQUERY mais Prototype.js !!)
Le retour JSON est contenu dans t.responseText, tableau associatif de nom de personne et d'identifiant

Code:

function firstUpdateNomsEntite(t)
{
    var names = eval("(" + t.responseText + ")");
    while (selectn.hasChildNodes()) {
        selectn.removeChild(selectn.firstChild);
    }
    names.each(function (nom) {
        element = document.createElement("option");
        element.appendChild(document.createTextNode(nom.Contact));
        element.value = nom.CTT_ID;
        selectn.appendChild(element);
        if (nom.CTT_ID == ctt_id) {
            selectn.selectedIndex = element.index;
        }
    });
}

----
Gruiiik !

Hors ligne

 

#3 24-04-2008 13:53:59

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Résolu]Reconstruction d'un select avec ajax

Perso je n'utiliserais pas ajax, pour ne pas rendre le formulaire inaccessible.
Je traiterais le tout en mettant toutes les valeurs et en les traitant uniquement côté client (sauf si j'en avais + de 500 peut être.
Dans ce cas, ton problème disparaitrait.

Hors ligne

 

#4 24-04-2008 18:50:45

JiBe
Membre
Lieu: Brabant Wallon, Belgique
Date d'inscription: 27-06-2007
Messages: 16

Re: [Résolu]Reconstruction d'un select avec ajax

Mr.MoOx a écrit:

Perso je n'utiliserais pas ajax, pour ne pas rendre le formulaire inaccessible.
Je traiterais le tout en mettant toutes les valeurs et en les traitant uniquement côté client (sauf si j'en avais + de 500 peut être.
Dans ce cas, ton problème disparaitrait.

Traiter côté client ?
Une fonction javascript sur $(document).ready qui filtre les 2 listes alors ?

En fait mon intention était plus grande que cela.
On a souvent besoin de listes liées et dans ce cas je désirais faire quelques fonctions génériques.

Javascript

Code:

var htmlElement;
function fetchOptionsData(url, value, element) {
    htmlElement = element;

    var urlAction = null;
    if (url) {
        urlAction = url;
    }
    if (value) {
        urlAction = urlAction + value;
    }
    
    if (urlAction != null) {
        $.ajax({
            type:"GET",
            url: urlAction,
            dataType: "json",
            success: rebuildOptions
        });
    }
}

function rebuildOptions(response) {
    var obj = document.getElementById(htmlElement);
    var optionData = response;
    obj.options.length = null;
    
    for (key in optionData) {
        obj.options[obj.options.length] = new Option(response[key], key);
    }
}

Zend_Form

Code:

$client->setAttrib('onchange', 'javascript:fetchOptionsData(\'/devispv/findrelevephotovoltaique/client_id/\', this.value, \'select_releve_photovoltaique_id\')');

Code qui pour le moment fonctionne bien, il existe sûrement un moyen plus élégant... en cours de recherche

A+

JiBe

Hors ligne

 

#5 25-04-2008 15:56:05

apsy
Membre
Date d'inscription: 25-06-2007
Messages: 50

Re: [Résolu]Reconstruction d'un select avec ajax

Je vois pas comment tu peux faire plus élégant ? Je trouve ça très bien moi :p

Hors ligne

 

#6 25-04-2008 16:01:39

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Résolu]Reconstruction d'un select avec ajax

C'est pourtant pas du tou accessible car dépendant du javascript.
Moi j'aurais fais ainsi:

Choississez en fonction de votre liste
- Liste  1
---select---a
- Liste  2
---select---b
- Liste  3
---select---c

Puis si javascript, transformation via DOM en :
--select Liste x---   -select(a||b||c) selon Liste---

Après ca depend les contraintes (site privée? public?...)
A toi de voir je ne fais que des suggestions! wink

Hors ligne

 

#7 25-04-2008 16:23:12

JiBe
Membre
Lieu: Brabant Wallon, Belgique
Date d'inscription: 27-06-2007
Messages: 16

Re: [Résolu]Reconstruction d'un select avec ajax

C'est actuellement un intranet, une partie deviendra publique.

C'est une application interne pour la gestion des clients, projet, devis, factures, ...

la partie publique sera en accès limité, les associés de la boîte donc trafic très limité.

Dans mon cas, lorsque je crée un nouveau devis je sélectionne le client, liste1, ensuite je dois créer la liste des différent relevé pris chez lui, liste2.

Je pourrais aussi avoir une autre approche c'est que depuis une fiche client je choisisse 'nouveau devis' ce qui me permettrait de créer tout de suite la liste2.

Mais comme je suis à 90% sur chantier, le développement prend bcp de temps et je ne choisi pas toujours le chemin le plus simple tongue

Ceci dit, ça m'a permit de découvrir JQuery -> route vers une facilité par exemple avec le tablesorter.

Merci pour toutes vos idées.

A+

JiBe

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages