我正试图通过生成默认的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()
方法中看到
希望你了解搜索和排序背后的想法。