Selectief Geheugen

Door Jan Koehoorn, 16 jaar geleden, 4.314x bekeken

Hou onthoud je de waarde van selectboxen?

Gesponsorde koppelingen

Inhoudsopgave

  1. Selectief Geheugen
  2. Waarde opvragen en de juiste optie selecteren
  3. Een kortere manier zonder notices
  4. Een mooiere manier met associatieve arrays
  5. Meer dan 1 selectbox: automatisch genereren
  6. Eureka: multidimensionale array!

 

Er zijn 26 reacties op 'Selectief geheugen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Eric Cartman
Eric Cartman
16 jaar geleden
 
0 +1 -0 -1
Slimme oplossing. Ikzelf had denk ik -(waar zit dat "em-streepje" ?) zonder het lezen van deze tutorial- de eerste oplossing gekozen :c)

Bedankt :cp
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
Fraaie oplossing, alleen vind ik het persoonlijk niet handig om met maandnamen te werken. Dan ben je gebonden aan een bepaalde taal en je moet de maandnaam eerst weer omzetten naar een nummer voordat je er controles op los kunt laten, mee kunt rekenen of de boel in een database kunt opslaan.

Ik heb er het volgende van gemaakt:
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
<?php
ini_set('display_errors', 1);
error_reporting (E_ALL);

    function
t($n_tabs, $newline = false) {
        if ($newline) echo "\n";
        for ($i = 0; $i < $n_tabs; $i++) {
            echo "\t";
        }
    }
    
    function
make_select ($name, $options, $selected) {
        t (3, true);
        echo '<select name="' . $name . '">';
            foreach ($options as $key => $value) {
                t (4, true);
                
                if (isset($selected) && $selected == $key) {
                    $select =  ' selected="selected"';
                }

                else {
                    $select = '';
                }

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

        t (3, true);
        echo '</select>';
    }

    
$maanden = array (
        1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
        'juli', 'augustus', 'september', 'oktober', 'november', 'december');


    $jaren = array (
        '2006' => '2006', '2007' => '2007', '2008' => '2008', '2009' => '2009', '2010' => '2010', '2011' => '2011',
        '2012' => '2012', '2013' => '2013', '2014' => '2014', '2015' => '2015', '2016' => '2016', '2017' => '2017');

    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset ($_POST['maand']) && isset ($_POST['jaar'])) {
        $maand = $_POST['maand'];
        $jaar = $_POST['jaar'];
    }

    else {
         $maand = '';
        $jaar = '';
    }

?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Selective Memory</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
    <form action="index.php" method="post">
        <p>

            <?php
                make_select('maand', $maanden, $maand);
                make_select('jaar', $jaren, $jaar);
            ?>


            <input type="submit" value="verzenden">
        </p>
    </form>
</body>
</html>

Hierin is de array met maanden aangepast, de key is nu het maandnummer. Verder is de selectie iets aangepast en is er een extra parameter in de functie make_select bijgekomen. Tevens staat er nog een if-else in deze functie.

Graag hoor ik jullie commentaar voor verbetering.

Edit: Naar aanleiding van het commentaar van Jan aangepast.
Edit: Nog een paar bugjes verholpen... (blijf bezig!)
 
0 +1 -0 -1
Mooie tutorial!
@Jip: ~ ?
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@ Frank: dat van die maanden had ik me inderdaad ook al bedacht. Jouw oplossing is een nuttige uitbreiding. Zoals je code nu is, krijg je echter een notice dat $selected nog niet bestaat, de eerste keer dat de pagina laadt. Bij de if in regel 39 zal nog een else moeten komen.
Ik krijg ook een melding dat make_select de ene keer met 2 en de andere keer met 3 argumenten wordt aangeroepen.
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
@Jan: Het zou nu goed moeten werken. Kun je er nog eens naar kijken? 2 zien meer dan 1...
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
Hier nog een functie om de jaartallen beter onderhoudbaar te maken. Geef simpel een begin en eind op, en klaar ben je:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
function jaar($start, $end){
    $jaren = array();
    for ($i=$start; $i<$end+1; $i++){
       $jaren[$i]=$i;
    }

    return $jaren;
}

?>
Eric Cartman
Eric Cartman
16 jaar geleden
 
0 +1 -0 -1
Dat kan korter :cp

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

function jaar($start, $end) {
  
  return range($start, $end);
}


?>


