1

現在のコントローラーのモデルとの関係が定義されているモデルのコントローラー内でビューを呼び出す方法について、いくつかのガイダンスが必要です。

私の場合、「カタログ」というモデル名があり、これは「アイテム」と呼ばれる別のモデルと HAS_MANY 関係にあります。「カタログ」モデルの「ビュー」ビューで、ユーザーが現在の「カタログ」に「アイテム」を追加できるようにする ajax フォームを表示し、現在の「カタログ」モデルのアイテムをレンダリングしたいと考えています。

理論的には、単一の「アイテム」ビューと作成フォームのレンダリングを担当する個別の「アイテム」コントローラーが必要です。

問題は、私の「カタログ」モデルで定義されたリレーションのおかげで、「カタログ」モデルをロードすると同時にすべてのカタログのアイテムをロードしていることです。しかし、カタログモデル全体を更新せずに現在の「カタログ」の「アイテム」を個別に作成できるようにしたいので、「カタログ」ビューで「アイテム」作成フォームをレンダリングしたいと考えています。また、「カタログ」全体を再度レンダリングすることなく、AJAX で新しく作成された「アイテム」をレンダリングできるように、独立した「アイテム」ビュー アクションが必要です。

「カタログ」「ビュー」ビューで、$catalog->items をループし、それぞれに対して「アイテム」「ビュー」ビューの renderPartial を実行する必要があると考えています。

しかし、特定のコントローラー内で別のコントローラーからのビューを使用することは絶対にできないことを読みました。「アイテム」コントローラーに属する「アイテム」作成フォームをレンダリングする場合も同じですが、「カタログ」「ビュー」ビュー内でレンダリングしたいと考えています。

この場合、例外を設けることは認められますか? これは、「カタログ」「ビュー」ビューで現在行っていることです。

foreach($catalog->items as $item):
  $this->renderPartial('/item/_view', array ( 'item' => $item ) , FALSE, FALSE );

従うべきより良いデザインパターンがあれば教えてください。よろしくお願いします。

ロテール

4

1 に答える 1

1

残念ながら、私はあなたを完全には理解していませんでしたが、モデルにCActiveFormウィジェットの多くのインスタンスを使用しないのはなぜですか?Item

ビューファイル内:

    foreach($catalog->items as $item)
    {
        $form = $this->beginWidget('CActiveForm', array(
           'id'=>"catalog-form-{$item->id}",
           'action'=>"/ajax/item/update/",
           'enableClientValidation'=>true,
           'clientOptions'=>array(
            'validateOnSubmit'=>true,
           ),
        )
        echo CHtml::hiddenField('itemID', $item->id)
        //...
        $this->endWidget();
   );

そして、/ajax/item/update/AR の代わりに DAO を含め、必要なことはすべて実行できます。このフォームからの呼び出しに対して、コントローラーでモデルとの関係を維持する必要は特にありません。

于 2012-08-03T21:55:36.110 に答える