Yii CGridView更改控制器名称(用于生成url)

vlf7wbxs  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个显示公司详细信息的视图,并添加了该公司的订单列表(单独的模型和控制器)。一切正常,但用于显示订单列表的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。我尝试设置CGridViewcontroller字段,但它是只读的。我如何修改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/生成的。

bvpmtnay

bvpmtnay1#

当您使用相对路由(如delete)时,Yii将使用当前请求上下文来解析路由。因此,无论使用哪个控制器来渲染widget,Yii::app()->controller的路由都将被用作相对路由的基础。
在这种情况下,您可以做的事情并不多-如果您的小部件不应依赖于上下文,您应该对URL使用绝对路由:

[
    'class' => 'CButtonColumn',
    'deleteButtonUrl' => 'Yii::app()->controller->createUrl("/order/delete",array("id"=>$data->primaryKey))',
    // ...
],

如果您不想在多个地方重复此操作,您可以创建小部件或助手,这将准备CGridView设置。

相关问题