【问题标题】:CGridview conditional delete buttonCGridview 条件删除按钮
【发布时间】:2012-03-14 20:35:42
【问题描述】:

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

【问题讨论】:

    标签: gridview yii cgridview cbuttoncolumn


    【解决方案1】:

    使用“可见”参数 -

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

    【讨论】:

    • 谢谢,它有效(如果我将“可见”值放在单引号中:)
    • @Mukesh Soni 对,这是误导。请在您的答案中为该表达式加上引号,目前它是错误的
    • 这不适用于草稿用例。查看涉及 $data 的答案
    【解决方案2】:
    'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
    

    【讨论】:

    • 为提高您的帖子质量,请说明您的答案为何/如何解决问题。
    【解决方案3】:

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

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

    【讨论】:

    • 我认为一定是函数($data, $row) 而不是函数($row, $data)。
    【解决方案4】:

    正如 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 变量是没有意义的(或者可以被定义),它会抛出一个错误或者误导性地替换它。使用单引号可以防止出现这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多