有条件地从 CGridView 中删除按钮

remove button from CGridView with condition

您好,我在 yii 中使用 CRUD 生成了 CGridView。如果 appointment_status(CGridView 列之一)值等于 0

,我需要向 CGridView 行添加一个新按钮并隐藏它

这是我的CGridView代码,

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'bookings-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'columns' => array(
        'id',
        'name',
        'email',
        'telephone',
        'time',
        'employee',       
        'appointment_status',
        'client_ip',
        'link' => array(
            'header' => 'Confirmation',
            'type' => 'raw',
            'value' => 'CHtml::button("$data->appointment_status",array("onclick"=>"document.location.href=\'".Yii::app()->controller->createUrl("controller/action",array("id"=>$data->id))."\'"))',
            'visible'=>$data->appointment_status==1,
        ),
        array(
            'class' => 'CButtonColumn',
        ),
    ),
));

但我得到的只是错误说明,

Undefined variable: data

如果有人能研究一下,那将是很大的帮助。

visible 是一个布尔值或一个 PHP 表达式,它将被计算为一个布尔值。在评估期间,$data 被分配给所使用的 dataProvider 中的当前项。 $data 在评估函数 evaluateExpression() 之外不存在。因此,实施应该是:

`visible` => '$data->appointment_status == 1',

您需要在 link 数组中引用可见键的值。所以不是这个:

'visible'=>$data->appointment_status==1

应该是:

 'visible'=>'$data->appointment_status==1'

现在应该可以了。

你会得到未定义的变量,因为visible不允许任何回调。

试试这个解决方案,它是 yii2 代码,我对 Yii 了解不多。

'delete' => function ($url, $model) {
                    return ($model->isVisible($model)) ? 
                    Html::a('<span class="glyphicon glyphicon-trash"></span>', 
                    $url, 
                    ['title' => Yii::t('app', 'Delete')]) : '';

public static function isVisible($data)
{
    return ($data->appointment_status == 1) ? true : false;
}

您的 'visible' 处理列可见性而不是按钮,您可以使用模型上的自定义属性来创建和处理按钮可见性。

添加到您的模型:

public function getConfirmationButton()
{
   if ($data->appointment_status == 1) {
      return CHtml::button($this->appointment_status,array("onclick"=>"document.location.href=\'".Yii::app()->controller->createUrl("controller/action",array("id"=>$this->id))."\'"));
   } else {
      return '';
   }
}

并在您的视图中调用它:

..........
'link' => array(
        'header' => 'Confirmation',
        'type' => 'raw',
        'value' => '$data->confirmationButton',
    ),
...........

你可以这样使用:

 $this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'bookings-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'columns' => array(
        'id',
        'name',
        'email',
        'telephone',
        'time',
        'employee',
        'appointment_status',
        'client_ip',
        'link' => array(
            'header' => 'Confirmation',
            'type' => 'raw',
            'value' => function ($data) {
                if ($data->appointment_status == 1) {
                    return CHtml::button("$data->appointment_status", array("onclick" => "document.location.href=\'" . Yii::app()->controller->createUrl("controller/action", array("id" => $data->id)) . "\'"));
                } else {

                    return;
                }
            }
                ),
                array(
                    'class' => 'CButtonColumn',
                ),
            ),
        ));