Test: AJAX dynamic selects

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Koehoorn

Jan Koehoorn

04/04/2007 11:50:00
Quote Anchor link
PHP vrienden (en vriendinnen),

in het kader van mijn OOP- en AJAX adventures zou ik graag willen dat jullie even kijken naar een testpagina voor dynamische selects. Ik ben benieuwd of het crossbrowser werkt en sta open voor suggesties.

groeten, Jan
 
PHP hulp

PHP hulp

20/11/2024 18:44:08
 
Thijs X

Thijs X

04/04/2007 11:52:00
Quote Anchor link
Werkt perfect in IE 6 hier

Misschien leuk om Code nog te laten weergeven zodat andere mensen er ook wat aan hebben ;)
Gewijzigd op 01/01/1970 01:00:00 door Thijs X
 
GaMer B

GaMer B

04/04/2007 11:53:00
Quote Anchor link
NIiiiiceee. Hij werkt op Firefox, en vlekkeloos. Suggesties? Nee, niet echt, omdat het ook maar een voorbeeld is he :P
 
Jacco Engel

Jacco Engel

04/04/2007 11:56:00
Quote Anchor link
Hier foutloos in Opera en FF2

Ziet er goed uit Jan
1 suggestie :
Ga vooral zo door :P
 
Frank Keulen

Frank Keulen

04/04/2007 12:02:00
Quote Anchor link
Foutloos in IE7 & FF2
 
Jan Koehoorn

Jan Koehoorn

04/04/2007 12:02:00
Quote Anchor link
thijs schreef op 04.04.2007 11:52:
Werkt perfect in IE 6 hier

Misschien leuk om Code nog te laten weergeven zodat andere mensen er ook wat aan hebben ;)


De hoofdpagina:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
    ini_set ('display_errors', 1);
    error_reporting (E_ALL);

    require 'classes/class.basic.php';
    require 'classes/class.database.php';
    $db = new database ();
?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>AJAX Casestudy</title>

    <script type="text/javascript" src="xmlhttp.js"></script>
    <script type="text/javascript">
        var xmlhttp, categorie;

        window.onload = init;

        function init () {
            document.getElementById ('voedsel_categorie').onchange = function () {
                return handle_categorie (this.value);
            }
        }
        
        function handle_categorie (value) {
            if (xmlhttp = get_xmlhttp_object ()) {
                xmlhttp.onreadystatechange = function () {
                    if (xmlhttp.readyState == 4) {
                        // doe iets met xmlhttp.responseText;
                        document.getElementById ('naamdeel').innerHTML = xmlhttp.responseText;
                    }
                }
                xmlhttp.open ("GET", "ajax_casestudy2.php?categorie_id=" + value, true);
                xmlhttp.send (null);
            }
        }
    </script>

    <style type="text/css">
    @import 'oop.css';
    </style>
</head>

<body>
    <div id="container">
    <div class="wrapper">
    <h1>AJAX casestudy</h1>
    <p>Voor dynamische gelinkte selectboxen is meestal veel JS code nodig om ze werkend te krijgen.</p>
    <p>Dit script gebruikt AJAX (inderdaad, da's <strong>ook</strong> JS, maar niet zov&eacute;&eacute;l :P) in combinatie met PHP/MySQL.</p>
    <p>Na een keuze uit de selectbox voor categorie moet er een andere verschijnen met de juiste opties.</p>
    <h1>Kies een voedselcategorie</h1>
    <form method="post" action="#">
    <p>
    <?php
        $sql
= "
            SELECT *
            FROM voedsel_categorie
            ORDER BY naam ASC
            "
;
        if ($db->query ($sql)) {
            echo '<label for="voedsel_categorie">voedselcategorie:</label>';
            echo '<select id="voedsel_categorie" name="voedsel_categorie" class="medium">';
            echo '<option value="0" selected="selected"> - kies een categorie - </option>';
            while ($row = $db->fetch ()) {
                echo PHP_EOL . '<option value="' . $row['id'] . '">' . $row['naam'] . '</option>';
            }

            echo '</select>';
        }

    ?>

    </p>
    <p id="naamdeel"></p>
    <p>
        <input type="submit" value="verzenden">
    </p>
    </form>
    <?php
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            echo '<pre>';
            print_r ($_POST);
            echo '</pre>';
        }

        require 'errs.php';
    ?>

    </div>
    </div>
