3

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
   }
 }

今私の問題は、各ラベルのオブジェクトと各入力のオブジェクトが必要なことです。ただし、オブジェクトが必要になる場合がありますまたは他のフォーム要素。それぞれにクラスを用意する代わりに、これを使用する最善の方法は、factory patternを使用することです。

FormBuilder のデザイン パターンとラベル/入力に使用するパターン、またはラベルと入力をラベルまたは入力またはテキストエリアなどとして識別する 1 つのクラスに結合する方法を誰でも提案できますか...

4

2 に答える 2

4

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>
于 2013-03-18T19:27:13.217 に答える
0

これは良さそうに見えますが、動的フォームには役に立ちません。入力が他の入力要素に依存する場所や、ユーザーが新しい要素を動的に追加する場所などの動的フォーム。

ダイナミズムを実現できる要素ごとに個別のクラスが必要です。入力クラスによって拡張される抽象要素クラスが必要です。また、特定の入力オブジェクトとそのラベルを保持するフィールド クラスが必要です。

すぐにコードを送信します.......

于 2014-02-05T13:52:49.403 に答える