@Andries Louw W.
Het em-streepje is hetzelfde als een gedachtestreepje (- maar dan langer :cD) Of bedoelde je dat niet?
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@Frank: hij werkt perfect zo. De initialisatie van de twee arrays kan nu zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $maanden
= array (
    1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
    'juli', 'augustus', 'september', 'oktober', 'november', 'december');

    $jaren = jaar (2006, 2050);
?>
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@ Jip: range werkt anders. Voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    $array
= range (2000, 2010);
    // geeft: $array[0] = 2000
    // geeft: $array[1] = 2001
    // geeft: $array[2] = 2002

?>

De functie van Frank doet dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
    $array
= jaren (2000, 2010);
    // geeft: $array[2000] = 2000
    // geeft: $array[2001] = 2001
    // geeft: $array[2002] = 2002

?>

En voor mijn voorbeeld is het nodig dat de array-key dezelfde waarde heeft als de array-value.
Lissy Pixel
Lissy Pixel
16 jaar geleden
 
0 +1 -0 -1
Wederom een leuke en vooral heldere en leerzame tutorial Jan !!
Ook jij Frank hebt een leuke en vooral praktische toevoeging erbij gedaan !!
Ik weet zeker dat veel mensen hier wat aan hebben.

Dank je wel voor het delen hiervan.
Martijn B
Martijn B
16 jaar geleden
 
0 +1 -0 -1
Voor een webwinkel heb ik een aantal procedures waar het registreren en het plaatsen van een order uit meerdere stappen bestaat. Je kunt dan met de knoppen vorige en volgende naar de volgende of vorige stap. Uiteraard word dan het formulier van de stap keurig gevuld.

Ik heb dit opgelost door een array met serialize in de database te zetten. Uiteraard moet je er op letten dat deze gegevens na een tijdje weer worden verwijderd. Dit omdat mensen een procedure niet hoeven af te maken. Waardoor dus de data nog gewoon in de database blijft zitten.

Dit is wel een iets moeilijkere oplossing, maar als het eenmaal werkt dan kun zou je grote formulieren kunnen vervangen door een x aantal stappen.
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
@Martijn: Waar heb je het over? Wat heeft dit te maken met de keuzemenu's van Jan?
Martijn B
Martijn B
16 jaar geleden
 
0 +1 -0 -1
Het gaat toch over het opslaan van formulier gegevens. Of heb ik de tutorial nu verkeerd gelezen...
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
@Martijn: Geen idee wat je hebt gelezen, maar volgens mij sla je de plank aardig mis. Het begrip 'opslaan' ben ik niet tegengekomen. Het draait om select-menu's en het gebruik van 'selected' bij de options.
Martijn B
Martijn B
16 jaar geleden
 
0 +1 -0 -1
Quote:
Het probleem is vaak: hoe onthoud je de waarde van een selectbox als het formulier verzonden is?


Opslaan niet maar onthouden wel ;D

Ik vertel mijn oplossing om formulier gegevens te onthouden.
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@ Martijn: het ging me niet om het onthouden van de formuliergegevens in het algemeen, maar om het onthouden van de waarde van een <select> in het bijzonder.
Roland van Wanrooy
Roland van Wanrooy
16 jaar geleden
 
0 +1 -0 -1
Eigenlijk is dit nou net wat ik zocht :) Vooral de functies zijn erg praktisch. Bij mij gaat het (nog) om relatief simpele forms, maar dat met deze manier gaat het wel meteen goed.
Jan, bedankt voor de heldere uitleg. En Frank, dank je voor de aanvullingen.
Harmen
Harmen
16 jaar geleden
 
0 +1 -0 -1
Ziet er weer heel goed uit, deze ga ik nog even gebruiken voor mijn website omdat ik een langere versie van dit script had :)
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@ Harmen & Roland: bedankt!

@ Allemaal: ik heb een nog mooiere manier gevonden!
Zie de laatste pagina van de tut :-))
Eric Cartman
Eric Cartman
16 jaar geleden
 
0 +1 -0 -1
Wel valt me op dat de oplossing steeds langer wordt :cp Maar wederom, weer een mooie oplossing. . . (Al lijken me de andere oplossingen sneller door PHP te interpreteren?)
Lissy Pixel
Lissy Pixel
16 jaar geleden
 
0 +1 -0 -1
Gaaf Jan je nieuwe oplossing en wederom zo helder uitgelegd met de voorbeelden die je hebt genomen.
Voor ook niet wiskundig aangelegde PHP'ers mijnsinziens heel goed te volgen :-)
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
@ Jip: deze oplossingen is iets langer, maar dat komt ook omdat er meer selectboxen in de code verwerkt worden. Verschillen in snelheid zijn er volgens mij nauwelijks.
@ Lissy: thanks ;-)
Rens nvt
Rens nvt
16 jaar geleden
 
