addAtributeTo functie OOP
Ik ben nu bezig met het leren van OOP.
Ik beheers PHP redelijk, ik zet hele applicaties in elkaar, alleen het OOP gedeelte is nieuw voor mij.
Nu heb ik een formbuilder class gebouwd, en wil hier graag meer functionaliteit in hebben.
Hieronder de Source:
Code (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
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
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
<?php
class Forms {
protected $_inputs;
private $_method, $_action;
public function __construct($method,$action = NULL)
{
$this->_method = $method;
$this->_action = $action;
}
public function addInput($type,$name,$value,$placeholder = NULL,$extra = NULL) {
$this->_inputs[] = array (
'type' => $type,
'name' => $name,
'value' => $value,
'placeholder' => $placeholder,
'extra' => $extra
);
}
public function addLabel($name,$text) {
$this->_inputs[] = array (
'type' => 'label',
'name' => $name,
'text' => $text
);
}
public function addTextarea($name,$value = NULL, $placeholder = NULL) {
$this->_inputs[] = array (
'type' => 'textarea',
'name' => $name,
'value' => $value,
'placeholder' => $placeholder
);
}
public function addAtributeTo($name,$key,$value) {
$this->_atributes[] = array(
'name' => $name,
$key => $key,
$value => $value
);
}
function printInputs() {
echo '<pre>';
print_r($this->_inputs);
echo '</pre>';
}
public function printForm2() {
$html = '<form action="'.$this->_action.'" method="'.$this->_method.'">';
for ($i = 0; $i < count($this->_inputs); $i++) {
switch($this->_inputs[$i]['type']) {
case "label":
$html .= '<label name="'.$this->_inputs[$i]['name'].'">'.$this->_inputs[$i]['text'].'</label>';
break;
case "text":
case "password":
case "submit":
case "email":
$html .= '<input type="'.$this->_inputs[$i]['type'].'" ';
$html .= ' name="'.$this->_inputs[$i]['name'].'" ';
$html .= ' value="'.$this->_inputs[$i]['value'].'" ';
$html.= ' placeholder="'.$this->_inputs[$i]['placeholder'].'" ';
$html .= '> ';
$html .= ' '.$this->_inputs[$i]['extra'].'';
break;
case "textarea":
$html .= '<textarea name="'.$this->_inputs[$i]['name'].' value="'.$this->_inputs[$i]['value'].'" placeholder="'.$this->_inputs[$i]['placeholder'].'"></textarea>';
break;
}
}
$html .= '</form>';
return $html;
}
}
?>
class Forms {
protected $_inputs;
private $_method, $_action;
public function __construct($method,$action = NULL)
{
$this->_method = $method;
$this->_action = $action;
}
public function addInput($type,$name,$value,$placeholder = NULL,$extra = NULL) {
$this->_inputs[] = array (
'type' => $type,
'name' => $name,
'value' => $value,
'placeholder' => $placeholder,
'extra' => $extra
);
}
public function addLabel($name,$text) {
$this->_inputs[] = array (
'type' => 'label',
'name' => $name,
'text' => $text
);
}
public function addTextarea($name,$value = NULL, $placeholder = NULL) {
$this->_inputs[] = array (
'type' => 'textarea',
'name' => $name,
'value' => $value,
'placeholder' => $placeholder
);
}
public function addAtributeTo($name,$key,$value) {
$this->_atributes[] = array(
'name' => $name,
$key => $key,
$value => $value
);
}
function printInputs() {
echo '<pre>';
print_r($this->_inputs);
echo '</pre>';
}
public function printForm2() {
$html = '<form action="'.$this->_action.'" method="'.$this->_method.'">';
for ($i = 0; $i < count($this->_inputs); $i++) {
switch($this->_inputs[$i]['type']) {
case "label":
$html .= '<label name="'.$this->_inputs[$i]['name'].'">'.$this->_inputs[$i]['text'].'</label>';
break;
case "text":
case "password":
case "submit":
case "email":
$html .= '<input type="'.$this->_inputs[$i]['type'].'" ';
$html .= ' name="'.$this->_inputs[$i]['name'].'" ';
$html .= ' value="'.$this->_inputs[$i]['value'].'" ';
$html.= ' placeholder="'.$this->_inputs[$i]['placeholder'].'" ';
$html .= '> ';
$html .= ' '.$this->_inputs[$i]['extra'].'';
break;
case "textarea":
$html .= '<textarea name="'.$this->_inputs[$i]['name'].' value="'.$this->_inputs[$i]['value'].'" placeholder="'.$this->_inputs[$i]['placeholder'].'"></textarea>';
break;
}
}
$html .= '</form>';
return $html;
}
}
?>
Op deze manier gebruik ik de class:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$form3 = new Forms('post');
$form3->addLabel('username','Username : ');
$form3->addInput('text','username','','Username','<br>');
$form3->addLabel('password','Password : ');
$form3->addInput('password','password','','Password','<br>');
$form3->addInput('submit','submit_login','Login2');
print($form3->printForm2());
?>
$form3 = new Forms('post');
$form3->addLabel('username','Username : ');
$form3->addInput('text','username','','Username','<br>');
$form3->addLabel('password','Password : ');
$form3->addInput('password','password','','Password','<br>');
$form3->addInput('submit','submit_login','Login2');
print($form3->printForm2());
?>
Is dit een goede opbouw?
En hoe verwerk ik het addAtributeTo gedeelte in deze class?
Ik was al zover om als argumenten: $name,$key,$value te accepteren.
Maar hoe verwerk ik dat in deze class?
Alle tips zijn welkom. Gelieve geen code te geven, maar meer een duw in de goede richting ^^
Gewijzigd op 09/03/2015 15:30:13 door Randy vsf
Dan zou ik daarvoor aparte methoden schrijven.
Ik bedoel eerder om bij de inputs een class of id in te voegen.
Ik wil dan de $name bij de juiste $name koppelen. Maar ik heb nu meerdere dingen geprobeerd, en het lukt niet zoals ik het wil.
EDIT:
Als het niet OOP was, weet ik wel hoe ik het voor elkaar krijg.
Maar ik probeer nu OOP te leren, dus voldoet mijn oplossing niet.
Gewijzigd op 09/03/2015 16:01:24 door Randy vsf
Een formulierveld is van een type.
Waarom zou je bij je formuliervelden ineens overstappen op arrays? Waarom niet een array van objecten?
Welke acties zou je willen uitvoeren op een formulier:
- toevoegen van velden (->addField()) - hierbij zou je kunnen aangeven:
* welk type het veld is
* wat het naam / de id van het veld is
* welke andere (HTML-)properties dit veld heeft
* welke opties dit veld heeft
* welke validatieregels dit veld heeft
- initialisatie met waarden (->initialize([array()]))
- validatie (->validate())
- nagaan of er fouten zijn opgetreden (->hasErrors())
- in een verwerkstap de waarden van het formulier opslaan als er ergens fouten in zitten zodat een gebruiker zijn/haar input kan bijwerken (->store())
- het afdrukken van het formulier, eventueel met foutenrapportage van eerdere invoer (getHtml()); deze drukt het sjabloon van het formulier af en loopt door de formuliervelden heen en drukt de bijbehorende sjablonen daarvan af
Een formulierveld kan een abstracte class zijn met een aantal methoden:
- getters en setters
- een algemene validate() methode die alle regels voor dat veld afloopt
- een getErrors() methode die mogelijke fouten terugrapporteert
Een concreet formulierveld (bijvoorbeeld een input veld) is een afgeleide van de abstracte formulierveld klasse; deze bevat onder andere:
- concrete implementaties van veld-specifieke validatieregels
- een getHtml() methode die de complete output van een veld retourneert
Zo heb ik mijn formuliersysteem ongeveer opgezet.
voorbeeld.
EDIT: oh, en voor "publieke" formulieren gebruik je een token om CSRF tegen te gaan.
Gewijzigd op 09/03/2015 16:10:15 door Thomas van den Heuvel
Ik denk dat je eerst twee dingen moet aanpassen: verbeter de interne datastructuur en vereenvoudig de methoden. (Je zult er een paar extra methoden moeten toevoegen om de bestaande methoden te verbeteren, maar dat is niet erg.) Daarna wordt beter duidelijk dat methoden zoals setClass() en setId() waarschijnlijk de beste oplossing zijn — en ook hoe je die in het grotere geheel inpast.
Dat je die $name niet kunt koppelen, is dus een symptoom van een ander probleem.
Ik ga hier eens even goed voor zitten en weer helemaal opnieuw beginnen. Ik neem jullie reacties hierin mee.
Zodra die klaar is plaats ik hem hier voor een check.
Gewijzigd op 09/03/2015 17:05:32 door Randy vsf