【问题标题】:How to get controller name inside CGridView?如何在 CGridView 中获取控制器名称?
【发布时间】:2023-03-14 15:00:01
【问题描述】:

在views中控制器名可以通过$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"]))', 
        ),
    ),
)); 

?>

【问题讨论】:

  • 你试过Yii::app()-&gt;id
  • 我试过了,有一个奇怪的值!
  • 你试试这个'Yii::app()-&gt;createUrl("'.$this-&gt;id.'/update", array("id"=&gt;$data["id"]))'
  • 我试过了,CGridView中的$this是指它的widget。

标签: php gridview yii


【解决方案1】:

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

$this->grid->controller->id

当您位于TbButtonColumn 中时,您可以访问grid 属性(因为TbButtonColumn 扩展自CButtonColumn,而后者又扩展自CGridColumn)以访问TbExtendsGridView(最终扩展自@987654326 @) 依次访问网格的controller 属性(由小部件父级定义),最后获取控制器的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 扩展,只要它们不改变它们扩展的对象的内置行为,以上应该可以正常工作。

【讨论】:

  • 我试过你的解决方案:可恢复的错误 TbExtendedGridView 类的对象无法转换为字符串
  • 嗯,这可能是 eval 双引号内的对象链接问题。有时使用eval() 可能会很棘手。看看它是否适用于我刚刚所做的编辑。
  • 没关系,1-您对答案的编辑是什么? 2-我更喜欢你的答案,因为这是从 gridView 获取控制器名称的正确方法,而我的答案是一种补救措施!
  • @HPM 我将两个网址的-&gt;createUrl("$this-&gt;grid-&gt;controller-&gt;id/update", 更改为-&gt;createUrl($this-&gt;grid-&gt;controller-&gt;id."/update",)。在双引号内链接对象是我怀疑的问题。
【解决方案2】:

问题是 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"]))', 
        ),
    ),
)); 

?>

感谢这篇帖子Getting Current Controller ID in Yii

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多