</body>
</html>


De pagina die door AJAX aangeroepen wordt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    require 'classes/class.basic.php';
    require 'classes/class.database.php';
    $db = new database ();
    
    $categorie_id = (isset ($_GET['categorie_id']))?($_GET['categorie_id']):(0);
    $sql = "
        SELECT id, naam
        FROM voedsel_naam
        WHERE categorie_id = "
. $categorie_id . "
        ORDER BY naam ASC
        "
;
    if ($db->query ($sql)) {
        echo '<label for="voedsel_naam">voedselnaam:</label>';
        echo '<select id="voedsel_naam" name="voedsel_naam" class="medium">';
        echo '<option value="0"> - kies een naam - </option>';
        while ($row = $db->fetch ()) {
            echo PHP_EOL . '<option value="' . $row['id'] . '">' . $row['naam'] . '</option>';
        }

        echo '</select>';
    }

?>


De errorpagina:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
    <?php
        $errs
= $db->get_errs ();
        if (!empty ($errs)) {
            echo '<div class="errs">';
            foreach ($errs as $err) {
                echo $err;
            }

            echo '</div>';
        }

    ?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Robert Deiman

Robert Deiman

04/04/2007 12:02:00
Quote Anchor link
Werkt hier prima in IE5.5, IE6, IE7, FF1.5, FF2 en Opera.

Een suggestie is om nog als je het eerste veld waarin je de soort kiest weer terugzet naar --kies een categorie-- dat je dan het veld weer laat verdwijnen waarin je --kies een naam-- hebt staan.

Wat ook mooi is, vind ik is als je meteen al de 2 selects hebt staan, waarin alle namen in de 2e selectbox alfabetisch staan gesorteerd. Om hierin niet zo lang te hoeven zoeken kan je dan de 1e selectbox gebruiken om het rijtje te verkleinen naar de categorie waaruit je een item wilt vinden. (hopelijk leg ik het duidelijk genoeg uit)
 
Jan Koehoorn

Jan Koehoorn

04/04/2007 12:05:00
Quote Anchor link
@ Robert: goeie tips, tnx! (Duidelijk genoeg :-))
 
Frank -

Frank -

04/04/2007 12:10:00
Quote Anchor link
In Safari werkt het ook prima. Ziet er leuk uit.
 
Robert Deiman

Robert Deiman

04/04/2007 12:15:00
Quote Anchor link
Mijn 2e tip is denk ik ook mooi in combinatie met je suggestion script die we van de week testten. Je hebt nu alleen/ vooral plaatsen uit N-H in je lijst staan, maar als je een array met plaatsen door heel nederland hebt, kan je ze bijvoorbeeld indelen op regio/ provincie.
Kies je eerst een provincie wordt je search beperkt tot plaatsen in die provincie (scheelt een slok op een borrel, voor de lengte van je suggestielijst) Misschien een leuke combinatie voor die 2.

(dit is nu niet echt van belang voor dit topic, dat weet ik ook wel, maar ik vond het wel een leuk idee, en die wou ik je niet onthouden)
 
Jan Koehoorn

Jan Koehoorn

04/04/2007 12:20:00
Quote Anchor link
@ Frank: aha, daar was ik vooral ook benieuwd naar, thanks!
@ Robert: meteen een tweede selectbox met alle mogelijkheden kan zeker, maar: stel dat iemand niets kiest uit box 1 en meteen iets kiest uit box 2. Dan zou in box 1 wel weer automatisch de juiste categorie gekozen moeten worden natuurlijk. Ga ik even over nadenken.
 
Robert Deiman

