我有一个显示公司详细信息的视图,并添加了该公司的订单列表(单独的模型和控制器)。一切正常,但用于显示订单列表的CGridView
被呈现(renderPartial()
),因此,CGridView
的默认控制器是company
,而不是order
,这会导致所有自动生成的URL(如更新/删除按钮)无效,因为它们被生成为/company/delete?id=
,并且它们应该引用order
控制器。我通过手动创建操作按钮的URL来解决这个问题,如下所示:
$columns[] = array(
'class' => 'CButtonColumn',
'buttons' => array(
'delete' => array(
'label' => 'Download',
'url' => 'CController::createUrl("/order/delete", array("id"=>$data->id))',
'options' => array('class' => 'download'),
),
),
'template' => '{delete}',
);
但我不喜欢这种方法,因为这需要手动创建每个URL。我尝试设置CGridView
的controller
字段,但它是只读的。我如何修改CGridView
正在使用的默认控制器/模型?
我还看到CGridView
生成了一个隐藏的“keys”div,其中包含元素的ID,这些键的update
URL包含不正确的控制器名称,因此我真的需要以某种方式更改CGridView
正在处理的控制器,因为我不想冒险更新错误控制器中的条目。
编辑我尝试创建一个控制器示例并使用该示例创建小部件:
$ctrl = Yii::app()->createController('order')[0];
$ctrl->widget('zii.widgets.grid.CGridView', $grid);
但是,即使所创建的小部件的所有者属性(只读)是正确的(OrderController
),操作URL仍然是使用实际路径(/company/
)而不是/order/
生成的。
1条答案
按热度按时间bvpmtnay1#
当您使用相对路由(如
delete
)时,Yii将使用当前请求上下文来解析路由。因此,无论使用哪个控制器来渲染widget,Yii::app()->controller
的路由都将被用作相对路由的基础。在这种情况下,您可以做的事情并不多-如果您的小部件不应依赖于上下文,您应该对URL使用绝对路由:
如果您不想在多个地方重复此操作,您可以创建小部件或助手,这将准备
CGridView
设置。