标准ListView控件通过使属性中的{sorter}
部分自动生成一种分拣机。不过,我需要一个更复杂的分拣机,并为我的产品列表提供自定义模板。Yii2中ListView的自定义分拣器
基本上我需要能够:
- 排序列表由几个字段(流行,新奇,价格等)
- 选择每页许多条目如何展示(12,50,100)
- 两个不同的视图模板(多/少产品信息)之间切换
在这一点上,我想了解是否需要从ListView
创建类的后代,或者我可以配置现有类的属性。
实施这样的最佳做法是什么?
标准ListView控件通过使属性中的{sorter}
部分自动生成一种分拣机。不过,我需要一个更复杂的分拣机,并为我的产品列表提供自定义模板。Yii2中ListView的自定义分拣器
基本上我需要能够:
在这一点上,我想了解是否需要从ListView
创建类的后代,或者我可以配置现有类的属性。
实施这样的最佳做法是什么?
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',
]) ?>
非常感谢你。这真的有帮助。 – Beowulfenator 2014-12-13 21:42:42