CGridview条件删除按钮

时间:2012-02-24 11:28:25

标签: gridview yii cgridview cbuttoncolumn

我希望删除按钮仅在CGgridView CButtonColumn中的某些条件下有效(或制作自定义删除按钮),例如user=='admin'status=='draft'。有任何想法吗?谢谢!

4 个答案:

答案 0 :(得分:19)

使用'visible'参数 -

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

答案 1 :(得分:9)

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'

答案 2 :(得分:6)

如果PHP> = 5.3

,您也可以使用匿名函数
'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}

答案 3 :(得分:3)

正如zuups在Mukesh的帖子所述,你必须使用单引号!在状态是模型实例的属性的情况下,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函数。

来自:https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php第337行

protected function renderButton($id,$button,$row,$data)
    {
            if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
                      return;

在CComponent类中定义: https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php第607行

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_);
            }
    }

所以基本上会发生的事情是evaluateExpression函数将使变量$ data(这是有问题的行的模型实例)和$ row(所有这些通过使用提取函数)并将你的字符串表达式评估为php码。因此,对$ data或$ row的任何提及都将使用此范围内evaluteExpression函数已设置的变量。 这就是为什么你可以使用相应行的相应模型实例(作为$ data-> status,或$ data-> hasAssets来自示例)。 请注意,该字符串应该是一个返回布尔值的表达式,以确定按钮的可见性。

字符串应该是单引号的原因是,在使用双引号时,php会假设以$开头的任何字符串都是变量,并会尝试用该变量值替换它。因为,在你的范围内,$ data变量是无意义的(或者可以被定义),它会抛出错误或误导地替换它。使用单引号可以防止出现此行为。