Chained select (dynamische check / selectboxen)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco V

Marco V

23/11/2010 11:35:39
Quote Anchor link
Ik zit met een vraagstuk waar ik niet uitkom, hoewel ik meerdere onderwerpen heb gevonden, kan ik het antwoord op mijn vraag nog niet vinden. Ik hoop dat iemand mij kan helpen!?

Ik wil met een radiobutton seleceteren welke bedrijven in een selectbox moeten verschijnen; klanten of leveranciers of bedrijven (meerdere bv's zeg maar)

Dit lukt me met een functie die ik hier heb gevonden.

Vervolgens wil ik, zodra een bedrijf wordt geselecteerd in de selectbox, de bijbehorende contactpersonen laden in een tweede selectbox. Dit laatste wil me niet lukken!

Wat ik heb geprobeerd is om een zelfde functie (met een andere naam en query) voor de contactpersonen aan de - dynamisch gegenereerde - selectbox met bedrijven toe te kennen, maar deze functie lijkt niet te worden aangeroepen!? Kan dit uberhaubt?

Ik ben ook al aan het experimenteren geweest met Jquery, maar daar kan ik geen chocola van maken (ben daarmee niet bekend) en bovendien lijkt het dat dan de spry-tabs niet meer werken.

Tot dusver werkt dus alleen de bedrijven selectie, daar stop ik de resultaten van de query in een array;

$geadresseerde[]['ID'] // de referentie naar contactpersoon ID
$geadresseerde[]['REFTABLE'] // de referentie naar contactpersonen tabel
$geadresseerde[]['BEDRIJF'] // de bedrijfsnaam (komt dus in de selectie)
$geadresseerde[]['RELID'] // de referentie naar bedrijf ID (komt als value in de selectie)

Vervolgens wil ik nu in een tweede selectbox, nadat een bedrijf is geselecteerd, de contactpersonen bij het bedrijf weergeven. Aangezien de gegevens in een array zitten lijkt me dat niet zo moeiliijk, als ik de functie maar kan aanroepen?
Gewijzigd op 23/11/2010 11:37:04 door Marco V
 
PHP hulp

PHP hulp

21/11/2024 23:12:48
 
John Cena

John Cena

23/11/2010 11:44:28
Quote Anchor link
Iets meer code?
 
Marco V

Marco V

23/11/2010 12:45:12
Quote Anchor link
Owkee, hier de code... (inmiddels succesvol, maar lees mijn laatste opmerking!)

Om het e.e.a. wat overzichtelijker te maken heb ik zowel HTML als PHP binnen de PHP tags gezet, maar dat snap je wel lijkt me!?

*** Vertrekpunt is een pagina waarin drie radiobuttons staan ***

De radiobuttons triggeren de eerste functie met een "onclick" event
(NB: de volgende code is dus eigenlijk HTML!)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
<input name="TABELBEDRIJF" type="radio" id="DBKLT" value="DBKLT" onclick="showCompany(this.value)" />
      <
label for="DBKLT">Klant</label></td>
// een div waarin de selectbox met bedrijven komt
<div id="txtBedrijf">Selecteer eerst klant,  leverancier of medewerker</div>

<
input name="TABELBEDRIJF" type="radio" id="DBLEV" value="DBLEV" onclick="showCompany(this.value)"/>
// een div waarin de selectbox met contactpersonen komt
<div id="txtContactpersoon"></div></td>

<
input name="TABELBEDRIJF" type="radio" id="BEDRIJFSGEGEVENS" value="BEDRIJFSGEGEVENS" onclick="showCompany(this.value)"/>
?>



*** DE EERSTE FUNCTIE, EEN KLANT, LEVERANCIER of BEDRIJF ***

De eerste functie in de <head> van de pagina
De eerste functie reset het resultaat van de tweede functie zodat de resultaten (contactpersonen) verdwijnen als er iets wordt veranderd.
(NB: de volgende code is dus eigenlijk HTML!)

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
<?php
<script type="text/javascript">
function
showCompany(str)
{

if (str=="")
  {

  document.getElementById("txtBedrijf").innerHTML="";
  document.getElementById("txtContactpersoon").innerHTML="";
  return;
  }

if (window.XMLHttpRequest)
  {
// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }

else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

xmlhttp.onreadystatechange=function()
  {

  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {

    document.getElementById("txtBedrijf").innerHTML=xmlhttp.responseText;
    document.getElementById("txtContactpersoon").innerHTML="";
    }
  }

xmlhttp.open("GET","bedrijf.php?bedrijf="+str,true);
xmlhttp.send();
}

</script>

?>


*** HET PHP SCRIPT VAN DE EERSTE FUNCTIE ***

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
<?php
// eerst maken we een array met alle resultaten van klanten, leveranciers of bedrijven

$bedrijf=$_GET["bedrijf"];

$TABEL = $bedrijf;

// zet een hidden field met de tabelnaam voor de contactpersonen
if ($TABEL == "BEDRIJFSGEGEVENS") {
    $hiddenfield = "MEDEWERKERS";
}

if ($TABEL == "DBKLT") {
    $hiddenfield = "DBKCP";
}

if ($TABEL == "DBLEV") {
    $hiddenfield = "DBLCP";
}

echo '<input name="TABEL" type="hidden" id="'.$hiddenfield.'" value="'.$hiddenfield.'" />';

// de query voor het vullen van de array
if ($TABEL == "BEDRIJFSGEGEVENS") {
    $sql="SELECT WEBUSER.RELID, WEBUSER.REFTABLE, WEBUSER.REFID as ID, ".$TABEL.".NAAM, ".$TABEL.".NAAM1 FROM WEBUSER INNER JOIN ".$TABEL." ON WEBUSER.RELID=".$TABEL.".BVCODE WHERE WEBUSER.BLOCK = 'N' AND WEBUSER.RELTABLE = '".$TABEL."'";
}
else {
    $sql="SELECT WEBUSER.RELID, WEBUSER.REFTABLE, WEBUSER.REFID as ID, ".$TABEL.".NAAM, ".$TABEL.".NAAM1 FROM WEBUSER INNER JOIN ".$TABEL." ON WEBUSER.RELID=".$TABEL.".ID WHERE WEBUSER.BLOCK = 'N' AND WEBUSER.RELTABLE = '".$TABEL."'";
}


$result = mysql_query($sql);
$r=0;
while($row = mysql_fetch_array($result)) {
    $r++;
    $geadresseerde[$r]['ID'] = $row['ID'];
    $geadresseerde[$r]['REFTABLE'] = $row['REFTABLE'];
    $geadresseerde[$r]['RELID'] = $row['RELID'];

    if ($row['NAAM1']) {
        $bedrijf = $row['NAAM'].', '.$row['NAAM1'];
    }
else {
        $bedrijf = $row['NAAM'];
    }


    $geadresseerde[$r]['BEDRIJF'] = $bedrijf;
}


// zet de array in SESSIE zodat deze later beschikbaar is voor contactpersonen
$_SESSION['TMP']['berichten'] = $geadresseerde;

// de query voor de selectbox
if ($TABEL == "BEDRIJFSGEGEVENS") {
    $sql="SELECT DISTINCT WEBUSER.RELID, ".$TABEL.".NAAM, ".$TABEL.".NAAM1 FROM WEBUSER INNER JOIN ".$TABEL." ON WEBUSER.RELID=".$TABEL.".BVCODE WHERE WEBUSER.BLOCK = 'N' AND WEBUSER.RELTABLE = '".$TABEL."'";
}
else {
    $sql="SELECT DISTINCT WEBUSER.RELID, ".$TABEL.".NAAM, ".$TABEL.".NAAM1 FROM WEBUSER INNER JOIN ".$TABEL." ON WEBUSER.RELID=".$TABEL.".ID WHERE WEBUSER.BLOCK = 'N' AND WEBUSER.RELTABLE = '".$TABEL."'";
}


$result = mysql_query($sql);

echo '<select name="BEDRIJF" id="BEDRIJF" onclick="showUser(this.value)">';
echo '<option value="" disabled="disabled" selected="selected" >selecteer een bedrijf</option>';

while($row = mysql_fetch_array($result)) {

    if ($row['NAAM1']) {
        $bedrijf = $row['NAAM'].', '.$row['NAAM1'];
    }
else {
        $bedrijf = $row['NAAM'];
    }

    
    echo '<option value="';
    echo $row['RELID'];
    echo '" '.$select.' >';
    echo $bedrijf;
    echo '</option>';
}

    
echo '</select>';
?>


*** DE TWEEDE FUNCTIE, EEN CONTACTPERSOON BIJ GESELECTEERD BEDRIJF ***

De tweede functie in de <head> van de pagina
(NB: de volgende code is dus eigenlijk HTML!)

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
<?php
<script type="text/javascript">
function
showUser(str)
{

if (str=="")
  {

  document.getElementById("txtContactpersoon").innerHTML="";
  return;
  }

if (window.XMLHttpRequest)
  {
// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }

else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

xmlhttp.onreadystatechange=function()
  {

  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {

    document.getElementById("txtContactpersoon").innerHTML=xmlhttp.responseText;
    }
  }

xmlhttp.open("GET","contactpersoon.php?q="+str,true);
xmlhttp.send();
}

</script>

?>


*** HET PHP SCRIPT VAN DE TWEEDE FUNCTIE ***

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
<?php
// haal $geadresseerde op uit de SESSIE
$geadresseerde = $_SESSION['TMP']['berichten'];

// $q is RELID (het geselecteerde ID van het bedrijf)
// $geadresseerde is een array met de gegevens

    
    echo '<select name="GEADRESSEERDE" id="GEADRESSEERDE">';
    echo '<option value="" disabled="disabled" >selecteer een contactpersoon</option>';

    // Contactpersonen ophalen bij het geselecteerde bedrijf
    $r=0;
    $totaal=count($geadresseerde);
    while ($r<$totaal) {
        $r++;
        $ID = $geadresseerde[$r]['ID'];
        $TABEL = $geadresseerde[$r]['REFTABLE'];
        $RELID = $geadresseerde[$r]['RELID'];
        
        // alleen als RELID overeenkomt met het geselecteerde bedrijf
        if ($RELID == $q) {
            $sql="SELECT VOORNAAM, TUSSEN, ACHTERNAAM FROM ".$TABEL." WHERE ID = '".$ID."'";
            $result = mysql_query($sql);
            while($row = mysql_fetch_array($result)) {
            
                // De naam van de contactpersoon samenvoegen    
                if ($row['TUSSEN']) {
                    $naam = $row['VOORNAAM'].' '.$row['TUSSEN'].' '.$row['ACHTERNAAM'];
                }
else {
                    $naam = $row['VOORNAAM'].' '.$row['ACHTERNAAM'];
                }    
            }

            
            $geadresseerde[$r]['NAAM'] = $naam;
            
            if ($ID == $zoekwaarde) {
                $select = 'selected="selected"';
            }
else {
                $select = NULL;
            }

            
            echo '<option value="';
            echo $ID;
            echo '" '.$select.'>';
            echo $naam;
            echo '</option>';
        }    
    }

    echo '</select>';
?>


De functies geven het resultaat in een div zoals hier beschreven.

Toevoeging op 23/11/2010 14:28:22:

Goed het voorgaande werkt dus!
Ik ben er echter nog niet helemaal gelukkig mee...

aanpassingen (e.e.a. heb ik aangepast in het voorgaande script):
1) er zat een foutje in de tweede query, er ontbrak een ' quote.
2) de array $geadresseerde blijkt niet meer beschikbaar in de tweede functie/query, dus om dit op te lossen zet ik deze naar $_SESSION en haal ik m weer op uit $_SESSION in de tweede query.
3) de DISCTINCT query was niet juist waardoor dubbele resultaten in de selectbox kwamen (meerdere keren hetzelfde bedrijf)

Een probleem resteert:
Jullie begrijpen dat ik deze info eigenlijk niet in de $_SESSION wil hebben. Is hier een andere oplossing voor?
Gewijzigd op 23/11/2010 16:18:21 door Marco V
 



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.