0

在视图中控制器名称可以通过$this->id来实现,但在 CGridView 中 $this->id 评估结果是另一个名称(可能是 gridview 小部件名称)。(1)如何在 cgridview 中获取控制器名称?

我还尝试在调用 CGridview 之前定义一个变量 ($thisCtl = $this->id)。虽然 $thisCtl 有控制器名称,但在 CGridview 评估过程中没有定义它。(2)有没有什么方法可以给CGridView传参数?

<?php 
$thisCtl = $this->id;
$data = $model->search(); 
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
    'id'=>'insurance-grid',
    'dataProvider'=>$model->search(),
    //'filter'=>$model,
    'columns'=>array(
        'id',
        'registeration_date',
        'modification_date',
        array(
            'htmlOptions' => array('nowrap'=>'nowrap'), 
            'class'=>'bootstrap.widgets.TbButtonColumn', 
            'viewButtonUrl'=>'Yii::app()->createUrl("$thisCtl/view", array("id"=>$data["id"]))', 
            'updateButtonUrl'=>'Yii::app()->createUrl("$this->id/update", array("id"=>$data["id"]))', 
        ),
    ),
)); 

?>

4

2 回答 2

1

问题是 CGridView 中的 $this 指的是它的小部件。所以我们应该使用一个全局函数来获取当前的控制器名称:

Yii::app()->getController()->getId();

代码应如下所示:

<?php 
$thisCtl = $this->id;
$data = $model->search(); 
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
    'id'=>'insurance-grid',
    'dataProvider'=>$model->search(),
    //'filter'=>$model,
    'columns'=>array(
        'id',
        'registeration_date',
        'modification_date',
        array(
            'htmlOptions' => array('nowrap'=>'nowrap'), 
            'class'=>'bootstrap.widgets.TbButtonColumn', 
            'viewButtonUrl'=>'Yii::app()->createUrl("'.Yii::app()->getController()->getId().'/view", array("id"=>$data["id"]))', 
            'updateButtonUrl'=>'Yii::app()->createUrl("'.Yii::app()->getController()->getId().'/update", array("id"=>$data["id"]))', 
        ),
    ),
)); 

?>

感谢这篇文章在 Yii 中获取当前控制器 ID

于 2013-04-21T11:14:27.490 回答
1

由于您似乎希望在列值中使用控制器值,您可以执行以下操作来获取控制器名称:

$this->grid->controller->id

当您在TbButtonColumn中时,您可以访问网格属性(因为 TbButtonColumn 从CButtonColumn扩展,而CButtonColumn又从 CGridColumn扩展)以访问TbExtendsGridView(最终从CGridView扩展),您又可以在其中访问网格的控制器属性(其中由小部件父级定义),最后是控制器的get id

然后,假设您的所有其他代码都是正确的,您可以像这样指定您的 gridview:

<?php 
$data = $model->search(); 
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
    'id'=>'insurance-grid',
    'dataProvider'=>$model->search(),
    //'filter'=>$model,
    'columns'=>array(
        'id',
        'registeration_date',
        'modification_date',
        array(
            'htmlOptions' => array('nowrap'=>'nowrap'), 
            'class'=>'bootstrap.widgets.TbButtonColumn', 
            'viewButtonUrl'=>'Yii::app()->createUrl($this->grid->controller->id."/view", array("id"=>$data["id"]))', 
            'updateButtonUrl'=>'Yii::app()->createUrl($this->grid->controller->id."/update", array("id"=>$data["id"]))', 
        ),
    ),
));

我自己没有使用任何Tb扩展,只要它们没有改变它们扩展的对象的内置行为,以上应该可以按需要工作。

于 2013-04-21T15:13:21.777 回答