2013-03-18 75 views
1

我不想使用已经完成的在PHP中构建表单的库。我想用自己的设计模式写自己的作品。我新设计模式,所以我需要知道哪种设计模式最适合在PHP中动态构建表单。使用哪种设计模式动态构建表单。 PHP

例如到目前为止,我得到的东西,如:

class FormBuilder { 
    private $formName; 
    private $formAttributes; //array('ID' => ?, 'Classes' => array(?,?) ... 
    private $formStyle; //Css styling of form 
    private Label $labels; //a collection of label objects holding bunch labels 
    private Input $inputs; //a collection of input objects holding bunch inputs 

    /* constructor to initialize everything */ 


    /* GET/SET methods for each of the above private variables */ 

    .... 

    public function generateHTML() { 
     //takes above information and builds HTML and returns html 
    } 
} 

我现在的问题是,我需要为每个标签的对象,并为每个输入的对象。 Howerver我可能需要有一个对象或其他表单元素。最好的办法是用这个代替每个班都会使用工厂模式

任何人都可以建议FormBuilder和图案设计模式用于标签/输入或如何标签和输入合并成一个类标识为标签或输入或文本域等等

+0

为什么要为标签和输入使用不同的类?您可以简单地在输入对象上设置“标签”属性。您只需在呈现控件及其相关标签时使用该属性。 – 2013-03-18 19:01:40

+0

我想将Input,Label,TextArea和其他表单元素类合并为一个,这样我就不必有束类。不知道要使用哪种模式 – GGio 2013-03-18 19:04:02

+1

由于您在问题中提到了“构建表单”。最好的设计模式将是建设者模式http://sourcemaking.com/design_patterns/builder/php/1#code – Bart 2013-03-18 19:16:30

回答

3

您可以使用建造者模式。
http://sourcemaking.com/design_patterns/builder/php/1#code

这里是一个非常简单的例子。

<?php 

class FormBuilder 
{ 
    private $elements = array(); 

    public function label($text) { 
     $this->elements[] = "<label>$text</label>"; 
     return $this; 
    } 

    public function input($type, $name, $value = '') { 
     $this->elements[] = "<input type=\"$type\" name=\"$name\" value=\"$value\" />"; 
     return $this; 
    } 

    public function textarea($name, $value = '') { 
     $this->elements[] = "<textarea name=\"$name\">$value</textarea>"; 
     return $this; 
    } 

    public function __toString() { 
     return join("\n", $this->elements); 
    } 
} 

$b = new FormBuilder(); 
echo $b->label('Name')->input('text', 'name')->textarea('message', 'My message...'); 

输出

<label>Name</label> 
<input type="text" name="name" value="" /> 
<textarea name="message">My message...</textarea> 
+0

看起来不错,我会试试看,谢谢 – GGio 2013-03-18 19:33:13

0

这看起来不错,但是这不会成为动态表单帮助。动态表单就像输入依赖于其他输入元素或用户动态添加新元素一样。

每个元素都应该有独立的类,通过它可以实现活力。应该有一个由输入类扩展的抽象元素类。另外,应该有一个包含特定输入对象和标签的字段类。

即将发送代码.......