Yii2中ListView的自定义排序器

Beo*_*tor 3 yii2

标准ListView小部件通过{sorter}在其$layout属性中包含该部分来自动生成一种分类器.但是,我需要一个更复杂的分拣机,其中包含我的产品列表的自定义模板.

分拣机模板

基本上我需要能够:

  1. 按几个字段(流行度,新颖度,价格等)对列表进行排序
  2. 选择每页显示的条目数(12,50,100)
  3. 在两个不同的视图模板之间切换(更多/更少的产品信息)

此时我试图了解是否需要创建类后代,ListView或者我可以配置现有类的属性.

实现这样的事情的最佳做法是什么?

aro*_*hev 9

1)你可以sorter像这样配置:

<?= ListView::widget([
    'layout' => "{sorter}\n{summary}\n{items}\n{pager}", // Add sorter to layout because it's turned off by default
    'sorter' => [
        // ...
    ],
]) ?>
Run Code Online (Sandbox Code Playgroud)

请参阅yii\widgets\LinkSorter的官方文档中的可用属性.

但是没有样式选项,所以你需要另一个灵魂(默认情况下,分拣机就是这样ul).

你有两个选择.

您可以创建自定义类,该类扩展自yii\widgets\LinkSorter并覆盖renderSortLinks()负责呈现html的方法.

然后替换sorter你的默认值ListView:

<?= ListView::widget([
    'sorter' => [
        'class' => CustomLinkSorter::className(),
    ],
]) ?>
Run Code Online (Sandbox Code Playgroud)

但我建议使用其他方法.不要包含{sorter}in layout,只需创建适合您需求的自定义分拣机.放入常用表格并给出sort选择名称.您仍然可以在配置中将属性列表和其他选项配置为分拣机.

此外,您需要为这些选项提供值: popularity- 按人气(asc)-popularity排序, - 按人气排序(desc).

2)我记得Yii 2没有内置选项来生成这样的选择.你应该自己做.创建选择框,为其指定per-page常用形式的名称(这是限制一页上记录数量的默认名称).select的名称和值对应必要的计数.

首先,你需要重写的默认值分页在你dataProvider将它传递给前ListView:

$dataProvider->pagination = [
    'defaultPageSize' => 12,
    'pageSizeLimit' => [12, 100],
],
Run Code Online (Sandbox Code Playgroud)

然后将其传递给ListView:

<?= ListView::widget([
    'dataProvider' => $dataProvider,
]) ?>
Run Code Online (Sandbox Code Playgroud)

同时检查此扩展名,也许您发现它很有用.

3)可以这样解决.因为只有两个模板,所以可以添加到表单参数中,例如advanced-view.因此,当此参数未设置或等于时0,将显示基本模板,高级模板将对应该值1.

ListView你可以切换他们根据这个GET参数的值/存在:

<?= ListView::widget([
    'itemView' => Yii::$app->request->get('advanced-view') ? '_advanced-view' : '_basic-view',
]) ?>
Run Code Online (Sandbox Code Playgroud)