0 +1 -0 -1
Jan,

Allereerst, fantastiche uitleg!

Wel denk ik dat je misschien een wat algemenere functie zou kunnen schrijven.

Bijvoorbeeld (kunnen misschien parse foutjes inzitten omdat ik op mijn werk zit):

In onderstaande scriptje kun je de options array opbouwen als:
options[1]["januari"];
options[2]["februari"];
enz.

Door de functie aan te roepen als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  echo createSelect ("maand", $options, 4);
?>

Heb je dus een selectbox die de waarde $_POST["maand"] gebruikt als geselecteerde waarde, als deze niet is ingesteld pakt hij $_GET["maand"], en anders neemt hij april.

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
<?php
  createSelect ($name, $options = Array(), $selected, $onchange=false) {
    // De waarde ophalen vanuit $_POST of $_GET, anders $selected gebruiken
    if (isset($_POST[$name])) {
      $selected = $_POST[$name];
    }
elseif (isset($_GET[$name])) {
      $selected = $_POST[$name];
    }


    $select = "<select name='{$name}' ";
    // Mogelijkheid om een onchange aktie op te geven
    $onchange !== false) ? $select .= "onchange='{$onchange}'> " : $select .= ">";

    // Opties toevoegen
    foreach ($options as $value => $name) {
      $select .= "<option value='{$value}' ";
      if ($value == $selected) {
        $select .= "selected";
      }

      $select .= ">{$name}</option>";
    }


    $select .= "</select>";

    return $select;
  }

?>
Jan Koehoorn
Jan Koehoorn
16 jaar geleden
 
0 +1 -0 -1
Hoi Rens,

Leuk om te lezen dat mijn uitleg goed is, dankjewel!

ik heb je voorbeeld niet heel uitgebreid bestudeerd, maar er vallen me wel een paar dingen op:

op regel 7: $_POST zou $_GET moeten zijn
op regel 10/12/16: je hebt enkele quotes binnen dubbele quotes, dus die zou je moeten escapen

De optie om een onchange actie op te kunnen geven is natuurlijk interessant. Waar ik wel naar streef in mijn code, is om JavaScript (net als CSS) gescheiden te houden van HTML.
Frank -
Frank -
16 jaar geleden
 
0 +1 -0 -1
$select = "<select name='{$name}' "; levert geen geldige html op en is ook geen al te fraaie php-code. HTML eist namelijk dubbele quotes en variabelen horen in php niet tussen quotes te staan.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
// 'fout'
$select = "<select name='{$name}' ";

//goed
$select = '<select name="'.$name.'"'; // Door het gebruikte lettertype zijn de enkele en dubbele quotes hier niet goed leesbaar
?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
15 jaar geleden
 
0 +1 -0 -1
Tjah, ik vind de 1e oplossing op zich wel mooi, en heb hem iets aangepast, om het te gebruiken in dit topic:
http://phphulp.nl/forum/showtopic.php?cat=1&id=31652&lasttopic=1

Dit is volgens mij de kortst mogelijke notatie zonder errors en/ of warnings, het staat alleen nog niet in een functie, maar dat is gemakkelijk om te bouwen. Een voordeel van deze manier is dat je de key gebruiken kan om de maand te bepalen, en gemakkelijk kan switchen naar een andere taal, indien gewenst. ($values[0] -> Januari, enzovoort)

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
<?php  
ini_set('display_errors', 1);
error_reporting(E_ALL);

$values = array('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December');
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="GET">';
echo '<select name="month">';
foreach
(
    $values as $key => $value )
    {

        //echo "<option>$value</option>\n";
        if($_SERVER['REQUEST_METHOD'] == "GET"){
            if($key==$_GET['month']){
                   $selected='selected="selected"';
                    }

               else{
                $selected='';
                }

            echo '<option value="'.$key.'" '.$selected.'>'.$value.'</option>'."\n";
            }

        // nog niet gepost: dan niet doorlopen met $selected
         else{
            echo '<option value="'.$key.'">'.$value.'</option>'."\n";
            }
    }

echo "</select></form>";
?>

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Selectief Geheugen
  2. Waarde opvragen en de juiste optie selecteren
  3. Een kortere manier zonder notices
  4. Een mooiere manier met associatieve arrays
  5. Meer dan 1 selectbox: automatisch genereren
  6. Eureka: multidimensionale array!

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

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.