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

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

【问题讨论】:

    标签: gridview view yii2 detailview


    【解决方案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 ''; }
                }],
              ],
          ])
          ?>
          

          【讨论】:

            猜你喜欢
            • 2016-05-05
            • 1970-01-01
            • 1970-01-01
            • 2016-01-13
            • 1970-01-01
            • 2016-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多