我在listview yii2中排序有问题。我不知道如何创建下拉列表,并在“单独的过滤器”窗体中进行排序。
在模特中我有:
$dataProvider->sort->attributes['sort'] = [
'asc' => ['game.rating' => SORT_ASC],
'desc' => ['game.rating' => SORT_DESC],
];
但是如何创建下拉?
型号:
class GameSearch extends Offer
{
public $status;
public $title;
public $type;
public $platform;
public $rating;
public $pageSize;
public $sort;
public function rules()
{
return [
[['status', 'platform', 'pageSize'], 'integer'],
[['title', 'type', 'sort', 'rating'], 'string']
];
}
public function search($params, $query)
{
$query->joinWith(['game', 'author']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['defaultOrder' => ['created_at' => SORT_DESC]],
'pagination' => [
'pageSize' => $this->pageSize,
],
]);
$dataProvider->sort->attributes['sort'] = [
'asc' => ['game.rating' => SORT_ASC],
'desc' => ['game.rating' => SORT_DESC],
];
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$dataProvider->pagination->pageSize = $this->pageSize;
$query->andFilterWhere(['like', 'game.title', $this->title])
->andFilterWhere(['like', 'platform', $this->platform]);
return $dataProvider;
}
}
和我的搜索文件
<?= $form->field($model, 'sort')
->dropDownList([
'rating' => 'rating ASC',
'-rating' => 'rating DESC',
])
->label(false)
->error(false);
?>
答案 0 :(得分:2)
我有同样的问题,这是我的配置 视图。值1是排序ASC,值2是排序DESC
<?= $form->field($model, 'sort')
->dropDownList([
'1' => 'rating ASC',
'2' => 'rating DESC',
],['id' =>'find-rating1'])
->label(false)
->error(false);
?>
并添加js底部视图
$findUrl = Url::current([], true);
$pos = strpos($findUrl, '&rating');
if($pos){
$findUrl = substr($findUrl, 0 , $pos);
}
$app_js = <<<JS
$("#find-rating1").change(function() {
var rating_value= $(this).val();
location.href="$findUrl" +"&rating="+rating_value;
});
JS;
$this->registerJs($app_js);
如您所见,当下拉列表发生更改事件时。将重定向到url将评级参数1或2.因此在Controller中,您可以获得评级值1或2并设置排序。
$ratingValue = getParam('rating', 1);
并使用$ ratingValue,您可以自定义搜索查询
答案 1 :(得分:0)
有点晚了但我在搜索类似的问题时发现了这篇文章 希望我最终做的事情可以帮助他人。
将引导类添加到ListView分类器<ul>
。此外,在列表中设置您想要的任何属性,或者如果您想要查看所有内容,请将该部分保留。
'sorter' => [
'options' => [
'class' => 'dropdown-menu'
],
'attributes' => [
'id', 'name'
]
],
然后用layout
将其包装在其余的bootstrap下拉标签中。此示例将sorter
置于items
,pager
和summary
之上。
'layout' => '
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
Sort <span class="caret"></span>
</button>
{sorter}
</div>
{items}{pager}{summary}
',
然后风格离开!