Form creator

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donny Wie weet

Donny Wie weet

18/10/2013 00:39:15
Quote Anchor link
Goede nacht,

Ik wou een gemakkelijke manier om velden toe te voegen aan mijn script. Iets dat snel en efficient werkt.

Ik heb de volgende code, willen jullie deze voor mij beoordelen?

Groeten, Donny

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

    function createForm($types){
        $result = '';
        $type = explode(',',$types);
        $labelstart = '<label class="labelform">';
        $labelend = '</label>';
        $divstart = '<div class="inputholder">';
        $divend = '</div>';
        foreach($type AS $resultaat){
            if ($resultaat == 1) $result .= $labelstart.'Username'.$labelend.$divstart.'<input type="text" name="username">'.$divend;
            if ($resultaat == 2) $result .= $labelstart.'Password'.$labelend.$divstart.'<input type="text" name="password">'.$divend;
            if ($resultaat == 3) $result .= $labelstart.'Pass repeat'.$labelend.$divstart.'<input type="text" name="passwordr">'.$divend;
            if ($resultaat == 4) $result .= $labelstart.'Email'.$labelend.$divstart.'<input type="text" name="email">'.$divend;
            if ($resultaat == 5) $result .= $labelstart.'Overige'.$labelend.$divstart.'<input type="text" name="overige">'.$divend;
        }


        return $result;
    }


    echo createForm('1,2,4,5');

    ?>


Toevoeging op 18/10/2013 01:03:48:

Zo kan ik bijvoorbeeld voor een account aanmaken createForm('1,2') gebruiken, en voor registreren 1 t/m 5.

Verschillende account registraties zijn mogelijk dus kan het dan snel opvragen zonder al te veel code.

Toevoeging op 18/10/2013 01:31:41:

Ik heb ook een FormCreator in OOP gemaakt, ook daar hoor ik graag de meningen over. Het werkt wel veel makkelijker dan de eerste methode:

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
<?php
class FormBuilder {
    private $inputTpe;
    private $inputName;
    private $inputDescription;
    private $finished;
    private $all;
    private $formMethod;
    private $formAction;
    private $formId;
    private $labelPrefix;
    private $labelSuffix;

    public function __construct($id, $method, $url){
        $this->formId         = $id;
        $this->formMethod     = $method;
        $this->formAction     = $url;
    }


    public function startForm(){
        return '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
    }


    public function append($omschrijving, $type, $name){
        $this->inputType             = $type;
        $this->inputName             = $name;
        $this->inputDescription     = $omschrijving;
        $this->all[]                 = '<label for="'.$this->inputName.'">'.$this->inputDescription.'</label><input type="'.$this->inputType.'">';
    }


    public function allFields(){
        foreach ($this->all AS $result){
            echo $result;
        }
    }
}


$class = new FormBuilder('login-form', 'post', 'index.php');
echo $class->startForm();
echo $class->append('Uw gebruikersnaam', 'text', 'username');
echo $class->append('Uw wachtwoord', 'password', 'username');
echo $class->allFields();




?>
Gewijzigd op 18/10/2013 02:52:23 door Donny Wie weet
 
PHP hulp

PHP hulp

17/11/2024 22:50:36
 
Reshad F

Reshad F

18/10/2013 10:21:19
Quote Anchor link
Kijk is hoe een groot framework dit doet als Zend
 
Jeroen Kwakkel

Jeroen Kwakkel

18/10/2013 10:23:00
Quote Anchor link
Ik zou de constructor veranderen naar dit

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
    public function __construct($id, $method, $url){        
        $this->formId         = $id;
        $this->formMethod     = $method;
        $this->formAction     = $url;
          
        if($method == "get" || $method == "post")
            $this->all[] = '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
        else
            throw new Exception("Moet GET of POST zijn");
    }


Even controleren of de waarde wel echt een get of post is. Als je later een keer pot ipv post invoert dan hoe je niet uren bezig te zijn om uit te puzzelen waarom je form niet werkt ;) Ik heb

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';


in de constructor gezet. Het komt als eerst in de array. Hierdoor wordt hij ook als eerst uitgeprint bij allFields(). Dan hoef je niet constant eerst ->startForm(); te gebruiken.

Als laatste zou je de eerste functie in je bericht kunnen verwerken in je class. Hiervoor moet append wel aangepast worden om dezelfde functionaliteit te hebben.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
   public function append($omschrijving, $type, $name, $labelClass = "", $divClass = ""){
        $this->inputType             = $type;
        $this->inputName             = $name;
        $this->inputDescription     = $omschrijving;
        $this->all[]                 = '<label '.$labelClass.' for="'.$this->inputName.'">'.$this->inputDescription.'</label><div '.$divClass.' ><input name="'.$this->inputName.'" type="'.$this->inputType.'"></input></div>';
    }


