Yii2:在 GridView 和 DetailView 中删除空值的“(未设置)”

Posted

技术标签:

【中文标题】Yii2:在 GridView 和 DetailView 中删除空值的“(未设置)”【英文标题】:Yii2: Remove "(not set)" in GridView and DetailView for null values 【发布时间】:2015-08-11 02:19:08 【问题描述】:

如何删除或替换 GridView 和 ListView 中的字符串 (not set)

【问题讨论】:

【参考方案1】:

我知道的两种方式(现在):

格式化程序

将nullDisplay of Formatter 设置为非空值。您可以在全局配置中或为单个 GridView 或 DetailView 执行此操作。

全局(通常在config/web.php<application>/config/main.php 文件中):

'components' => [
    ...
    'formatter' => [
        'class' => 'yii\i18n\Formatter',
        'nullDisplay' => '',
    ],
    ...
],

在某些 GridView 中(与 DetailView 相同):

<?= GridView::widget([
    'dataProvider' => $myProvider,
    'formatter' => ['class' => 'yii\i18n\Formatter','nullDisplay' => ''],
    'columns'      => [
        ...
    ],
]); ?>

设置值

可能没有那么优雅。在某个GridView中:

<?= GridView::widget([
    'dataProvider' => $myProvider,
    'columns'      => [
        ...
        [
            'attribute' => 'some_attribute',
            'format'    => 'raw',
            'value'     => function (ModelClass $model) 
                if ($model->some_attribute != null) 
                    return $model->some_attribute; 
              //or: return html::encode($model->some_attribute)
                 else 
                    return '';
                
            ,
        ],
        ...
    ],
]); ?>

或者在某个DetailView中:

<?= DetailView::widget([
    'model'      => $model,
    'attributes' => [
        ...
        [
            'attribute' => 'some_attribute',
            'value' => $model->some_attribute != null ? $model->some_attribute : '', 
      //or: 'value' => $model->some_attribute != null ? Html::encode($model->some_attribute) : '',
        ],
        ...
    ],
]) ?>

两个提示

如果同时使用多种方法:设置值(直接或通过函数)会覆盖 Grid/DetailView 的格式化程序配置,进而覆盖全局格式化程序配置。

您还可以定义与空字符串不同的内容。例如。如果使用引导程序,您可能需要使用\yii\bootstrap\Html::icon('question-sign')(或'&lt;span class="glyphicon glyphicon-question-sign"&gt;&lt;/span&gt;')来获取缺失值的符号。

【讨论】:

【参考方案2】:

我不建议设置 nullDisplay 方法。检查您访问的变量是否为空是最实用的。

我愿意

//model code
public function getProjectName()

    $project = $this->project;
    return ($project) ? $project->name : '';


//your gridview
<?= GridView::widget([
'dataProvider' => $myProvider,
'columns'      => [
    ...
    [
        'attribute' => 'some_attribute',
        'format'    => 'raw',
        'value'     => function (ModelClass $model) 
             $model->projectName;
        ,
    ],
    ...
],
 ]); ?>

【讨论】:

为什么将每个项目检查为空比将格式化程序设置为空要好。解释【参考方案3】:

在 gridview 配置中设置空单元格:

<?= GridView::widget([
  'dataProvider' => $dataProvider,
  'filterModel' => $searchModel,
  'emptyCell'=>'-',
  'columns' => [
      ['class' => 'yii\grid\SerialColumn'],
.........
      ['class' => 'yii\grid\ActionColumn'],
  ],
 ]); ?>

或在:

  'attribute' => 'description',
  'label' => Yii::t('app', 'description'),
  'value' => function($data) 
         return !empty($data->description) ? $data->description : '-';
   

【讨论】:

这是不对的。正如文档所说,emptyCell 是在没有返回任何内容时显示。【参考方案4】:

kartik\grid\GridView;

'class' => 'kartik\grid\EditableColumn',
'attribute'=>'myAttribute',
'header' => 'myHeader',                                            
'editableOptions' => [                         
    'inputType' => \kartik\editable\Editable::INPUT_TEXT,
    'valueIfNull' => '-',

/**
 * @var string the value to be displayed. If not set, this will default to the attribute value. If the attribute
 * value is null, then this will display the value as set in [[valueIfNull]].
 */
public $displayValue;

【讨论】:

【参考方案5】:

使用这个:

use Yii;

...

Yii::$app->formatter->nullDisplay = 'N\A';

【讨论】:

【参考方案6】:

对于 DetailView 和 GridView,我在列中使用 if else

详细视图:

<?= DetailView::widget([
   'model' => $model,
   'attributes' => [
      ['label' => 'labelName', 'value' => function($data) 
         if (!empty($data->tDeal->DealDate))  
            return $data->tDeal->DealDate; 
          else  return ''; 
      ],
    ],
])
?>

网格视图:

<?= GridView::widget([
   'dataProvider' => $dataProvider,
   'columns' => [
      ['label' => 'labelName', 'value' => function($data) 
         if (!empty($data->tDeal->DealDate))  
            return $data->tDeal->DealDate; 
          else  return ''; 
      ],
    ],
])
?>

【讨论】:

以上是关于Yii2:在 GridView 和 DetailView 中删除空值的“(未设置)”的主要内容,如果未能解决你的问题,请参考以下文章

Yii2:在 GridView 和 DetailView 中删除空值的“(未设置)”

Yii2- 一个 GridView 中来自两个模型的数据

Yii2 - Gridview 播放下一首歌曲

在Yii2 gridview中禁用分页

Yii2 GridView 按年份过滤日期

如何在 GridView::widget、Yii2 的搜索框中使用简单的下拉列表?