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

有帮助吗?

解决方案

使用“可见”参数 -

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

其他提示

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top