[OOP] Eerste script
Nou heb ik jou laatste voorbeeld proberen te evenaren (maar dan zonder interface implementatie). Tot zover wordt de button meegenomen, maar hoe geef ik de child nou mee, dat begrijp ik niet uit jou voorbeeld.
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
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
<?php
class Button{
private $attributes;
private $children;
private $allowedTypes = Array('button','reset','submit');
public function __construct($type,$name = null){
$this->attributes = new Attributes;
$this->attributes->setAttribute('type',$type);
$this->attributes->setAttribute('name',$name);
$this->type = $type; //?????
}
public function addChild( $child ){
$this->children[] = $child;
}
public function writeTag(){
if(in_array(strtolower($this->type),$this->allowedTypes))
{
$str = '<button'. $this->attributes->writeAttributes() .'>';
foreach($this->children AS $child)
{
$str .= $child;
}
$str .= '</button><br />'.PHP_EOL;
return $str;
}
else
{
throw new Exception('Button Type not allowed');
}
}
}
$form = new Form();
$form->addChild( new Input( 'text' , 'name' , 'name' ) );
$form->addChild( new Button( 'submit', 'save' ) );
echo $form->writeTag();
?>
class Button{
private $attributes;
private $children;
private $allowedTypes = Array('button','reset','submit');
public function __construct($type,$name = null){
$this->attributes = new Attributes;
$this->attributes->setAttribute('type',$type);
$this->attributes->setAttribute('name',$name);
$this->type = $type; //?????
}
public function addChild( $child ){
$this->children[] = $child;
}
public function writeTag(){
if(in_array(strtolower($this->type),$this->allowedTypes))
{
$str = '<button'. $this->attributes->writeAttributes() .'>';
foreach($this->children AS $child)
{
$str .= $child;
}
$str .= '</button><br />'.PHP_EOL;
return $str;
}
else
{
throw new Exception('Button Type not allowed');
}
}
}
$form = new Form();
$form->addChild( new Input( 'text' , 'name' , 'name' ) );
$form->addChild( new Button( 'submit', 'save' ) );
echo $form->writeTag();
?>
Output
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Warning: Invalid argument supplied for foreach() in ** on line 130
<form method="post" name="formulier1" action="/oo2.php">
<input type="text" id="name" name="name" /><br />
<input type="email" id="email" name="email" /><br />
<input type="tel" id="phone" name="phone" /><br />
<input type="date" id="birthdate" name="birthdate" /><br />
<input type="password" id="password" name="password" /><br />
<input type="number" id="aantal" name="aantal" /><br />
<button type="submit" name="save"></button><br />
</form>
<form method="post" name="formulier1" action="/oo2.php">
<input type="text" id="name" name="name" /><br />
<input type="email" id="email" name="email" /><br />
<input type="tel" id="phone" name="phone" /><br />
<input type="date" id="birthdate" name="birthdate" /><br />
<input type="password" id="password" name="password" /><br />
<input type="number" id="aantal" name="aantal" /><br />
<button type="submit" name="save"></button><br />
</form>
De warning komt omdat de child voor de button niet wordt weergegeven
Edit:
En op regel 12 zie je dat ik $type nogmaals opsla om deze op regel 20 te gebruiken, maar dit lijkt me onlogisch omdat het eigenlijk al als attribute wordt opgeslagen, maar kan ik deze ook uitlezen?
En op regel 12 zie je dat ik $type nogmaals opsla om deze op regel 20 te gebruiken, maar dit lijkt me onlogisch omdat het eigenlijk al als attribute wordt opgeslagen, maar kan ik deze ook uitlezen?
Gewijzigd op 22/10/2013 14:07:40 door Michael -
Erwin H op 22/10/2013 14:06:53:
Dat was een foutje van mij. De $children property moet je als array definieren, zodat je nooit een probleem krijgt in je foreach. Anders, als je geen kinderen meegeeft krijg je die foutmelding omdat $children null is en geen array.
Inmiddels ook aangepast in mijn vorige post.
Inmiddels ook aangepast in mijn vorige post.
Oops dat was van ons beide niet zo slim. Uiteraard moet dat een Array zijn :-)
De warning blijft daarmee weg, maar ik heb nog geen 'value' voor de button
In dit geval kan je voor twee mogelijkheden kiezen om die value mee te geven. Ofwel je maakt een soort 'text only' class (die dus geen html tags bouwt, maar alleen maar platte tekst), ofwel je geeft de value ook als parameter mee aan de constructor (of via een andere setter). In de writeTag() method plaats je value dan gewoon tussen de tags in de string die je teruggeeft.
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
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
<?php
class Form {
public $form = array();
private $_method;
private $_methodes = array('POST','GET');
private $_action;
private $_enctype;
private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
private $_error = array();
public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
$this->_action = $action;
$this->_method = strtoupper($method);
$this->_enctype = strtolower($enctype);
if(strtolower($this->_enctype) == 'upload') {
$this->_enctype = 'multipart/form-data';
}
if(!in_array($this->_method,$this->_methodes)) {
$this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
}
if(!in_array($enctype,$this->_enctypes)) {
$this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
}
if(empty($this->_error)) {
$this->form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
} else {
throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
}
}
public function append($input) {
$this->form[]= $input->input;
}
}
class Input {
private $_type;
private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
public $input;
public function __construct($type, $name,$value='',$description='',$newLine=false) {
$differs = array('textarea','select');
if(in_array(strtolower($type),$this->_types)) {
if($description<>'') {
$this->input = '<label for="' . $name . '">' . $description . '</label>';
}
$this->_type = strtolower($type);
if($this->_type == 'textarea') {
$this->input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
} elseif($this->_type == 'select') {
if(is_array($value)) {
$this->input .= '<select name="' . $name . '" id="' . $name . '">';
foreach($value as $value => $description) {
$this->input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
}
$this->input .= '</select>';
} else {
throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
}
} else {
$this->input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
}
if($newLine) {
$this->input .= '<br>';
}
} else {
throw new Exception('Deze type input is niet toegestaan! Toegestane types zijn: ' . implode(' ,',$this->_types));
}
}
}
?>
class Form {
public $form = array();
private $_method;
private $_methodes = array('POST','GET');
private $_action;
private $_enctype;
private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
private $_error = array();
public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
$this->_action = $action;
$this->_method = strtoupper($method);
$this->_enctype = strtolower($enctype);
if(strtolower($this->_enctype) == 'upload') {
$this->_enctype = 'multipart/form-data';
}
if(!in_array($this->_method,$this->_methodes)) {
$this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
}
if(!in_array($enctype,$this->_enctypes)) {
$this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
}
if(empty($this->_error)) {
$this->form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
} else {
throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
}
}
public function append($input) {
$this->form[]= $input->input;
}
}
class Input {
private $_type;
private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
public $input;
public function __construct($type, $name,$value='',$description='',$newLine=false) {
$differs = array('textarea','select');
if(in_array(strtolower($type),$this->_types)) {
if($description<>'') {
$this->input = '<label for="' . $name . '">' . $description . '</label>';
}
$this->_type = strtolower($type);
if($this->_type == 'textarea') {
$this->input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
} elseif($this->_type == 'select') {
if(is_array($value)) {
$this->input .= '<select name="' . $name . '" id="' . $name . '">';
foreach($value as $value => $description) {
$this->input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
}
$this->input .= '</select>';
} else {
throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
}
} else {
$this->input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
}
if($newLine) {
$this->input .= '<br>';
}
} else {
throw new Exception('Deze type input is niet toegestaan! Toegestane types zijn: ' . implode(' ,',$this->_types));
}
}
}
?>
Gewijzigd op 22/10/2013 22:08:39 door Dennis WhoCares
Als je echt een applicatie in OOP wilt ontwikkelen dan is 1 van de kenmerken dat elke class verantwoordelijk is voor zijn eigen doen en laten. De class moet ervoor zorgen dat input gechecked wordt en dat output altijd correct is en bruikbaar is, of als de class niet in staat is om daarvoor te zorgen dat er een foutmelding wordt opgeworpen zodat een andere class het kan overnemen. Met publieke properties is zowel input als output checken onmogelijk geworden.
Wat als ik bij jouw form class dit doe:
Kan jouw class me dan nog garanderen dat ik een mooi form op mijn scherm krijg?
Daarnaast mis je in je form ook de afsluitende form tag, dus je class kan alleen maar garanderen dat er nooit een correct form op het scherm komt.
Kijk verder ook naar mijn opmerkingen over de attributes op de vorige pagina. Ook jij doet dit weer in beide classes. Dubbel werk dus en volkomen inflexibel.
Gewijzigd op 23/10/2013 10:24:23 door Erwin H
Code (php)
Wat ik probeer duidelijk te maken is dat door de interface iedere afgeleide class ook een functie render() MOET hebben.
Stel dat je na een half jaar opeens nog een nieuwe 'FormField' wilt toevoegen aan het rijtje. één blik op de interface en je weet het. De class die je gaat maken MOET een render() functie hebben. Je hoeft niet meer je code door te spitten of erger nog gaan debuggen omdat je dan iets over het hoofd ziet.
een interface is dus super handig als er meerder classen van afgeleid worden en daarom ook een must.
Gewijzigd op 23/10/2013 11:47:51 door Frank Nietbelangrijk
Frank: wat is class Textfield ->>>>>implements<<<<<-----
De class New_Class is dus een overerving van Old_Class en implementeert de interface Some_Interface.
Voor een class gebruik je extends ...
Voor een interface gebruik je implements ...
voorbeeld
Ik was van plan om __toString() toe te passen, zoals ik nu heb, maar ik wou gewoon even weten wat voor commentaar erop komt:
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
87
88
89
90
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
<?php
error_reporting(E_ALL);
class Form {
private $_form = array();
private $_method;
private $_methodes = array('POST','GET');
private $_action;
private $_enctype;
private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
private $_error = array();
public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
$this->_action = $action;
$this->_method = strtoupper($method);
$this->_enctype = strtolower($enctype);
if(strtolower($this->_method) == 'upload') {
$this->_method = 'multipart/form-data';
}
if(!in_array($this->_method,$this->_methodes)) {
$this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
}
if(!in_array($enctype,$this->_enctypes)) {
$this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
}
if(empty($this->_error)) {
$this->_form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
} else {
throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
}
}
public function append($input) {
$this->_form[]= $input;
}
public function __toString() {
return implode("\n\r",$this->_form) . '</form>';
}
}
class Input {
private $_type;
private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
private $_input;
public function __construct($type, $name,$value='',$description='',$newLine=false) {
$differs = array('textarea','select');
if(in_array(strtolower($type),$this->_types)) {
if($description<>'') {
$this->_input = '<label for="' . $name . '">' . $description . '</label>';
}
$this->_type = strtolower($type);
if($this->_type == 'textarea') {
$this->_input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
} elseif($this->_type == 'select') {
if(is_array($value)) {
$this->_input .= '<select name="' . $name . '" id="' . $name . '">';
foreach($value as $value => $description) {
$this->_input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
}
$this->_input .= '</select>';
} else {
throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
}
} else {
$this->_input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
}
if($newLine) {
$this->_input .= '<br>';
}
} else {
throw new Exception('Deze type input is niet toegestaan!');
}
}
public function __toString() {
return $this->_input;
}
}
$myForm = new Form('login.php');
$myForm->append(new Input('text','login_user','Gebruikersnaam','Uw gebruikersnaam:',true));
$myForm->append(new Input('password','login_pass','password','Uw wachtwoord:',true));
$myForm->append(new Input('submit','login_btn','Login!'));
echo $myForm;
?>
error_reporting(E_ALL);
class Form {
private $_form = array();
private $_method;
private $_methodes = array('POST','GET');
private $_action;
private $_enctype;
private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
private $_error = array();
public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
$this->_action = $action;
$this->_method = strtoupper($method);
$this->_enctype = strtolower($enctype);
if(strtolower($this->_method) == 'upload') {
$this->_method = 'multipart/form-data';
}
if(!in_array($this->_method,$this->_methodes)) {
$this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
}
if(!in_array($enctype,$this->_enctypes)) {
$this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
}
if(empty($this->_error)) {
$this->_form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
} else {
throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
}
}
public function append($input) {
$this->_form[]= $input;
}
public function __toString() {
return implode("\n\r",$this->_form) . '</form>';
}
}
class Input {
private $_type;
private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
private $_input;
public function __construct($type, $name,$value='',$description='',$newLine=false) {
$differs = array('textarea','select');
if(in_array(strtolower($type),$this->_types)) {
if($description<>'') {
$this->_input = '<label for="' . $name . '">' . $description . '</label>';
}
$this->_type = strtolower($type);
if($this->_type == 'textarea') {
$this->_input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
} elseif($this->_type == 'select') {
if(is_array($value)) {
$this->_input .= '<select name="' . $name . '" id="' . $name . '">';
foreach($value as $value => $description) {
$this->_input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
}
$this->_input .= '</select>';
} else {
throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
}
} else {
$this->_input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
}
if($newLine) {
$this->_input .= '<br>';
}
} else {
throw new Exception('Deze type input is niet toegestaan!');
}
}
public function __toString() {
return $this->_input;
}
}
$myForm = new Form('login.php');
$myForm->append(new Input('text','login_user','Gebruikersnaam','Uw gebruikersnaam:',true));
$myForm->append(new Input('password','login_pass','password','Uw wachtwoord:',true));
$myForm->append(new Input('submit','login_btn','Login!'));
echo $myForm;
?>
En over die attributen heb je ergens wel gelijk, en eigenlijk wil ik deze dus zelf als 'geavanceerde' optie toevoegen bij de new Input()
Gewijzigd op 23/10/2013 19:43:48 door Dennis WhoCares