Goede middag,

Ik zelf ben pas een maandje of 5 bezig met OOP

en vroeg ik me af hoe dit er uit ziet



<?php
class Form_Element {
    public $type   = ''; //default
    public $label  = 'label'; //default 

    public function __construct($type) {
        $type = trim($type);
        if($type == 'text' || $type == 'password' || $type == 'button') {          
            $this->type = $type;
            return $this; 
        } else { 
            throw new Exception("kan dit object niet aanmaken, het type:".$type." komt niet overeen met het systeem.");
        }
    }
    public function setLabel($label) {
        $this->label = trim($label);
        return $this;
    }
}

class Form {
    public $form;
    public function addElements($array) {
        if(is_array($array)) {
            if(!empty($array)) {
                $this->form = '<form action="index.php" method="post">'."\r\n";
                foreach ($array as $element) { 
                    switch ($element->type) {
                        case 'text':
                            $this->form .= '<label>'.$element->label.':</label> <input type="text" name="'.strtolower($element->label).'">'."\r\n"; 
                            break;
                            
                        case 'password':
                            $this->form .= '<label>'.$element->label.':</label> <input type="password" name="'.strtolower($element->label).'">'."\r\n";
                            break;

                        case 'button':
                            $this->form .= '<input type="submit" name="submit" value="'.$element->label.'">'."\r\n";
                            break;
                    }
                }
                $this->form .= '</form>';
                    echo $this->form;
            } else {
                throw new Exception("Error: array() is empty.");
            }
        } else {
            throw new Exception("Error: Can't use the addElements, it most be an array() to match the system.");
        }
    }
}



//dit word de code die je voortaan gebruikt voor een fomulier
try {
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
        //post process example: $post = new Form_Post(trim($_POST['username']),sha1($_POST['password']));
        echo'hier komt het process';
    } else {
        $username = new Form_Element('text'); 
        $username->setLabel('Username');
        
        $password = new Form_Element('password'); 
        $password->setLabel('Password');
        
        $button = new Form_Element('button');   
        $button->setLabel('Login');
        
        $form = new Form();
        $form->addElements(array($username,$password,$button));
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
?> 



het is uiteraard nog een klein simpel scriptje die alleen een login fomulier maakt, dit word nog uitgebreid zodat er meer elementen bij komen.

maar ik vroeg me af of het op deze manier goed gaat :)

en of ik dingen anders moet doen.

greetz Rob.
Ik snap eigenlijk niet waarom je op zo'n manier een form wil maken
Crude Oil op 11/09/2011 16:14:34

Ik snap eigenlijk niet waarom je op zo'n manier een form wil maken


geef eens wat meer informatie waarom niet?

graag wil ik dus feedback hebben wat ik anders zou moeten doen

greetz rob
waarom zou je met veel phpcode een form maken, lijkt me niet nuttig. Het is nog veel korter om meteen de htmlcode te gebruiken.
Crude Oil op 11/09/2011 16:28:28

waarom zou je met veel phpcode een form maken, lijkt mme niet nuttig. Het is nog veel korter om meteen de htmlcode te gebruiken.


Niet als je een framework wilt maken.
dan is het wel nuttig zulke opties te hebben.

greetz Rob
Zeg dat dan meteen :P
Crude Oil op 11/09/2011 16:55:09

Zeg dat dan meteen :P


mijn fout :) sorry :)

maar hoe lijkt dit dan kwa opstelling?
Je moet niet direct bij het toevoegen van elementen de HTML gaan renderen. Dan kan er namelijk helemaal niets meer aangepast worden. Gebruik dus een render() of __toString() methode (liefst beide).
Pim - op 12/09/2011 16:56:21

Je moet niet direct bij het toevoegen van elementen de HTML gaan renderen. Dan kan er namelijk helemaal niets meer aangepast worden. Gebruik dus een render() of __toString() methode (liefst beide).


bedankt voor je reactie Pim!


hoe moet ik me dit voorstellen die 2 methode's?
wat doet wat? en hoe zou dit er uit kunnen zien ongeveer?

al vast bedankt

Rob

<?php

class Form {
protected $_elements = array();
public function addElements(array $elements) {
$this->_elements += $elements;
}

public function render() {

$string = '<form action="index.php" method="post">'."\r\n";
foreach ($this->_elements as $element) {
switch ($element->type) {
case 'text':
$string .= '<label>'.$element->label.':</label> <input type="text" name="'.strtolower($element->label).'">'."\r\n";
break;

case 'password':
$string .= '<label>'.$element->label.':</label> <input type="password" name="'.strtolower($element->label).'">'."\r\n";
break;

case 'button':
$string .= '<input type="submit" name="submit" value="'.$element->label.'">'."\r\n";
break;
}
}
$string .= '</form>';
return $this->form;
}

public function __toString() {
return $this->render();
}
}
?>

De volgende stap is dat je de elementen zichzelf laat renderen. Geef Form_Element een abstracte 'render' methode en breidt deze klasse uit voor elk type inputveld (text, pw, button etc). Form#render() wordt dan:

<?php
public function render() {
$string = '<form action="index.php" method="post">'."\r\n";
foreach($this->_elements as $element) {
$string .= $element->render()."\r\n";
}
$string .= '</form>';
return $string;
}
Pim - op 12/09/2011 17:28:49


Bedankt Pim voor deze voorbeeld, ik ga er mee aan de slag
Ik zal als ie klaar is een repost doen

Rob



[size=xsmall]Toevoeging op 13/09/2011 13:43:10:[/size]

ik ben even wezen stoeien met de code maar ik kom even niet uit de abstract render methode dus heb ik de class verlengd met een extends Form_Html


Ik heb de code ondertussen naar dit aangepast:


<?php
class Form_Html {
    protected function getHtmlElement($element) {
        $allow_elements = array('text','password','textarea','button');
        if (in_array($element->type, $allow_elements) === false) { 
            throw new Exception("type:".$element->type." doesn't match the system.");
        } else { 
            if($element->type == 'text')     { return '<label>'.$element->label.'</label> <input type="text" name="'.strtolower($element->label).'">'; }
            if($element->type == 'textarea') { return '<label>'.$element->label.'</label> <textarea name="'.strtolower($element->label).'"></textarea>';  }
            if($element->type == 'password') { return '<label>'.$element->label.'</label> <input type="password" name="'.strtolower($element->label).'">'; }
            if($element->type == 'button')   { return '<input type="submit" value="'.strtolower($element->label).'">'; }
        }
    }
}
class Form_Element {
    public $type   = ''; //default
    public $label  = 'label'; //default 
    
    public function __construct($type) {
        $this->type = trim($type);
        return $this; 
    }
    public function setLabel($label) {
        $this->label = trim($label);
        return $this;
    }
}
class Form extends Form_Html {
    protected $_elements = array();
    public function addElements(array $elements) {
        $this->_elements += $elements;
    }
    private function render() {
        $string = '<form action="#" method="post">'."\r\n";
        foreach($this->_elements as $element) {
            $string .= $this->getHtmlElement($element)."\r\n";
        }
        $string .= '</form>'."\r\n";
        return $string;
    }
    public function draw() {
        return $this->render();
    }
}

try {
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
        echo'hier komt het process';
    } else {
        $username = new Form_Element('text');
        $username->setLabel('Username');
        
        $password = new Form_Element('password');
        $password->setLabel('Password');
        
        $button = new Form_Element('button');
        $button->setLabel('Login');
        
        $form = new Form();
        $form->addElements(array($username,$password,$button));
        echo $form->draw();
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
?>


@Pim: zou je een abstract voorbeeld kunnen geven?

Rob

Reageren