我不想使用在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的设计模式和用于Label / Input的模式,或者如何将Label和Input组合成一个类,将其标识为标签或输入或textarea等...
答案 0 :(得分:3)
您可以使用Builder模式。
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>
答案 1 :(得分:0)
这看起来不错,但这对动态表单没有帮助。动态表单,例如输入依赖于其他输入元素或用户动态添加新元素。
每个元素都应该有单独的类,通过它可以实现动态。应该有一个由输入类扩展的抽象元素类。此外,应该有一个字段类,它包含一个特定的输入对象及其标签。
即将发送代码.......