Yii2-网格视图-排序工作原理


Yii2 - GridView - How Sorting works?

我正试图通过生成默认的CRUD应用程序来了解排序在GridView中是如何工作的。排序发生在单击作为表标题的相应属性之后。列名附加到带有变量sort的url上,单击后会调用操作方法,但我想知道的是,带有实际变量$sort的url中提到的操作方法在控制器中不存在。

以下是示例

网址如下,

/advanced/frontend/web/index.php?r=站点%2索引&sort=customer_user_name2

但现场控制器中没有相应的动作方法函数CCD_ 4;

考虑以下示例

我们有乘客CRUD

考虑Passenger-a模型和PassengerSearch-其相应的搜索模型

乘客属性为id、name和country_name

PassengerController.php

<?php
...
public function actionIndex()
{
    $searchModel = new PassengerSearch();    
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
...
?>

在名称列中搜索字符串a并在desc顺序中对id列进行排序

看看生成的url,它会像

`http://localhost/YII2proj/passenger/index?PassengerSearch%5Bid%5D=&PassengerSearch%5Bname%5D=a&PassengerSearch%5Bcountry_name%5D=&sort=-id`

人类可读格式

http://localhost/YII2proj/passenger/index?
PassengerSearch[id]=&
PassengerSearch[name]=a&
PassengerSearch[country_name]=&
sort=-id

观察PassengerSearch是一个数组。请参阅-如何在url请求中发送数组?

关注对象PassengerSearch类的search()方法的参数它是Yii::$app->request->queryParams

之前$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

行,插入以下代码

echo '<pre>';
print_r(Yii::$app->request->queryParams);
echo '</pre>';
die;

并查看结果

Array
(
    [PassengerSearch] => Array
        (
            [id] => 
            [name] => a
            [country_name] => 
        )
    [sort] => -id
)

如果没有进行搜索排序,则此数组将为空

所以这一行你的代码像一样吗

<?php
if(isset($_GET['sort']) ||  isset($_GET['PassengerSearch']['id'] ...)
{
    // validate it because what if I changed url like
    // `http://localhost/YII2proj/passenger/index?PassengerSearcasdh[dfsid]=&PassengerSearch[name]=a&PassengerSearch[country_name]=&sorsfdft=-idadlashdfhls`
    // ie some scrap value
    // If error returned from validate function, default sorting is done, and malformed search param is not set
    // if success, fill up that array
}
?>

那么在搜索中load()型就是英雄。

上述代码是在哪里以及如何完成的?-参考型号和load()

加载后通过andFilterWhere进行搜索,即load(),您可以在search()方法中看到

希望你了解搜索和排序背后的想法。