yii2按下拉列表排序

时间:2016-10-18 20:07:13

标签: sorting yii2 dropdown

我在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);
            ?>

2 个答案:

答案 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置于itemspagersummary之上。

'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}
',

然后风格离开!