我想在Yii2列表视图中显示列数据

我想在Yii2列表视图中显示列数据,yii2,Yii2,我试图在listview中显示我的表列数据,但它不起作用。在gridview中,允许插入字段名称。我不能在listview中执行此操作吗 我试试这个代码 $feedbackFound = new SqlDataProvider([ 'sql'=> "SELECT * FROM feedback WHERE module_id='$tutorModule->id'", ]); ListView::widget([ 'dataProvid

我试图在listview中显示我的表列数据,但它不起作用。在gridview中,允许插入字段名称。我不能在listview中执行此操作吗

我试试这个代码

$feedbackFound = new SqlDataProvider([
    'sql'=> "SELECT * FROM feedback WHERE module_id='$tutorModule->id'",
]);

ListView::widget([
                    'dataProvider' => $feedbackFound,
                    //'filterModel' => $searchModel,
                    'itemView' => [
                        'PositiveComment',
                        'GoodAt',
                        'MakeMost',

                        //['class' => 'yii\grid\ActionColumn'],
                    ],
            ]);

ListView不像gridview那样具有奇特的处理方式——它接收数据并将其传递给视图,为您提供了一些便利项(分页、排序、筛选等)


方便物品的展示和使用由您决定
itemView
与gridview的
columns
键不同。它应该是一个局部视图(即您创建的php文件或回调),因此您需要定义该局部视图。这使您能够灵活地显示数据模型中的每个项目,但需要做一些工作

考虑这段代码,它在三列中从左到右、从上到下显示项目。此代码使用以下引导css类:
col sm-?
row
来生成正确的网格

$columns = 3;
$cl = 12 / $columns;

echo ListView::widget([
        'dataProvider' => $dataProvider,
        'layout'       => '{items}{pager}',
        'itemOptions'  => ['class' => "col-sm-$cl"],
        'itemView'     => '_view_list_item',
        'options'      => ['class' => 'grid-list-view' ],
        'beforeItem'   => function ($model, $key, $index, $widget) use ($columns) {
            if ( $index % $columns == 0 ) {
                return "<div class='row'>";
            }
        },

        'afterItem' => function ($model, $key, $index, $widget) use ($columns) {
            if ( $index != 0 && $index % ($columns - 1) == 0 ) {
                return "</div>";
            }
        }
]);

if ( $dataProvider->totalCount % $columns != 0 ) {
    echo "</div>";
}
$columns=3;
$cl=12/$columns;
echo ListView::小部件([
“dataProvider”=>$dataProvider,
'布局'=>'{items}{pager}',
'项目选项'=>['class'=>“列sm-$cl”],
“项目视图”=>“\u视图\u列表\u项目”,
'选项'=>['class'=>'网格列表视图'],
“beforeItem”=>函数($model、$key、$index、$widget)使用($columns){
如果($index%$columns==0){
返回“”;
}
},
'afterItem'=>函数($model、$key、$index、$widget)使用($columns){
如果($index!=0&&$index%($columns-1)==0){
返回“”;
}
}
]);
如果($dataProvider->totalCount%$columns!=0){
回声“;
}

不幸的是,sim卡的答案对我不起作用,这就是为什么我对它做了一些修改:

$colsCount = 4;
echo ListView::widget([
    'dataProvider' => $itemDataProvider,
    'layout' => '{items}{pager}',
    'options' => ['class' => 'TOP_CLASS_HERE'],
    'itemOptions'  => ['class' => "ITEM_CLASS_HERE"],
    'beforeItem' => function ($model, $key, $index, $widget) use ($colsCount) {
        if ($index % $colsCount === 0) {
            return "<div class='row'>";
        }
    },
    'itemView' => function ($model, $key, $index, $widget) {
        return $this->render('@frontend/views/item/_card.php', ['item' => $model]);
    },
    'afterItem' => function ($model, $key, $index, $widget) use ($colsCount) {
        $content = '';
        if (($index > 0) && ($index % $colsCount === $colsCount - 1)) {
            $content .= "</div>";
        }
        return $content;
    },
]);
if ($itemDataProvider->count % $colsCount !== 0) {
    echo "</div>";
}
$colscont=4;
echo ListView::小部件([
“dataProvider”=>$itemDataProvider,
'布局'=>'{items}{pager}',
“选项”=>[“类”=>“顶级类”],
'itemOptions'=>['class'=>“此处的项目类别”],
“beforeItem”=>函数($model、$key、$index、$widget)使用($colscont){
如果($index%$colscont==0){
返回“”;
}
},
“itemView”=>函数($model、$key、$index、$widget){
返回$this->render('@frontend/views/item/_card.php',['item'=>$model]);
},
“afterItem”=>函数($model、$key、$index、$widget)使用($colscont){
$content='';
如果(($index>0)和($index%$colscont====$colscont-1)){
$content.=”;
}
返回$content;
},
]);
如果($itemDataProvider->count%$colsCount!==0){
回声“;
}

我在大量数据上进行了测试,效果非常好。我喜欢这个解决方案,希望它能帮助别人。

这个变体不适用于\yii\bootstrap\Tabs和分页,因为代码总是插入div:

//if ( $dataProvider->totalCount % $columns != 0 ) {
//    echo "</div>";
//}
//如果($dataProvider->totalCount%$columns!=0){
//回声“;
//}
此变体使用\yii\bootstrap\Tabs和分页:

if ( $dataProvider->totalCount % $columns != 0 ) {
    if ($dataProvider->pagination->pageCount-1 == $dataProvider->pagination->page) {
        echo "</div>";
    }
}
if($dataProvider->totalCount%$columns!=0){
如果($dataProvider->pagination->pageCount-1==$dataProvider->pagination->page){
回声“;
}
}

Hi ernie,我只想显示我的“反馈”表中的数据。它有6个字段。字段应该从上到下显示,而不是像GridViews那样从左到右。然后,你应该问这个问题(在一篇新文章中),而不是关于如何使用ListView的问题,否则你会在第一列之后陷入it不起作用的状态。您需要像@GHopper那样更改afterItem,它工作正常
'afterItem'=>函数($model,$key,$index,$widget)使用($columns){if($index>0&($index%$columns==$columns-1)){return”“;}
注释代码是解决方案的一部分吗?还请解释一下您所做的工作以及为什么它会起作用。