0

我有一个显示公司详细信息的视图,我添加了该公司的订单列表(单独的模型和控制器)。一切正常,但是CGridView用于显示订单列表的 是renderPartial()从公司的控制器呈现 ( ) 的,因此,默认控制器CGridViewcompany而不是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。我尝试设置 的controller字段CGridView,但它是只读的。如何修改正在使用的默认控制器/模型CGridView

我还看到它CGridView生成了一个带有元素 ID 的隐藏“键”div,并且这些键的updateURL 的控制器名称不正确,所以我真的需要以某种方式更改控制器CGridView正在工作,因为我不想冒险更新条目在错误的控制器中。

编辑 我尝试创建控制器的实例并使用该实例来创建小部件:

$ctrl = Yii::app()->createController('order')[0];
$ctrl->widget('zii.widgets.grid.CGridView', $grid);

但是即使创建的小部件的所有者属性(只读)是好的(OrderController),仍然使用实际路径(/company/)而不是/order/.

4

1 回答 1

0

当你使用相对路由(如delete)时,Yii 将使用当前请求上下文来解析路由。因此,使用哪个控制器来渲染小部件并不重要,路由Yii::app()->controller将用作相对路由的基础。

在这种情况下,您无能为力 - 如果您的小部件不应该依赖于上下文,您应该对 URL 使用绝对路由:

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

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

于 2019-04-18T08:55:31.490 回答