1

我需要一些关于如何在控制器中为与当前控制器的模型定义了关系的模型调用视图的指导。

就我而言,我有一个模型名称“目录”,它与另一个名为“项目”的模型有 HAS_MANY 关系。在我的“目录”模型的“视图”视图中,我想显示一个 ajax 表单,让用户将“项目”添加到当前的“目录”,并且我想渲染当前的“目录”模型的项目。

理论上,我应该有一个独特的“项目”控制器,他应该负责渲染单个“项目”视图和创建表单。

问题在于,由于我的“目录”模型中定义的关系,我在加载“目录”模型的同时加载了所有目录项。但由于我还希望能够在不更新整个目录模型的情况下为当前“目录”独立创建“项目”,因此我想在“目录”视图中呈现“项目”创建表单。我还需要有一个独立的“项目”视图操作,这样我就可以通过 AJAX 新创建的“项目”进行渲染,而无需再次渲染整个“目录”。

我在想,在我的“目录”“视图”视图中,我应该遍历 $catalog->items 并为每个执行“项目”“视图”视图的渲染部分。

但是我已经读过,在给定的控制器中使用来自另一个控制器的视图是绝对不行的。渲染属于“项目”控制器的“项目”创建表单也是如此,但我想在“目录”“视图”视图中呈现。

是否可以为这种情况破例?在我的“目录”“视图”视图中,这就是我目前正在做的事情:

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/你可以做任何你想做的事情,包括 DAO 而不是 AR。对于来自此表单的任何调用,没有特别需要在控制器中保留关系 btw 模型。

于 2012-08-03T21:55:36.110 回答