标准ListView小部件通过在其{sorter}
属性中包含$layout
部分来自动生成一种分类器。但是,我需要一个更复杂的分拣机,并为我的产品清单提供自定义模板。
基本上我需要能够:
此时我试图了解是否需要从ListView
创建类后代,或者我可以配置现有类的属性。
实施此类内容的最佳做法是什么?
答案 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',
]) ?>