Yii2中ListView的自定义排序器

时间:2014-12-13 10:13:32

标签: yii2

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

sorter template

基本上我需要能够:

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

    实施此类内容的最佳做法是什么?

1 个答案:

答案 0 :(得分: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' => [
        // ...
    ],
]) ?>

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

但是没有样式选项,所以你需要另一个灵魂(默认情况下,排序器只是ul)。

这里有两个选择。

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

然后替换sorter中的默认ListView

<?= ListView::widget([
    'sorter' => [
        'class' => CustomLinkSorter::className(),
    ],
]) ?>

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

此外,您需要给值选择如下选项: popularity - 按受欢迎程度排序(asc), -popularity - 按人气排序(desc)。

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

首先,您需要在dataProvider中覆盖默认值Pagination,然后再将其传递给ListView

$dataProvider->pagination = [
    'defaultPageSize' => 12,
    'pageSizeLimit' => [12, 100],
],

然后将其传递给ListView

<?= ListView::widget([
    'dataProvider' => $dataProvider,
]) ?>

同时检查此extension,也许您认为它很有用。

3)可以这样解决。因为只有两个模板,所以可以添加名为advanced-view之类的表单参数。因此,如果未设置此参数或等于0,则会显示基本模板,高级模板会对应值1

ListView中,您可以根据此GET参数的值/存在来切换它们:

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