在Yii中,如何调用属于具有使用当前控制器模型定义的HAS_MANY关系的其他模型的视图?

时间:2012-08-03 03:45:08

标签: php templates yii yii-cactiverecord

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

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

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

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

我想在我的“目录”“视图”视图中,我应该遍历$ catalog->项目,并为每个项目执行'item''视图'视图的renderPartial。

但我已经读过,使用给定控制器中另一个控制器的视图绝对不是没有。 同样的事情是渲染'item'创建表单,它属于'item'控制器,但我想在我的'catalog''view'视图中​​呈现。

对这种情况作出例外是否可以接受? 这就是我目前正在做的事情,在我的“目录”“视图”视图中:

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

如果有更好的设计模式我是否应该坚持,请告诉我? 在此先感谢您的帮助。

Lothaire

1 个答案:

答案 0 :(得分: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模型。