2014-12-13 28 views
3

标准ListView控件通过使属性中的{sorter}部分自动生成一种分拣机。不过,我需要一个更复杂的分拣机,并为我的产品列表提供自定义模板。Yii2中ListView的自定义分拣器

sorter template

基本上我需要能够:

  1. 排序列表由几个字段(流行,新奇,价格等)
  2. 选择每页许多条目如何展示(12,50,100)
  3. 两个不同的视图模板(多/少产品信息)之间切换

在这一点上,我想了解是否需要从ListView创建类的后代,或者我可以配置现有类的属性。

实施这样的最佳做法是什么?

回答

7

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()方法。

然后在你的ListView替换默认sorter

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

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

你也需要给值来选择这样的选项: popularity - 为了人气(ASC), -popularity - 为了人气(DESC)。

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

首先你需要在你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', 
]) ?> 
+1

非常感谢你。这真的有帮助。 – Beowulfenator 2014-12-13 21:42:42