10

我希望删除按钮仅在某些条件下处于活动状态CGgridView CButtonColumn(或制作自定义删除按钮),例如 ifuser=='admin'status=='draft'. 有任何想法吗?谢谢!

4

4 回答 4

19

使用“可见”参数 -

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),
于 2012-02-24T16:02:30.647 回答
9
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
于 2012-08-08T08:43:02.000 回答
6

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

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
于 2012-02-24T23:24:37.573 回答
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 使用可见中定义的字符串将其应用于呈现按钮的函数(renderButton)内的评估表达式函数。

来自: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 (所有这些都通过使用 extract 函数)可用,并将您的字符串表达式评估为 php 代码。因此,对 $data 或 $row 的任何提及都将使用 evaluteExpression 函数在此范围内已设置的变量。这就是为什么您可以使用相应行的相应模型实例(如示例中的 $data->status 或 $data->haveAssets)。请注意,字符串应该是一个表达式,它返回一个布尔值以确定按钮的可见性。

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

于 2013-12-19T17:05:55.890 回答