simple OOP formulier

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Bas D L

Bas D L

05/11/2012 10:23:42
Quote Anchor link
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
<?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();
?>
Gewijzigd op 05/11/2012 13:53:47 door Bas D L
 
PHP hulp

PHP hulp

23/02/2025 01:11:43
 
Wouter J

Wouter J

05/11/2012 13:51:23
Quote Anchor link
En nu?

Kun je aub 1 code blok verwijderen?
 
Bas D L

Bas D L

05/11/2012 13:54:47
Quote Anchor link
@wouter, done...
 
Wouter J

Wouter J

05/11/2012 13:55:31
Quote Anchor link
En dan nu de eerste vraag, wat moeten we hier mee?
 
Bas D L

Bas D L

05/11/2012 13:59:16
Quote Anchor link
Doordat ik de code heb gewijzigd is mijn vraag verdwenen :-$

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.
 
Wouter J

Wouter J

05/11/2012 14:02:30
Quote Anchor link
Dit is totaal geen OOP, alleen maar een mooie klasse met functies erin.

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.
 
Gerard M

Gerard M

05/11/2012 14:03:24
Quote Anchor link
Interpretaties van OOP kunnen verschillen, maar ik zou zelf van buttons en inputfields ook losse classes maken. Buttons en inputfields kunnen zelfs een gemeenschappelijke superclass delen. Op deze manier zijn alle objecten verantwoordelijk voor hun eigen gedrag.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


Natuurlijk kan je dan van al je HTML tags ook classes maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


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.
 
Bas D L

Bas D L

05/11/2012 14:14:47
Quote Anchor link
@Wouter en Gerard,
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
 
Wouter J

Wouter J

05/11/2012 14:44:48
Quote Anchor link
Bas, al redelijk in de buurt. Als je het globaal neemt zou ik dit zeggen:

- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


In FormBuilder::add() maak je dan gebruik van de InputElement ect. om een element toe te voegen.
 
Bas D L

Bas D L

05/11/2012 14:53:27
Quote Anchor link
@Wouter,

Krijg je dan zo'n klasse-indeling?
class FormRenderHtml
{

}

class FormRenderElement
{
}

class FormBuilder
{
}
 
Wouter J

Wouter J

05/11/2012 15:09:44
Quote Anchor link
Dan ga je werken met overerving. Dat betekend dat 1 klasse alles van de andere klasse bevat, maar dat kan bewerken. Dat doe je met het extends keyword (wat uitbreiden betekend). Bijvoorbeeld:
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
<?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
?>


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)
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
<?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;
    }
}

?>


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
 
Bas D L

Bas D L

05/11/2012 15:17:33
Quote Anchor link
Onderstaand snap ik niet :-(
1. public function __construct(FormBuilder $builder) |--> FormBuilder $builder
2. Waar is de class FormRenderer?
 
Wouter J

Wouter J

05/11/2012 15:21:10
Quote Anchor link
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)
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
<?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)
?>


Quote:
2. Waar is de class FormRenderer?

Dat was een typfout van mij, ik heb het nu aangepast
 
Bas D L

Bas D L

05/11/2012 15:29:11
Quote Anchor link
Dus bij 1. stop je als het ware class a in class b?
Wat ik erg lastig vind is hoe ik dan nu een class FormBuilder moet maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
    }
}
Gewijzigd op 05/11/2012 15:30:43 door Bas D L
 
Wouter J

Wouter J

05/11/2012 15:34:27
Quote Anchor link
Ja, je stopt class A in B en vanuit daar kun je hem gewoon gebruiken. FormBuilder ziet er niet zo uit. Want je stopt nu weer 2 verantwoordelijkheden in elkaar. Welke 3 hadden we nou net?
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().
 
Bas D L

Bas D L

05/11/2012 15:38:36
Quote Anchor link
En hoe doe ik dat laatste?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
array('type','name','value','checked');
 
Wouter J

Wouter J

05/11/2012 15:47:31
Quote Anchor link
Gewoon zoiets:
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
class FormBuilder
{
    private $elements = array();

    // ...

    public function addElement(FormElement $element)
    {

        $this->elements[] = $element;
    }


    public function getElements()
    {

        return $this->elements;
    }
}
 
Bas D L

Bas D L

05/11/2012 15:50:39
Quote Anchor link
@wouter, is het zo hoe het moet?

$formBuilder->addName('test 1');
$formBuilder->addTypes('text');

$formBuilder->addName('test 2');
$formBuilder->addTypes('text');

Hoe kan ik trouwens simpeler maken?

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
<?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();
?>
Gewijzigd op 05/11/2012 18:58:08 door Bas D L
 
Bo Ter Ham

Bo Ter Ham

05/11/2012 19:48:42
Quote Anchor link
Is het niet handig om ook nog validatie in het oog te houden?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
?>
 
Bas D L

Bas D L

05/11/2012 19:52:49
Quote Anchor link
@Bo, helemaal eens.
Weet jij hoe ik deze code kan verkleinen? Zie bovenstaande classes

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$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
 
Wouter J

Wouter J

05/11/2012 19:58:20
Quote Anchor link
Bas, na mijn mening doe je nu toch totaal iets anders als waar we toenet mee geëindigd zijn? De FormBuilder heeft toch geen name en type als eigenschappen? Zijn dat niet de eigenschappen een FormElement?

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.
 

Pagina: 1 2 volgende »



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.