Form class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

29/08/2013 15:30:13
Quote Anchor link
Hallo,

Ik heb een form class. Als een formulier wordt verzonden wordt meestal de method setValue of setValueArray aangeroepen.
setValue heeft de parameter field en value.
setValueArray heeft een parameter die een array is (field => value, field => value, etc.)

Maar in plaats van voor elk veld in een formulier de method setValue aan te roepen, of om eerst een array met alle field names en values te maken, kan ik dan niet beter gewoon de $_POST variabele meegeven aan die class?
Dan doe je in 1 method alle $_POST data doorgeven, en kan de class zelf met een loop een array ervan maken enzovoort.
Dat zou een hele hoop werk kunnen besparen. Is dit een goed idee?
Ik heb dit al geprobeerd, maar moet nog even de juiste manier vinden. De class weet namelijk niet de indexes van de $_POST array, (dus de veldnamen) is er dus een functie die de indexes van een array kan ophalen?
Ik vond array_slice() op php.net, maar die werkte niet in mijn code, ik gebruikte hem misschien verkeerd?
Gewijzigd op 29/08/2013 15:32:00 door Mark Hogeveen
 
PHP hulp

PHP hulp

21/11/2024 15:59:03
 
Kris Peeters

Kris Peeters

29/08/2013 16:51:47
Quote Anchor link
Ja, ik vind dat een goed idee.

Je bent trouwens niet alleen; drupal heeft dit ook.
Zie bv. hier: https://drupal.org/node/751826
Het $form object kan zo zowel het formulier genereren, de POST opvangen en zelfs een database tabel genereren (in sommige gevallen).

Die key's?
Simpelweg zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($_POST as $key=>$value) {
  echo $key .' - '. $value
}
?>


Kijk ook naar deze functie: http://php.net/manual/en/function.array-keys.php
Gewijzigd op 29/08/2013 17:25:11 door Kris Peeters
 
Mark Hogeveen

Mark Hogeveen

29/08/2013 21:33:26
Quote Anchor link
Dit is wat ik nu heb, maar ik kan bijna de hele code aanpassen door een fout.
Het probleem is namelijk dat je geen return kunt doen in de empty() functie. Daar kwam ik nu pas achter.
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?PHP
// register.php

include "config.php";
include "form.class.php";
include "validator.class.php";

// uses: form.class.php, validator.class.php, config.php

session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['register'])) {
    
    $Form = new Form;
    $Form->setAllPostValues($_POST);
    
    $Validator = new Validator;
    
    if(empty($Form->getValue("username"))) {
        
        $Form->setErrorByField("username", "Vul een gebruikersnaam in");
    }
else {
        
        if(!$Validator->checkUsername($Form->getValue("username"))) {
            
            $Form->setErrorByField("username", "Een gebruikersnaam mag alleen letters, hoofdletters, cijfers en de tekens . _ bevatten");
        }
    }

    if(empty($Form->getValue("email"))) {
        
        $Form->setErrorByField("email", "Vul een emailadres in");
    }
else {
        
        if(!$Validator->checkEmail($Form->getValue("email"))) {
            
            $Form->setErrorByField("email", "Dit emailadres in ongeldig");
        }
    }

    if(empty($Form->getValue("password"))) {
        
        $Form->setErrorByField("password", "Vul een wachtwoord in");
    }

    if(empty($Form->getValue("password_check"))) {
        
        $Form->setErrorByField("password_check", "Vul je wachtwoord nogmaals in");
    }

    if(!empty($Form->getValue("password")) && !empty($Form->getValue("password_check"))) {
        
        if($Form->getValue("password") == $Form->getValue("password_check"))) {
            if(strlen($Form->getValue("password")) >= MIN_PWD_LENGTH) {
                if(strlen($Form->getValue("password") <= MAX_PWD_LENGTH)) {
                    if(!$Validator->checkPasswordSyntax($Form->getValue("password"))) {
                        
                        $Form->setErrorByField("password", "Het wachtwoord moet minimaal 1 hoofdletter en 1 cijfer bevatten");
                    }
                }
else {
                    $Form->setErrorByField("password", "Het wachtwoord is te lang");
                }
            }
else {
                
                $Form->setErrorByField("password", "Het wachtwoord is te kort");
            }
        }
else {
            
            $Form->setErrorByField("password", "De ingevulde wachtwoorden zijn niet hetzelfde");
        }
    }

    if(empty($Form->getValue("captcha"))) {
        
        $Form->setErrorByField("captcha", "Vul de code in");
    }
