2011-04-07 9 views
1

私は現在、3つの選択フィールドを設定するために、dbから3種類のエンティティを取得するコードをコントローラに持っています。コントローラはまた、フォームオブジェクトのvalidateメソッドを呼び出す責任を負い、成功すると、データマッパー上のフォーム入力および呼び出しからエンティティのプロパティをインスタンス化して設定し、それを永続化します。私はコントローラがあまりにも太っていると感じています。フォームの準備と処理コードをどこに置くべきかに関する提案はありますか?それをフォームオブジェクトに移動する必要がありますか? Thxはあなたの時間のために事前に!Zend_Form/MVC、どこで準備と処理が行われるべきですか?

答えて

1

フォーム処理をフォーム自体に置くことをお勧めします。したがって、フォームにprocess()メソッドを作成すると、すべてのフォームロジックをフォームオブジェクトにカプセル化しておくことができます。お使いのコントローラで例えば

$form = myForumClass(); 
... 
$form.process(); 
+0

ねえダニエル、応答のためのTHX。あなたのフォーム処理は、関連するモデルのプロパティを設定し、それらを永続させる責任も負いますか? – blacktie24

+0

はい、フォームが移植可能です。すべてのフォームロジックが個々のフォームクラスに含まれていることを認識して、複数のページにロードされたフォームを簡単に変更できます。 – danielrsmith

1

あなたはマシューウェアーO'PhinneyによってUsing Zend_Form in Your Modelsを見てみたいことがあります。この種のロジックをコントローラからモデルに移動する方法について説明します。データベースのテーブルについては

+0

こんにちはVika、私はあなたの応答を感謝します。あなたがリンクしたその記事を読んでいます。私に関係することは、作者がsave()のようなモデルメソッドを持っていることです。私は一般的なコンセンサスは、モデルは永続性の手段について何も考えてはならないと思ったのですか? – blacktie24

0

あなたはモデルを作成する必要があります - これらは取得し、そのテーブルにデータを設定するためのロジックを含める必要があります。したがって、この例では、モデルは配列の値を取得し、コントローラに渡された後にフォームに渡されます。

あなたは、あなたのコントローラに

$model = new MyModel(); 

$element->addMultiOptions($model->getSelectArray()); 

これを行うあなたはまた、この後、任意のコントローラから呼び出されると、同じフォームを返すことができ、Zend_Formを拡張し、特定のフォームクラスを作成することができますすることができます

class MyModel 
{ 
    public function getSelectArray() 
    { 
     //Get stuff from Db here and format into an array ready to add to the form 
    } 
} 

- あなたを許しますフォームをどこでも簡単に再利用する - 例えばMy Profileページのように登録ページに同じフォームが必要な場合があります。下記の例として

は、単にこれを行うには私のモデルからの関数である。

public function getSelectArray() 
{ 
    $select = $this->select()->order(array("name ASC")); 

    $categories = $select->query()->fetchAll(); 

    $return = array(); 

    foreach($categories as $category) 
     $return[$category['id']] = $category['name']; 

    return $return; 
} 
関連する問題