阿江 2017-10-15 07:17:32 2414次浏览 0条回复 0 0 0

说明

学习Yii Framework 2易2框架的过程是漫长的也是充满乐趣的以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现提供了较完整的代码供你参考不妥之处请多多指正

原文网址:

http://www.yiiframework.com/doc-2.0/guide-output-sorting.html

本文主题:数据的排序显示(Sorting)

当显示多行数据时,用户常常需要按指定列进行排序。Yii使用yii\data\Sort对象来表示一个排序模型的信息,特别是: attributes:定义数据的哪些列可以被排序,此属性可以是模型的单个属性,也可以是复合属性,即是多个属性或数据列的联合体,更多细节将在后面描述。 attributeOrders:为每个属性给出当前请求排序的方向(升序或降序)。 orders:根据低级列给出排序方向。

要使用yii\data\Sort,首先应声明哪个属性可以被排序,然后从attributeOrders或Orders中获取当前请求的排序信息,使用它们去自定义数据查询,例如:

use yii\data\Sort;
$sort=new Sort([
	'attribute'	=>[
		'age',
		'name'=>[
			'asc'=>['first_name'=>SORT_ASC,'last_name'=>SORT_ASC],
			'desc'=>['first_name'=>SORT_DESC,'last_name'=>SORT_DESC],
			'default'=>SORT_DESC,
			'label'=>'Name',
		],
	],
]);
$articles=Article::find()
	->where(['status'=1])
	->orderBy($sort->orders);
	->all();

在上例中,为Sort组件声明了两个属性:age和name。 age是单个属性,对应于AR模型Article的age属性,它与以下声明是等效的:

'age'=>[
	'asc'=>['age'=>SORT_ASC],
	'desc'=>['age'=>SORT_DESC],
	'default'=>SORT_ASC,
	'label'=>Inflector::camel2words('age'),
],

name是个复合属性,由Article的first_name和last_name共同组成,它的声明是使用了如下的数组结构: 1、asc和desc元素定义了在属性是升序(ascending order)和降序(descending order)时应怎样排序,它们的值是实际要排序的列和方向。你可以定义一列或多列以示是单列排序或是多列排序。 2、default元素定义了初次请求时将要使用的排序方向,默认值是升序,也就是之前此列没有被排序过,而你的请求需要去排序此列,数据的排列方式会按此列的升序进行。 3、label元素定义了当调用yii\data\Sort::link()来创建排序链接时将要使用的标签。如果没有设置yii\helpers\Inflector::camel2words()将被调用,从属性名称中生成一个标签。注意:它不能是HTML编码的。

信息:你可以直接将排序的值放到查询中以构建ORDER BY子句,不使用attributeOrders是因为一些复合属性不能被查询语句识别。

在要排序的属性上,你可以调用yii\data\Sort::link()生成连接,你了以调用yii\data\Sort::createUrl()生成可排序的URL,例如:

//定义创建URL时要使用的路由
//如果没有定义,将使用当前请求的路由
$sort->route='article/index';
//显示按name和age排序的链接
echo $sort->link('name').' | '.$sort->link('age');
//显示:/index.php?r=article%2Findex&sort=age
echo $sort->createUrl('age');

yii\data\Sort检查sort查询参数以决定按哪个属性来排序,如果查询参数不存在,你可以通过yii\data\Sort::$defaultOrder 属性来定义一个默认排序。你也可以配置sortParm属性自定义查询参数的名称。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册