else {
        
        if(!$Form->getValue("captcha") == $_SESSION['captcha']) {
            
            $Form->setErrorByField("De code was niet juist");
        }
    }
}


?>

<!DOCTYPE html>
<html>
<head>
<title>Registreren</title>
</head>
<body>
<form method="post" action="">
    <div class="row">
        <label>
        Gebruikersnaam:<input type="text" name="username" value="<? echo $Form->getSafeValue("username"); ?>" />
        <? echo $Form->getError("username"); ?>
        </label>
    </div>
    <div class="row">
        <label>
        Emailadres:<input type="text" name="email" value="<? echo $Form->getSafeValue("email"); ?>" />
        <? echo $Form->getError("email"); ?>
        </label>
    </div>
    <div class="row">
        <label>
        Wachtwoord:<input type="password" name="password" value="<? echo $Form->getSafeValue("password"); ?>" />
        <? echo $Form->getError("password"); ?>
        </label>
    </div>
    <div class="row">
        <label>
        Wachtwoord herhalen:<input type="password" name="password_check" value="<? echo $Form->getSafeValue("password_check"); ?>" />
        <? echo $Form->getError("password_check"); ?>
        </label>
    </div>
    <div class="row">
        <label for="captcha">
            <img src="captcha.php" />
        </label>
    </div>
    <div class="row">
        <label>
        Typ bovenstaande code over:<input type="text" id="captcha" name="captcha" />
        <? $Form->getError("captcha"); ?>
        </label>
    </div>
    <div class="row submitrow">
        <input type="submit" name="register" value="Registreren" />
    </div>
</form>
</body>
</html>

En ik vind het zo jammer dat ik steeds bij elke controle helemaal $Form->getvalue(...) moet typen.
Het is wel meer OO dan gewoon de $_POST variabele te typen, maar ook weer langer.
Kan dit nog efficiënter?
 
Eddy E

Eddy E

29/08/2013 22:04:20
Quote Anchor link
Ja. Bovenaan een array maken met je veldnamen. Als username, password, captha.

Meer niet.
En die array laten aflopen met foreach. Zowel in klas als html.
 
Mark Hogeveen

Mark Hogeveen

29/08/2013 22:21:10
Quote Anchor link
Dat doe ik dan in de validator.
Een method die alle verplichte velden doorloopt en controleert of ze gevuld zijn. Bij een leeg veld setErrorByField() aanroepen van Form class.
 
Eddy E

Eddy E

30/08/2013 07:27:23
Quote Anchor link
Gebruik die array dan ook om het formulier te bouwen:

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
<?php
// register.php
include "config.php";
include "form.class.php";
include "validator.class.php";

$velden = array("username"=>"text", "email"=>"email", "password"=>"password", "password_check"=>"password", "captcha"=>"text", "gekozen_datum"=>"date");

foreach($velden as $veld=>$type)
    {

    echo '    <div class="row">
                   <label for="'
.$veld.'">Vul hier uw '.$veld.' in:</label>
            <input type="'
.$type.'" id="'.$veld.'" name="'.$veld.'">
                '
.$Form->getError($veld).'
               </div>'
;    
    }

?>

Daarnaast hoort je <input> NIET in je <label>
En moet je <label> ook een for="" hebben.

Wil je moeilijker doen (met html5-pattersn, required, limitaties etc), dan zou ik het persoonlijk gewoon volledig uittypen.

Edit:
Eddy; de PHP-tags is voor een URL naar php.net/{functienaam}. Voor letterlijke code kun je de code-tags gebruiken :)
Gewijzigd op 30/08/2013 11:35:50 door Chris -
 
Mark Hogeveen

Mark Hogeveen

30/08/2013 17:05:59
Quote Anchor link
Ik doe liever het formulier vast typen.
Nog 1 vraagje, is het verstandiger om de form class mee te geven als object aan de validator? Of gewoon weer de velden met hun waardes aan de validator geven?
 
Jeroen VD

Jeroen VD

30/08/2013 18:10:22
Quote Anchor link
de HTML voor je form is semantisch tevens ook fout; kijk hier eens naar: http://www.testingcode.org/blog/2012/06/html5-reactieformulier-met-php-e-mailafhandeling/
 



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.