Robert Deiman

04/04/2007 12:25:00
Quote Anchor link
Jan Koehoorn schreef op 04.04.2007 12:20:
@ Frank: aha, daar was ik vooral ook benieuwd naar, thanks!
@ Robert: meteen een tweede selectbox met alle mogelijkheden kan zeker, maar: stel dat iemand niets kiest uit box 1 en meteen iets kiest uit box 2. Dan zou in box 1 wel weer automatisch de juiste categorie gekozen moeten worden natuurlijk. Ga ik even over nadenken.


-> Is dat zo? Het is wel een mooi extra'tje vind ik, maar het hoeft niet. Stel dat ik appel kies uit box2, en ik wil dan bijvoorbeeld alle items zien die voldoen aan het criterium/ de criteria.

Het maakt dan niet uit of de 1e selectbox leeg is. -> Immers via je database is een appel al gekoppeld aan de categorie "fruit". Klik ik op zoeken bij appel, dan zal die alle appels weergeven.

Kan ik een item niet vinden in de 2e selectbox, dan kies ik fruit in de 1e en kijk opnieuw in de verkorte lijst. Zie ik hem nog niet, maak ik geen keuze in het 2e vak en kies zoeken. Ik krijg dan alles met als categorie "fruit".

Het is ook maar net waar je het voor wilt gebruiken, maar ik vind jou idee voor het bijwerken van selectbox 1 ook wel erg goed bedacht. Een soort van wisselwerking tussen beide selects.
 
Jan Koehoorn

Jan Koehoorn

04/04/2007 12:32:00
Quote Anchor link
Ze zijn inderdaad in mijn DB al gelinkt, dus dat zou het probleem niet zijn. Het gaat er meer om wat het meest gebruiksvriendelijk zou zijn. Als het gaat om grote opdrachten organiseer ik meestal een testsessie met de doelgroep, maar daar is het nu nog een beetje te vroeg voor. Vandaar dat jullie mogen proefkonijnen ;-)
 
Robert Deiman

Robert Deiman

04/04/2007 12:37:00
Quote Anchor link
@jan

Als het je lukt zou dat wel mooi zijn, maar je zit wel met 1 probleem dan. -> ik wil bloemkool kiezen, maar net boven bloemkool staat banaan (dus uit een andere categorie)
Ik klik verkeerd, je bovenste veld verspringt naar fruit, en ik kan bloemkool niet meer kiezen. -> moet eerst "geen" categorie selecteren, of "groente" en dan vervolgens alsnog bloemkool.
Dit is dus niet erg gebruiksvriendelijk.
Wat je evt wel kan doen is controleren of er een categorie is gekozen, zo ja -> niets veranderen als je een naam kiest. Zo nee -> Geef naast je 2e selectbox weer uit welke categorie het item komt. (wel lastig te maken, maar ik denk de meest gebruiksvriendelijke oplossing voor het vraagstuk)
 
M

M

19/04/2007 13:46:00
Quote Anchor link
Hallo,

Heel mooi voorbeeld van dynamische selects met AJAX. Een vraagje echter: is het ook mogelijk om meer dan 2 selects te linken?
 
Robert Deiman

Robert Deiman

19/04/2007 13:57:00
Quote Anchor link
Natuurlijk is dat mogelijk, er komt er dan 1 achter, en je hebt nog een link nodig vanuit de 2e select naar de 3e toe, maar dat gaat op dezelfde manier als in het voorbeeld van Jan.
 
M

M

19/04/2007 14:01:00
Quote Anchor link
Wel, ik ben dit aan het proberen. Ik constateer echter dat mijn 2de onchange niet werkt, waardoor mijn 3de select niet wordt aangemaakt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
function init () {
            document.getElementById ('ctrl_country').onchange = function () {
                return handle_country (this.value);
            }
            document.getElementById('ctrl_region').onchange = function(){
               return handle_region(this.value);
            }
        }
Gewijzigd op 01/01/1970 01:00:00 door M
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.