Situatieschets: Ik heb een dropdown list met daarin een aantal productgroepen en een dropdown list voor producten. De dropdown voor producten wordt gevuld, doormiddel van een AJAX request, op het moment dat iemand een keuze maakt voor een productgroep.
Dit werkte in mijn vorige opzet prima, nu ben ik echter vorige week gebruik gaan maken van het Zend Framework. De implementatie van AJAX vraagt hier om een iets andere aanpak, maar ik heb inmiddels al de nodige tijd besteed om erachter te komen hoe dit werkt, dat is dus ook geen probleem.
Waar ik nu echter niet uit kom is het volgende. In de controller worden met een query de producten opgehaald die behoren bij de gekozen productgroep. Vervolgens worden deze verbouwd naar een array, dat op zijn beurt wordt encoded naar JSON m.b.v. Zend_JSON en tenslotte wordt ge-echo-ed. In JS wordt dit dan weer opgevangen en moet het omgezet worden naar de dropdown.
Bij dat laatste gaat het mis.
Omdat code meer zegt dan een verhaal:
De functie die aangeroepen wordt door de AJAX request:
De JSON encode string ziet er volgens zo uit:
Het stukje JS dat de JSON string moet uitlezen en omzetten naar de elementen in de dropdown list:
En bij het stukje "for( ???? )" en op de plekken van <<data[i].waarde>> loop ik dus vast.
Bij de voorbeelden (o.a. deze) die ik gevonden en gebruikt heb is de opbouw van de JSON-string iets anders dan bij die van mij. Daar zitten nog telkens dezelfde identifier voor elke groep van gegevens en nog een algehele identifier. Zie het voorbeeld onder het kopje JSON.
Voor mij zijn er eigenlijk een aantal opties nu:
- Ik codeer in de controller het database resultaat zelf alvast naar het juiste format voor JSON
- Ik maak in de controller van het database resultaat een algemeen object (het resultaat), met daarbinnen allemaal objecten (elke rij uit het resultaat) met hun eigen properties (elke gewenste kolom uit het resultaat). Vervolgens encode ik deze met JSON, in de hoop dat ik nu wel een JSON-string krijg die lijkt op die uit het voorbeeld.
- Er is een mogelijkheid om in JavaScript toch door die JSON-string te wandelen en hem uit te lezen zoals bedoeld. Alleen deze lijk ik maar niet te kunnen achterhalen.
Mijn voorkeur gaat uit naar de laatste optie, bij de 1ste is het gebruik van Zend_JSON overbodig en voor de 2de weet ik niet of Zend_JSON een object wel goed kan omzetten.
Ik hoop dat iemand van jullie mij hieruit kan helpen.
Dit werkte in mijn vorige opzet prima, nu ben ik echter vorige week gebruik gaan maken van het Zend Framework. De implementatie van AJAX vraagt hier om een iets andere aanpak, maar ik heb inmiddels al de nodige tijd besteed om erachter te komen hoe dit werkt, dat is dus ook geen probleem.
Waar ik nu echter niet uit kom is het volgende. In de controller worden met een query de producten opgehaald die behoren bij de gekozen productgroep. Vervolgens worden deze verbouwd naar een array, dat op zijn beurt wordt encoded naar JSON m.b.v. Zend_JSON en tenslotte wordt ge-echo-ed. In JS wordt dit dan weer opgevangen en moet het omgezet worden naar de dropdown.
Bij dat laatste gaat het mis.
Omdat code meer zegt dan een verhaal:
De functie die aangeroepen wordt door de AJAX request:
PHP:
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
| function getProductenAction() { // Model voor producten Zend_Loader::loadClass('Products'); $producten = new Products(); // Het is niet nodig om de view opnieuw te laden $this->_helper->viewRenderer->setNoRender(); // ID van de productgroep opvragen en gegevens ophalen $id = $this->_request->getParam('groep_id'); $result = $producten->fetchAll('groep_id = '.$i); // Resultaat ombouwen zodat we alleen de juiste gegevens hebben $tmp = ''; $i = 0; foreach($result as $product) { $tmp[$i]['product_id'] = $product->product_id; $tmp[$i]['omschrijving'] = $product->product_omschrijving; $tmp[$i]['artikelnummer'] = $product->artikelnummer; $i++; } // Zend_JSON class laden, $tmp encoden naar JSON en terug sturen naar de view Zend_Loader::loadClass('Zend_JSON'); $json = Zend_JSON::encode($tmp); echo $json; } |
De JSON encode string ziet er volgens zo uit:
JSON:
1
2
3
4
5
6
7
8
9
| [{"product_id":"229","omschrijving":"deksel jumbo laag","artikelnummer":"090070000"}, {"product_id":"230","omschrijving":"deksel jumbo hoog","artikelnummer":"090070600"}, {"product_id":"279","omschrijving":"deksel B35 compleet","artikelnummer":"090071600"}, {"product_id":"290","omschrijving":"deksel H-200-I compleet","artikelnummer":"090071800"}, {"product_id":"291","omschrijving":"deksel H-200-II compleet","artikelnummer":"090071900"}, {"product_id":"298","omschrijving":"deksel H-200XL-I compleet","artikelnummer":"090072200"}, {"product_id":"299","omschrijving":"deksel H-200XL-II compleet","artikelnummer":"090072400"}, {"product_id":"304","omschrijving":"deksel H200-XL BA","artikelnummer":"062011000"}, {"product_id":"308","omschrijving":"deksel Boxer vertikaal","artikelnummer":"062001300"}] |
Het stukje JS dat de JSON string moet uitlezen en omzetten naar de elementen in de dropdown list:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function handleResponse(transport) { // PHP response opslaan in data var data = transport.responseText.evalJSON(); // Element dat aangepast moet worden opslaan in dropdownBox // en gelijk leeg maken. var dropdownBox = document.getElementById('product_id'); dropdownBox.options.length = 0; // Een loop om alle gegevens uit data toe te voegen aan de selectbox for( ???? ) { var option = document.createElement('option'); option.value = <<data[i].product_id>>; option.appendChild(document.createTextNode(<<data[i].artikelnummer>> + ' - ' + <<data[i].omschrijving>>); dropdownBox.appendChild(option); } } |
En bij het stukje "for( ???? )" en op de plekken van <<data[i].waarde>> loop ik dus vast.
Bij de voorbeelden (o.a. deze) die ik gevonden en gebruikt heb is de opbouw van de JSON-string iets anders dan bij die van mij. Daar zitten nog telkens dezelfde identifier voor elke groep van gegevens en nog een algehele identifier. Zie het voorbeeld onder het kopje JSON.
Voor mij zijn er eigenlijk een aantal opties nu:
- Ik codeer in de controller het database resultaat zelf alvast naar het juiste format voor JSON
- Ik maak in de controller van het database resultaat een algemeen object (het resultaat), met daarbinnen allemaal objecten (elke rij uit het resultaat) met hun eigen properties (elke gewenste kolom uit het resultaat). Vervolgens encode ik deze met JSON, in de hoop dat ik nu wel een JSON-string krijg die lijkt op die uit het voorbeeld.
- Er is een mogelijkheid om in JavaScript toch door die JSON-string te wandelen en hem uit te lezen zoals bedoeld. Alleen deze lijk ik maar niet te kunnen achterhalen.
Mijn voorkeur gaat uit naar de laatste optie, bij de 1ste is het gebruik van Zend_JSON overbodig en voor de 2de weet ik niet of Zend_JSON een object wel goed kan omzetten.
Ik hoop dat iemand van jullie mij hieruit kan helpen.