addAtributeTo functie OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Randy vsf

Randy vsf

09/03/2015 15:27:12
Quote Anchor link
Hallo mensen,

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

?>


Op deze manier gebruik ik de class:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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());
?>



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
 
PHP hulp

PHP hulp

26/12/2024 10:17:13
 
Ward van der Put
Moderator

Ward van der Put

09/03/2015 15:48:17
Quote Anchor link
Bedoel je HTML-attributen zoals checked en selected?
Dan zou ik daarvoor aparte methoden schrijven.
 
Randy vsf

Randy vsf

09/03/2015 15:54:02
Quote Anchor link
Hallo Ward,

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
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2015 16:05:11
Quote Anchor link
Een formulier bestaat uit formuliervelden.
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
 
Ward van der Put
Moderator

Ward van der Put

09/03/2015 16:09:11
Quote Anchor link
Er is een vuistregel, niet eens zozeer voor OOP maar meer voor programmeren in het algemeen: een methode/functie die meer dan drie argumenten/parameters heeft, doet te veel. Je huidige listing heeft daar ook last van.

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.
 
Randy vsf

Randy vsf

09/03/2015 17:03:25
Quote Anchor link
Beide bedankt voor jullie reactie.
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
 



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.