simple OOP formulier
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
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
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
<?php
class cForm
{
//var form tag
private $_TagAction;
private $_TagMethod;
private $_TagName;
private $_TagExtraAttr;
//var form field
private $_FieldType;
private $_FieldName;
private $_FieldValue;
private $_FieldChecked;
//var select tag
private $_SelectName;
private $_SelectOption;
private $_SelectOptionSelected;
//var button
private $_ButtonValue;
private $_ButtonName;
public function __construct( $_TagAction , $_TagMethod , $_TagName , $_TagExtraAttr ){
$this->_TagAction = $_TagAction;
$this->_TagMethod = $_TagMethod;
$this->_TagName = $_TagName;
$this->_TagExtraAttr = $_TagExtraAttr;
}
public function getTagOpen(){
return '<form action="' . $this->_TagAction . '" method="' . $this->_TagMethod . '" name="' . $this->_TagName .'" ' . $this->_TagExtraAttr . '>' . PHP_EOL;
}
public function setFormField( $FieldType , $FieldName , $FieldValue , $FieldChecked ){
$this->_FieldType = $FieldType;
$this->_FieldName = $FieldName;
$this->_FieldValue = $FieldValue;
$this->_FieldChecked = $FieldChecked;
}
public function getFormField(){
return '<input type="' . $this->_FieldType . '" name="' . $this->_FieldName . '" value="' . $this->_FieldValue . '" ' . $this->_FieldChecked . '>'. PHP_EOL;
}
public function setSelectOpen($SelectName){
$this->_SelectName = $SelectName;
}
public function getSelectOpen(){
return '<select name="'.$this->_SelectName.'">';
}
public function setSelectOption( $SelectOption ,$SelectOptionSelected ){
$this->_SelectOption = $SelectOption;
$this->_SelectOptionSelected = $SelectOptionSelected;
}
public function getSelectOption(){
return '<option' . $this->_SelectOptionSelected . '>' . $this->_SelectOption . '</option>' . PHP_EOL;
}
public function getSelectEnd(){
return '</select>' . PHP_EOL;
}
public function setButton( $ButtonValue , $ButtonName ){
$this->_ButtonValue = $ButtonValue;
$this->_ButtonName = $ButtonName;
}
public function getButton(){
return '<input type="submit" value="' . $this->_ButtonValue . '" name="'. $this->_ButtonName .'">' . PHP_EOL;
}
public function getTagEnd(){
return '</form>' . PHP_EOL;
}
}
$objForm = new cForm( '/' , 'post' , 'test' , 'onsubmit="test"' );
//form start
echo $objForm->getTagOpen();
//text field
$objForm->setFormField('text','2', '' , '');
echo $objForm->getFormField();
//checkbox
$objForm->setFormField('checkbox','2', '' , 'checked="checked"');
echo $objForm->getFormField();
//selectbox
// start selectbox
$objForm->setSelectOpen('bas');
echo $objForm->getSelectOpen();
// option selectbox
$objForm->setSelectOption('bas', ' selected');
echo $objForm->getSelectOption();
$objForm->setSelectOption('123', '');
echo $objForm->getSelectOption();
$objForm->setSelectOption('456', '');
echo $objForm->getSelectOption();
//end selectbox
echo $objForm->getSelectEnd();
//button
$objForm->setButton('test type','test name' );
echo $objForm->getButton();
//form end
echo $objForm->getTagEnd();
?>
class cForm
{
//var form tag
private $_TagAction;
private $_TagMethod;
private $_TagName;
private $_TagExtraAttr;
//var form field
private $_FieldType;
private $_FieldName;
private $_FieldValue;
private $_FieldChecked;
//var select tag
private $_SelectName;
private $_SelectOption;
private $_SelectOptionSelected;
//var button
private $_ButtonValue;
private $_ButtonName;
public function __construct( $_TagAction , $_TagMethod , $_TagName , $_TagExtraAttr ){
$this->_TagAction = $_TagAction;
$this->_TagMethod = $_TagMethod;
$this->_TagName = $_TagName;
$this->_TagExtraAttr = $_TagExtraAttr;
}
public function getTagOpen(){
return '<form action="' . $this->_TagAction . '" method="' . $this->_TagMethod . '" name="' . $this->_TagName .'" ' . $this->_TagExtraAttr . '>' . PHP_EOL;
}
public function setFormField( $FieldType , $FieldName , $FieldValue , $FieldChecked ){
$this->_FieldType = $FieldType;
$this->_FieldName = $FieldName;
$this->_FieldValue = $FieldValue;
$this->_FieldChecked = $FieldChecked;
}
public function getFormField(){
return '<input type="' . $this->_FieldType . '" name="' . $this->_FieldName . '" value="' . $this->_FieldValue . '" ' . $this->_FieldChecked . '>'. PHP_EOL;
}
public function setSelectOpen($SelectName){
$this->_SelectName = $SelectName;
}
public function getSelectOpen(){
return '<select name="'.$this->_SelectName.'">';
}
public function setSelectOption( $SelectOption ,$SelectOptionSelected ){
$this->_SelectOption = $SelectOption;
$this->_SelectOptionSelected = $SelectOptionSelected;
}
public function getSelectOption(){
return '<option' . $this->_SelectOptionSelected . '>' . $this->_SelectOption . '</option>' . PHP_EOL;
}
public function getSelectEnd(){
return '</select>' . PHP_EOL;
}
public function setButton( $ButtonValue , $ButtonName ){
$this->_ButtonValue = $ButtonValue;
$this->_ButtonName = $ButtonName;
}
public function getButton(){
return '<input type="submit" value="' . $this->_ButtonValue . '" name="'. $this->_ButtonName .'">' . PHP_EOL;
}
public function getTagEnd(){
return '</form>' . PHP_EOL;
}
}
$objForm = new cForm( '/' , 'post' , 'test' , 'onsubmit="test"' );
//form start
echo $objForm->getTagOpen();
//text field
$objForm->setFormField('text','2', '' , '');
echo $objForm->getFormField();
//checkbox
$objForm->setFormField('checkbox','2', '' , 'checked="checked"');
echo $objForm->getFormField();
//selectbox
// start selectbox
$objForm->setSelectOpen('bas');
echo $objForm->getSelectOpen();
// option selectbox
$objForm->setSelectOption('bas', ' selected');
echo $objForm->getSelectOption();
$objForm->setSelectOption('123', '');
echo $objForm->getSelectOption();
$objForm->setSelectOption('456', '');
echo $objForm->getSelectOption();
//end selectbox
echo $objForm->getSelectEnd();
//button
$objForm->setButton('test type','test name' );
echo $objForm->getButton();
//form end
echo $objForm->getTagEnd();
?>
Gewijzigd op 05/11/2012 13:53:47 door Bas D L
Kun je aub 1 code blok verwijderen?
@wouter, done...
En dan nu de eerste vraag, wat moeten we hier mee?
Ben net begonnen met OOP get en Set.
Mijn vraag is of dit zo de juiste opzet is in OOP, of dat het geen OOP is of nog beter/naders kan.
En je hebt het de hele tijd over het leren van 'get' en 'set', maar je weet dat dat gewoon maar 2 functies zijn? We hebben ze een speciale naam gegeven omdat deze functies de meest voorkomende taken uitvoeren, eigenschappen instellen en verkrijgen. Maar van de rest is er niks vreemdst aan.
Qua OO heb je je te houden aan 1 hele grote basis regel: Elke klasse en elke methode heeft maar 1 verantwoordelijkheid, zodra er meer zijn splits je het op in meerdere klassen of meerdere methoden.
In jou geval heb je alles in 1 klasse gezet wat enorm indruist tegen deze regel. Schrijf allereerst maar eens op welke verantwoordelijkheden/taken je in deze applicatie hebt.
Het lastige is, "hoe praktisch is dit?" Want misschien wil je jouw inputfields in a een tabel of div stoppen, met de volgende code zal dat niet makkelijk lukken.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$form = new Form();
$form->add(new InputField("username");
$form->add(new InputField("password");
$form->add(new Button("click me"));
print $form->getHtml();
?>
$form = new Form();
$form->add(new InputField("username");
$form->add(new InputField("password");
$form->add(new Button("click me"));
print $form->getHtml();
?>
Natuurlijk kan je dan van al je HTML tags ook classes maken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$form = new Form();
$div = new Div();
$form->add($div);
// Form fields are nested in a div, which is nested in a form.
$div->add(new InputField("username"));
$div->add(new InputField("password"));
$div->add(new Button("click me"));
print $form->getHtml();
?>
$form = new Form();
$div = new Div();
$form->add($div);
// Form fields are nested in a div, which is nested in a form.
$div->add(new InputField("username"));
$div->add(new InputField("password"));
$div->add(new Button("click me"));
print $form->getHtml();
?>
Nu kan je doorgaan totdat je helemaal geen HTML meer ziet! Hoe praktisch dat is, laat ik in het midden. Kijk bijvoorbeeld eens naar: http://www.php.net/manual/en/intro.dom.php
Om terug te komen op jouw code, probeer er voor te zorgen dat Form zich alleen bezig houdt met zichzelf, en dat hij zo min mogelijk bewust is van de status van buttons en andere inputfields. Properties als "_ButtonValue" of "_FieldType" horen d'r niet in thuis. Denk ook eens na hoe goed jouw huidige setup werkt als je dropdown boxes, radio knoppen en checkboxes wilt toevoegen.
Kunnen jullie me een klein beetje op weg helpen dmv een goed formulier voorbeeldje?
@wouter
lijstje:
form start
form end
input fields
select
button
Gewijzigd op 05/11/2012 14:31:21 door Bas D L
- FormRenderer (deze maakt de HTML van het formulier)
- FormElement (alle mogelijke elementen voor een formulier)
- FormBuilder (creëert een formulier)
Vervolgens heeft elke verantwoordelijkheid weer meerdere klassen. Zo kan je een HTMLFormRenderer maken of een andere formrenderer, kan zo snel even niks verzinnen. En een InputElement en een SelectElement die weer heel veel OptionElement klassen heeft en een ButtonElement.
De code wordt dan:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$formBuilder = new FormBuilder();
$formBuilder
->add('name', 'text')
->add('message', 'textarea')
;
$formFactory = new HTMLFormFactory($formBuilder);
echo $formFactory->render();
?>
$formBuilder = new FormBuilder();
$formBuilder
->add('name', 'text')
->add('message', 'textarea')
;
$formFactory = new HTMLFormFactory($formBuilder);
echo $formFactory->render();
?>
In FormBuilder::add() maak je dan gebruik van de InputElement ect. om een element toe te voegen.
Krijg je dan zo'n klasse-indeling?
class FormRenderHtml
{
}
class FormRenderElement
{
}
class FormBuilder
{
}
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
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
<?php
class A
{
public function foo()
{
return 'Foo!!';
}
}
class B
{
public function bar()
{
return 'Bar!!';
}
}
$a = new A();
echo $a->foo(); // Foo!!
$b = new B();
echo $b->bar(); // Bar!!
// klasse C breidt klasse A uit, het krijgt alleen methoden en properties
class C extends A
{
public function baz()
{
return 'Baz!!';
}
}
$c = new C();
$c->foo(); // doordat C de A klasse uitbreid heb je gewoon toegang tot de methoden van A
$c->baz(); // maar ook zijn eigen methoden werken
// je kan ook methoden veranderen:
class D extends B
{
// we 'overwriten' de bar() functie in B
public function bar()
{
return 'Bar from class D!!';
};
}
$d = new D();
echo $d->bar(); // deze roept de nieuwe methode aan in class D
?>
class A
{
public function foo()
{
return 'Foo!!';
}
}
class B
{
public function bar()
{
return 'Bar!!';
}
}
$a = new A();
echo $a->foo(); // Foo!!
$b = new B();
echo $b->bar(); // Bar!!
// klasse C breidt klasse A uit, het krijgt alleen methoden en properties
class C extends A
{
public function baz()
{
return 'Baz!!';
}
}
$c = new C();
$c->foo(); // doordat C de A klasse uitbreid heb je gewoon toegang tot de methoden van A
$c->baz(); // maar ook zijn eigen methoden werken
// je kan ook methoden veranderen:
class D extends B
{
// we 'overwriten' de bar() functie in B
public function bar()
{
return 'Bar from class D!!';
};
}
$d = new D();
echo $d->bar(); // deze roept de nieuwe methode aan in class D
?>
Dit ga je nu ook gebruiken in dit geval. Je hebt een hoofdklasse die je FormRenderer noemt. Deze klasse bevat alle functies die in elke renderer gelijk zijn. Vervolgens breiden we deze klasse uit in een andere klasse als HTMLFormRenderer die de methoden bevat speciaal voor een HTML form. Voorbeeldje:
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
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
<?php
class FormRenderer
{
private $builder;
public function __construct(FormBuilder $builder)
{
$this->setBuilder($builder);
}
public function setBuilder(FormBuilder $builder)
{
$this->builder = $builder;
}
public function getBuilder()
{
return $this->builder;
}
}
class HTMLFormRenderer extends FormRenderer
{
public function render()
{
$builder = $this->getBuilder();
$html = '<form>';
foreach ($builder->getElements() as $element) {
$html .= $element->render();
}
$html = '</form>';
return $html;
}
}
?>
class FormRenderer
{
private $builder;
public function __construct(FormBuilder $builder)
{
$this->setBuilder($builder);
}
public function setBuilder(FormBuilder $builder)
{
$this->builder = $builder;
}
public function getBuilder()
{
return $this->builder;
}
}
class HTMLFormRenderer extends FormRenderer
{
public function render()
{
$builder = $this->getBuilder();
$html = '<form>';
foreach ($builder->getElements() as $element) {
$html .= $element->render();
}
$html = '</form>';
return $html;
}
}
?>
Het is goed mogelijk dat je iets niet begrijpt, zou je dan aub gericht willen uitleggen wat je niet begrijpt dan kunnen we je verder helpen om het wel te begrijpen.
Gewijzigd op 05/11/2012 15:18:40 door Wouter J
1. public function __construct(FormBuilder $builder) |--> FormBuilder $builder
2. Waar is de class FormRenderer?
Quote:
1. public function __construct(FormBuilder $builder) |--> FormBuilder $builder
Door er FormBuilder voor te zetten eisen we dat de variabele $builder als waarde een instance van de FormBuilder bevat. Wat minder ingewikkeld met voorbeelden:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class A
{
}
class B
{
public function foo(A $object)
{
// ...
}
}
$b = new B();
$b->foo('Hello'); // geeft error, de parameter $object moet een instance van A zijn
$b->foo(new A()); // correct, de parameter $object is nu een instance van A
$a = new A();
$b->foo($a); // correct, de parameter $object is een instance van A (omdat $a een instance van A is)
?>
class A
{
}
class B
{
public function foo(A $object)
{
// ...
}
}
$b = new B();
$b->foo('Hello'); // geeft error, de parameter $object moet een instance van A zijn
$b->foo(new A()); // correct, de parameter $object is nu een instance van A
$a = new A();
$b->foo($a); // correct, de parameter $object is een instance van A (omdat $a een instance van A is)
?>
Quote:
2. Waar is de class FormRenderer?
Dat was een typfout van mij, ik heb het nu aangepast
Wat ik erg lastig vind is hoe ik dan nu een class FormBuilder moet maken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
class FormBuilder
{
public function __construct( $FieldType , $FieldName , $FieldValue , $FieldChecked ){
$this->_FieldType = $FieldType;
$this->_FieldName = $FieldName;
$this->_FieldValue = $FieldValue;
$this->_FieldChecked = $FieldChecked;
}
public function getElements(){
return '<input type="' . $this->_FieldType . '" name="' . $this->_FieldName . '" value="' . $this->_FieldValue . '" ' . $this->_FieldChecked . '>'. PHP_EOL;
}
}
{
public function __construct( $FieldType , $FieldName , $FieldValue , $FieldChecked ){
$this->_FieldType = $FieldType;
$this->_FieldName = $FieldName;
$this->_FieldValue = $FieldValue;
$this->_FieldChecked = $FieldChecked;
}
public function getElements(){
return '<input type="' . $this->_FieldType . '" name="' . $this->_FieldName . '" value="' . $this->_FieldValue . '" ' . $this->_FieldChecked . '>'. PHP_EOL;
}
}
Gewijzigd op 05/11/2012 15:30:43 door Bas D L
1) Builder
2) Elements
3) Renderer
De Elements zijn een veld, die bezitten dus al die eigenschappen. In de FormBuilder klasse hou je nu een array bij met alle elementen erin en die geef je terug met getElements().
$formBuilder->addName('test 1');
$formBuilder->addTypes('text');
$formBuilder->addName('test 2');
$formBuilder->addTypes('text');
Hoe kan ik trouwens simpeler maken?
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
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
<?php
class FormBuilder
{
private $name = array();
private $types = array();
public function addName($element)
{
$this->name[] = $element;
}
public function getName()
{
return $this->name;
}
public function addTypes($type)
{
$this->types[] = $type;
}
public function getTypes()
{
return $this->types;
}
}
class FormRenderer extends FormBuilder
{
private $builder;
public function __construct($builder)
{
$this->setBuilder($builder);
}
public function setBuilder($builder)
{
$this->builder = $builder;
}
public function getBuilder()
{
return $this->builder;
}
}
class HTMLFormFactory extends FormRenderer
{
public function render()
{
$builder = $this->getBuilder();
$html .= '<form>';
print_r($builder->getName());
$html .= '<input ';
foreach ($builder->getName() as $name) {
$html .= 'name="'.$name.'" ';
foreach ($builder->getTypes() as $types) {
$html .= 'type="'.$types.'">';
}
}
$html .= '</form>';
return $html;
}
}
$formBuilder = new FormBuilder();
$formBuilder->addName('test 1');
$formBuilder->addTypes('text');
$formBuilder->addName('test 2');
$formBuilder->addTypes('text');
$formFactory = new HTMLFormFactory($formBuilder);
echo $formFactory->render();
?>
class FormBuilder
{
private $name = array();
private $types = array();
public function addName($element)
{
$this->name[] = $element;
}
public function getName()
{
return $this->name;
}
public function addTypes($type)
{
$this->types[] = $type;
}
public function getTypes()
{
return $this->types;
}
}
class FormRenderer extends FormBuilder
{
private $builder;
public function __construct($builder)
{
$this->setBuilder($builder);
}
public function setBuilder($builder)
{
$this->builder = $builder;
}
public function getBuilder()
{
return $this->builder;
}
}
class HTMLFormFactory extends FormRenderer
{
public function render()
{
$builder = $this->getBuilder();
$html .= '<form>';
print_r($builder->getName());
$html .= '<input ';
foreach ($builder->getName() as $name) {
$html .= 'name="'.$name.'" ';
foreach ($builder->getTypes() as $types) {
$html .= 'type="'.$types.'">';
}
}
$html .= '</form>';
return $html;
}
}
$formBuilder = new FormBuilder();
$formBuilder->addName('test 1');
$formBuilder->addTypes('text');
$formBuilder->addName('test 2');
$formBuilder->addTypes('text');
$formFactory = new HTMLFormFactory($formBuilder);
echo $formFactory->render();
?>
Gewijzigd op 05/11/2012 18:58:08 door Bas D L
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$form = new Form();
$input = new Form_Element_Input('eenveldnaam');
$input->setRequired(true)
->setMinLength(5);
$form->addElements(array($input));
?>
$form = new Form();
$input = new Form_Element_Input('eenveldnaam');
$input->setRequired(true)
->setMinLength(5);
$form->addElements(array($input));
?>
Weet jij hoe ik deze code kan verkleinen? Zie bovenstaande classes
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$formBuilder->addName('test 1');
$formBuilder->addTypes('text');
$formBuilder->addName('test 2');
$formBuilder->addTypes('text');
?>
$formBuilder->addName('test 1');
$formBuilder->addTypes('text');
$formBuilder->addName('test 2');
$formBuilder->addTypes('text');
?>
Gewijzigd op 05/11/2012 19:53:15 door Bas D L
Bo, dat hoort niet gedaan te worden door een Form klasse en ook niet door een FormElement klasse. Daar heb je speciale Validator klassen voor nodig.