Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 )
$(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
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
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
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
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; } }); }
Hors ligne
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
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
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
$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
Je vois pas comment tu peux faire plus élégant ? Je trouve ça très bien moi :p
Hors ligne
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!
Hors ligne
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
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