De append functie heeft dan nu twee optionele waardes. En de input heeft altijd een <div> om zich heen. De methode createStandard wordt dan dit

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
    function createStandard($types, $labelClass, $divClass){
        $type = explode(',',$types);
        $labelstart = 'class="'.$labelClass.'"';
        $divstart = 'class="'.$divClass.'"';
        foreach($type AS $resultaat){
            if ($resultaat == 1) $this->append("Username", "text", "username", $labelstart, $divstart);
            if ($resultaat == 2) $this->append("Password", "text", "password", $labelstart, $divstart);
            if ($resultaat == 3) $this->append("Pass repeat", "text", "passwordr", $labelstart, $divstart);
            if ($resultaat == 4) $this->append("Email", "text", "email", $labelstart, $divstart);
            if ($resultaat == 5) $this->append("Overige", "text", "overige", $labelstart, $divstart);
        }
     }
Gewijzigd op 18/10/2013 10:24:25 door Jeroen Kwakkel
 
Donny Wie weet

Donny Wie weet

18/10/2013 12:10:25
Quote Anchor link
@reshad: ik ben bezig met het leren van OOP. Een framework gebruiken is nog niet voor mij weg gelegd, daarnaast leer ik er niks van.

@jeroen: voorbeeld 1 was structureel PHP. Aangezien mijn class bijna goed was, kan ik die dus eventueel gebruiken. En dat over de POST waarde: thanks for the tip!
 
Reshad F

Reshad F

18/10/2013 12:32:24
Quote Anchor link
@Dan moet je mijn eerste post toch echt even goed lezen want ik heb niks gezegd over "gebruiken" maar ik zei KIJK hoe een groot framework het doet om er van te leren. En als je ziet hoe een framework dingen oplost creeer je hierdoor een bepaalde logica voor jezelf wat nou doorgaans moet/kan met OOP en wat doorgaans de best practice is wanneer je een klasse schrijft.
 
Wouter J

Wouter J

18/10/2013 12:51:23
Quote Anchor link
Oké, ik heb hier nog niet de goede OO implementatie gezien. In OO moet een klasse maar 1 verantwoordelijkheid hebben, zodra je het woordje "en" gebruikt in de beschrijving wat een klasse doet moet je daarvoor 2 klassen maken.

In dit geval zal ik het heel mooi gaan maken en het form op splitten in 3 verschillende klassen:
- Form
- FormInputInterface (TextInput, DateInput, ...)
- FormBuilderInterface (HtmlFormBuilder, Html5FormBuilder, ...)

De Form klasse houdt alle inputs voor 1 form vast, de FormInput representateerd 1 input en de FormBuilder maakt vervolgens het form.

In de symfony form component, vaak aangeduid als de meest mooie form component (echt mooi zijn ze nog steeds niet), is die FormInputInterface weggehaald. Ipv daarvan hebben ze elk input ook een form gemaakt. Neem nou dit simpele formpje:
Afbeelding

Die bestaat uit deze form elementen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
                                            +----------------+
                                            |New Product:form|
                                            +----------------+

+---------+  +----------+  +----------------+  +---------------+  +-------------+  +---------------------+
|Name:text|  |Price:text|  |Released on:date|  |Category:choice|  |Rating:number|  |Discontinued:checkbox|
+---------+  +----------+  +----------------+  +---------------+  +-------------+  +---------------------+

Vervolgens bestaat het date form type weer uit wat elementen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
            +----------------+
            |Released on:date|
            +----------------+

+-----------+  +------------+  +----------+
|year:choice|  |month:choice|  |day:choice|
+-----------+  +------------+  +----------+
 
Donny Wie weet

Donny Wie weet

18/10/2013 15:50:41
Quote Anchor link
@wouter:

Als ik het goed begrijp is het dan:

class Form {

}

class InputField extend Form {

}

class Checkbox extend Form {

}



begrijp ik dat goed?
 
Wouter J

Wouter J

18/10/2013 15:52:18
Quote Anchor link
Exact, alles is een form.

En dan heb je functies als add(Child) waardoor je fields aan je form kan toevoegen.
 
Donny Wie weet

Donny Wie weet

18/10/2013 16:04:02
Quote Anchor link
Dank je.

Nog een vraag:

class Form {
//Een public var voor het formulier
//Formulier maken: __construct
}

class InputField extends Form {
//een private var omdat je hier alleen maar de var in de inputfield class gebruikt.

}

class Checkbox extends Form {

}

class weergeefForm extends Form {

}

Is mijn indeling zo goed?

Toevoeging op 18/10/2013 16:06:43:

@reshad, sorry, begreep je verkeerd, en ik ga er zeker even naar kijken
 



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.