我想在Yii2 listview中显示列数据

时间:2015-12-29 17:30:54

标签: yii2

我尝试在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'],
                    ],
            ]);

4 个答案:

答案 0 :(得分:2)

ListView没有gridview所做的花哨处理 - 它接收数据并将其传递给视图,为您提供一些便利项目(分页,排序,过滤等)。

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

答案 1 :(得分:1)

考虑这段代码,它会从左到右,从上到下显示三列中的项目。此代码使用以下引导程序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>";
}

答案 2 :(得分: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>";
}

我在大量数据上进行了测试,效果很好。我喜欢这种解决方案,希望对您有所帮助。

答案 3 :(得分:0)

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

//if ( $dataProvider->totalCount % $columns != 0 ) {
//    echo "</div>";
//}

这个变体适用于 \yii\bootstrap\Tabs 和分页:

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