Yii2 ActionColumn 复制图标

Yii2 ActionColumn Duplicating Icons

我正在使用 Yii2 Grid ActionColumn。我的数据库中有一个名为 log_type 的字段,其值为 Risk AssessmentDocumentation 我想做的是仅在 log_typeRisk Assessment 它非常适合我的 PDF 图标。但是对于我的 YesNo 图标。它仅在设置为显示 Risk Assessment 时复制它们如果我将其设置为显示 Documentation 它只会显示 1 个复选标记而不是 2 个。查看代码和屏幕截图:

  <?php
    $gridColumns = [
        [
        'class'=>'kartik\grid\ActionColumn',
        'header'=>'Action',
        'hAlign'=> GridView::ALIGN_CENTER,
        'vAlign'=>GridView::ALIGN_MIDDLE,
        'template'=>'{update}{view}{yes}{no}{pdf}',
        'buttons'=>[
            'pdf'=>function($url, $model){
                if($model->log_type == "Risk Assessment"){
                    return Html::a('<i class = "fa fa-file-pdf-o"></i>',
                    'pdf?id='.$model->id,[
                        'data-pjax'=>'0',
                        'target'=>'blank',
                    ]);
                }
            },
            'yes'=>function($url,$model){
                 return Html::a('<i class = "fa fa-check"</li>');
            }
        ],
        'visibleButtons'=>[
           'yes'=>function($model,$key,$index){
               if($model->log_type === 'Risk Assessment'){
                   return false; // Right here. If I change this to True I get the duplicate icons as shown in the screenshot. 
               }else{
                   return true;
               }
            }
        ],
        'urlCreator'=>function($action, $model, $key, $index){
            if($action === 'view' && $model->log_type === 'Risk Assessment'){
                $url = 'view-risk?id='.$model->id;
                return $url;
            }else if ($action === 'view' && $model->log_type === 'Documentation'){
                $url = 'view?id='.$model->id;
                return $url;
            }
            if($action === 'update' && $model->log_type === 'Risk Assessment'){
                $url = 'update-risk?id='.$model->id;
                return $url;
            }else if($action === 'update' && $model->log_type === 'Documentation'){
                $url = 'update?id='.$model->id;
                return $url;
            }
        }
    ],
    [
        'attribute'=>'id',
        'header' => 'ID',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>false,
    ],
    [
        'attribute'=>'description',
        'header' => 'Description',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'log_type',
        'header' => 'Log Type',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'development_type',
        'header' => 'Development Type',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'platform_type',
        'header' => 'Platform Type',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'security_risk',
        'header' => 'Secuirty Risk',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'comments',
        'header' => 'Comments',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'risk_accepted',
        'header' => 'Risk Accepted',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
    [
        'attribute'=>'approved',
        'header' => 'Approved',
        'hAlign' => GridView::ALIGN_CENTER,
        'vAlign' => GridView::ALIGN_MIDDLE,
        'filter'=>true,
    ],
]
    ?>

重复图标

非重复图标

我试过重现你的问题,但我做不到,但我认为它与这个格式错误的标签有关:

'<i class = "fa fa-check"</li>'

您打开了一个 <i> 标签,但关闭了 <li>。当我使用您的代码时,即使更新了您对重复图标的评论所在的行,我也没有显示任何图标。

您有条件地显示 buttons 上的按钮并同时使用 visibleButtons 属性这一事实也可能存在问题。我认为最好使用一个 另一个,即对内置 viewupdate、[=19= 使用 vibilbeButtons ] 按钮,并在可能的情况下,在 buttons 属性上添加您自己的条件逻辑。 Yii2指南上的例子都是这样做的。

你可以将手动生成的标签更新为使用Kartik icon class生成图标,并将所有逻辑移动到buttons中,将它们都放在同一个地方会更容易维护,它将按预期工作:

'template' => '{update}{view}{yes}{no}{pdf}',
'buttons' => [
    'pdf' => function($url, $model) {
        return $model->log_type == "Risk Assessment" 
            ? Html::a(Icon::show('file-pdf'),
                ['pdf/view', 'id' => $model->id] , [
                'data-pjax'=>'0',
                'target'=>'blank',
            ]) : '';
    },
    'yes' => function($url,$model) {
             return $model->log_type === 'Risk Assessment' 
                 ? Html::a(Icon::show('check'), ['controller/action', 'id' => $model->id]) : '';
    },
    ...
    ],
    'visibleButtons'=>[],
...