我需要一些关于如何在控制器中调用视图的指导,以获得与当前控制器模型定义关系的模型。
就我而言,我有一个模型名称“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
答案 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模型。