Yii2中ListView的自定义分类器

Yii2中ListView的自定义分类器,yii2,Yii2,标准ListView小部件通过在其$layout属性中包含{sorter}部分,自动生成一种分类器。然而,我需要一个更复杂的分类器,为我的产品列表定制一个模板 基本上,我需要能够: 按几个字段(流行度、新鲜度、价格等)对列表进行排序 选择每页要显示的条目数(12、50、100) 在两个不同的视图模板之间切换(更多/更少产品信息) 此时,我正试图了解我是否需要从ListView创建一个类子体,或者我可以配置现有类的属性 实现类似功能的最佳实践是什么?1)您可以如下配置分拣机: <?= Li

标准ListView小部件通过在其
$layout
属性中包含
{sorter}
部分,自动生成一种分类器。然而,我需要一个更复杂的分类器,为我的产品列表定制一个模板

基本上,我需要能够:

  • 按几个字段(流行度、新鲜度、价格等)对列表进行排序
  • 选择每页要显示的条目数(12、50、100)
  • 在两个不同的视图模板之间切换(更多/更少产品信息)
  • 此时,我正试图了解我是否需要从
    ListView
    创建一个类子体,或者我可以配置现有类的属性

    实现类似功能的最佳实践是什么?

    1)您可以如下配置
    分拣机:

    <?= ListView::widget([
        'layout' => "{sorter}\n{summary}\n{items}\n{pager}", // Add sorter to layout because it's turned off by default
        'sorter' => [
            // ...
        ],
    ]) ?>
    
    但我建议使用另一种方法。不要在
    布局中包含
    {sorter}
    ,只需创建适合您需要的自定义分类器即可。在公共表单中输入名称
    sort
    以供选择。您仍然可以在配置中为分拣机配置属性列表和其他选项

    此外,您还需要给定值来选择如下选项:
    受欢迎程度
    -按受欢迎程度排序(asc),
    -受欢迎程度
    -按受欢迎程度排序(desc)

    2)我记得Yii 2没有内置选项来生成这样的选择。你应该自己做这件事。创建选择框,以通用形式为其命名为每页
    (这是限制一页记录数量的默认名称)。select的名称和值对应必要的计数

    首先,您需要覆盖
    数据提供程序
    中的默认值,然后再将其传递给
    列表视图

    <?= ListView::widget([
        'sorter' => [
            'class' => CustomLinkSorter::className(),
        ],
    ]) ?>
    
    $dataProvider->pagination = [
        'defaultPageSize' => 12,
        'pageSizeLimit' => [12, 100],
    ],
    
    <?= ListView::widget([
        'dataProvider' => $dataProvider,
    ]) ?>
    
    然后将其传递到
    ListView

    <?= ListView::widget([
        'sorter' => [
            'class' => CustomLinkSorter::className(),
        ],
    ]) ?>
    
    $dataProvider->pagination = [
        'defaultPageSize' => 12,
        'pageSizeLimit' => [12, 100],
    ],
    
    <?= ListView::widget([
        'dataProvider' => $dataProvider,
    ]) ?>
    

    非常感谢你。这真的很有帮助。