CGridview条件删除按钮

CGridview条件删除按钮,gridview,yii,cgridview,cbuttoncolumn,Gridview,Yii,Cgridview,Cbuttoncolumn,我希望删除按钮仅在cgridviewCButtonColumn中的特定条件下处于活动状态(或创建自定义删除按钮),例如user=='admin'或status=='draft'。有什么想法吗?谢谢 使用“可见”参数- 'buttons'=>array ( 'delete' => array ( 'label'=>'Delete', //other params 'v

我希望删除按钮仅在
cgridview
CButtonColumn
中的特定条件下处于活动状态(或创建自定义删除按钮),例如
user=='admin'
status=='draft'
。有什么想法吗?谢谢

使用“可见”参数-

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),

如果PHP>=5.3,也可以使用匿名函数

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}

正如zuups在Mukesh post中所说,你必须使用单引号!如果状态是模型实例的属性,那么user1584901的答案是正确的。所以

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',
这是正确的。(底部的解释)

我想补充一些你也可以做的有趣的事情。 例如,考虑用户的资产。在这种情况下,我只想将删除按钮添加到没有任何资产的用户

在这种情况下,可以在用户模型中建立关系,例如

'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')
如果用户有资产,则返回1,否则返回0。 并将可见参数定义为

'visible' => '!$data->haveAssets',

所有这些都有效的原因(正如0x7fffffff所要求的那样)是因为Yii使用visible中定义的字符串将其应用于呈现按钮的函数(renderButton)中的evaluateExpression函数

发件人:第337行

在CComponent类中定义的: 第607行

因此,基本上,evaluateExpression函数将提供变量$data(这是所讨论行的模型实例)和$row(所有这些都是通过使用extract函数实现的),并将字符串表达式作为php代码进行求值。因此,任何对$data或$row的提及都将使用evaluteExpression函数在此范围内已经设置的变量。 这就是为什么您可以使用相应行的相应模型实例(如示例中的$data->status或$data->haveAssets)。 请注意,字符串应该是一个返回布尔值以确定按钮可见性的表达式


字符串应该用单引号括起来的原因是,在使用双引号时,php会假定任何以$开头的字符串都是一个变量,并尝试用该变量值替换它。因为,在您的作用域中,$data变量是无意义的(或者可以定义),它将抛出一个错误或错误地替换它。使用单引号可以防止这种行为。

谢谢,它是有效的(如果我在单引号中加上“可见”值:)@Mukesh Soni正确,这是误导。请在您的答案中用引号括住这个表达式,目前它是错误的。这对草稿用例不起作用。参见涉及$data的答案要提高你文章的质量,请包括你的答案为什么/如何解决问题。我认为答案必须是函数($data,$row),而不是函数($row,$data)。
'visible' => '!$data->haveAssets',
protected function renderButton($id,$button,$row,$data)
    {
            if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
                      return;
public function evaluateExpression($_expression_,$_data_=array())
    {
            if(is_string($_expression_))
            {
                    extract($_data_);
                    return eval('return '.$_expression_.';');
            }
            else
            {
                    $_data_[]=$this;
                    return call_user_func_array($_expression_, $_data_);
            }
    }