CSort
| Package |
system.web |
| Inheritance |
class CSort »
CComponent |
| Since |
1.0.1 |
| Version |
$Id: CSort.php 2156 2010-05-30 15:05:44Z qiang.xue $ |
CSort represents information relevant to sorting.
When data needs to be sorted according to one or several attributes,
we can use CSort to represent the sorting information and generate
appropriate hyperlinks that can lead to sort actions.
CSort is designed to be used together with
CActiveRecord.
When creating a CSort instance, you need to specify
modelClass.
You can use CSort to generate hyperlinks by calling
link.
You can also use CSort to modify a
CDbCriteria instance by calling
applyOrder so that
it can cause the query results to be sorted according to the specified
attributes.
In order to prevent SQL injection attacks, CSort ensures that only valid model attributes
can be sorted. This is determined based on
modelClass and
attributes.
When
attributes is not set, all attributes belonging to
modelClass
can be sorted. When
attributes is set, only those attributes declared in the property
can be sorted.
By configuring
attributes, one can perform more complex sorts that may
consist of things like compound attributes (e.g. sort based on the combination of
first name and last name of users).
The property
attributes should be an array of key-value pairs, where the keys
represent the attribute names, while the values represent the virtual attribute definitions.
For more details, please check the documentation about
attributes.
Public Properties
Hide inherited properties
| Property | Type | Description | Defined By |
| attributes |
array |
list of attributes that are allowed to be sorted. |
CSort |
| defaultOrder |
string |
the default order that should be applied to the query criteria when
the current request does not specify any sort. |
CSort |
| descTag |
string |
the tag appeared in the GET parameter that indicates the attribute should be sorted
in descending order. |
CSort |
| directions |
array |
Returns the currently requested sort information. |
CSort |
| modelClass |
string |
the name of the model class whose attributes can be sorted. |
CSort |
| multiSort |
boolean |
whether the sorting can be applied to multiple attributes simultaneously. |
CSort |
| orderBy |
string |
the order-by columns represented by this sort object. |
CSort |
| params |
array |
the additional GET parameters (name=>value) that should be used when generating sort URLs. |
CSort |
| route |
string |
the route (controller ID and action ID) for generating the sorted contents. |
CSort |
| separators |
array |
separators used in the generated URL. |
CSort |
| sortVar |
string |
the name of the GET parameter that specifies which attributes to be sorted
in which direction. |
CSort |
Property Details
public array $attributes;
list of attributes that are allowed to be sorted.
For example, array('user_id','create_time') would specify that only 'user_id'
and 'create_time' of the model modelClass can be sorted.
By default, this property is an empty array, which means all attributes in
modelClass are allowed to be sorted.
This property can also be used to specify complex sorting. To do so,
a virtual attribute can be declared in terms of a key-value pair in the array.
The key refers to the name of the virtual attribute that may appear in the sort request,
while the value specifies the definition of the virtual attribute.
In the simple case, a key-value pair can be like 'user'=>'user_id'
where 'user' is the name of the virtual attribute while 'user_id' means the virtual
attribute is the 'user_id' attribute in the modelClass.
A more flexible way is to specify the key-value pair as
'user'=>array(
'asc'=>'first_name, last_name',
'desc'=>'first_name DESC, last_name DESC',
'label'=>'Name'
)
where 'user' is the name of the virtual attribute that specifies the full name of user
(a compound attribute consisting of first name and last name of user). In this case,
we have to use an array to define the virtual attribute with three elements: 'asc',
'desc' and 'label'.
The above approach can also be used to declare virtual attributes that consist of relational
attributes. For example,
'price'=>array(
'asc'=>'item.price',
'desc'=>'item.price DESC',
'label'=>'Item Price'
)
Note, the attribute name should not contain '-' or '.' characters because
they are used as
separators.
Starting from version 1.1.3, an additional option named 'default' can be used in the virtual attribute
declaration. This option specifies whether an attribute should be sorted in ascending or descending
order upon user clicking the corresponding sort hyperlink if it is not currently sorted. The valid
option values include 'asc' (default) and 'desc'. For example,
'price'=>array(
'asc'=>'item.price',
'desc'=>'item.price DESC',
'label'=>'Item Price',
'default'=>'desc',
)
Also starting from version 1.1.3, you can include a star ('*') element in this property so that
all model attributes are available for sorting, in addition to those virtual attributes. For example,
'attributes'=>array(
'price'=>array(
'asc'=>'item.price',
'desc'=>'item.price DESC',
'label'=>'Item Price',
'default'=>'desc',
),
'*',
)
Note that when a name appears as both a model attribute and a virtual attribute, the position of
the star element in the array determines which one takes precedence. In particular, if the star
element is the first element in the array, the model attribute takes precedence; and if the star
element is the last one, the virtual attribute takes precedence.
public string $defaultOrder;
the default order that should be applied to the query criteria when
the current request does not specify any sort. For example, 'create_time DESC', or
'name, create_time DESC'.
Starting from version 1.1.3, you can also specify the default order using an array,
where the array keys are virtual attribute names as declared in attributes,
and the array values indicate whether the sorting of the corresponding attributes should
be in descending order. For example,
'defaultOrder'=>array(
'price'=>true,
)
public string $descTag;
the tag appeared in the GET parameter that indicates the attribute should be sorted
in descending order. Defaults to 'desc'.
Returns the currently requested sort information.
public string $modelClass;
the name of the model class whose attributes can be sorted.
The model class must be a child class of CActiveRecord.
public boolean $multiSort;
whether the sorting can be applied to multiple attributes simultaneously.
Defaults to false, which means each time the data can only be sorted by one attribute.
the order-by columns represented by this sort object.
This can be put in the ORDER BY clause of a SQL statement.
public array $params;
the additional GET parameters (name=>value) that should be used when generating sort URLs.
Defaults to null, meaning using the currently available GET parameters.
public string $route;
the route (controller ID and action ID) for generating the sorted contents.
Defaults to empty string, meaning using the currently requested route.
public array $separators;
separators used in the generated URL. This must be an array consisting of
two elements. The first element specifies the character separating different
attributes, while the second element specifies the character separating attribute name
and the corresponding sort direction. Defaults to array('-','.').
public string $sortVar;
the name of the GET parameter that specifies which attributes to be sorted
in which direction. Defaults to 'sort'.
Method Details
|
public void __construct(string $modelClass=NULL)
|
| $modelClass |
string |
the class name of data models that need to be sorted.
This should be a child class of CActiveRecord. |
Constructor.
Modifies the query criteria by changing its CDbCriteria::order property.
This method will use directions to determine which columns need to be sorted.
They will be put in the ORDER BY clause. If the criteria already has non-empty CDbCriteria::order value,
the new value will be appended to it.
|
protected string createLink(string $attribute, string $label, string $url, array $htmlOptions)
|
| $attribute |
string |
the name of the attribute that this link is for |
| $label |
string |
the label of the hyperlink |
| $url |
string |
the URL |
| $htmlOptions |
array |
additional HTML options |
| {return} |
string |
the generated hyperlink |
Creates a hyperlink based on the given label and URL.
You may override this method to customize the link generation.
public string createUrl( CController $controller, array $directions)
|
| $controller |
CController |
the controller that will be used to create the URL. |
| $directions |
array |
the sort directions indexed by attribute names.
The sort direction is true if the corresponding attribute should be
sorted in descending order. |
| {return} |
string |
the URL for sorting |
Creates a URL that can lead to generating sorted data.
|
public mixed getDirection(string $attribute)
|
| $attribute |
string |
the attribute name |
| {return} |
mixed |
the sort direction of the attribut. True if the attribute should be sorted in descending order,
false if in ascending order, and null if the attribute doesn't need to be sorted. |
Returns the sort direction of the specified attribute in the current request.
|
public array getDirections()
|
| {return} |
array |
sort directions indexed by attribute names.
The sort direction is true if the corresponding attribute should be
sorted in descending order. |
Returns the currently requested sort information.
|
public string getOrderBy()
|
| {return} |
string |
the order-by columns represented by this sort object.
This can be put in the ORDER BY clause of a SQL statement. |
|
public string link(string $attribute, string $label=NULL, array $htmlOptions=array (
))
|
| $attribute |
string |
the attribute name. This must be the actual attribute name, not alias.
If it is an attribute of a related AR object, the name should be prefixed with
the relation name (e.g. 'author.name', where 'author' is the relation name). |
| $label |
string |
the link label. If null, the label will be determined according
to the attribute (see resolveLabel). |
| $htmlOptions |
array |
additional HTML attributes for the hyperlink tag |
| {return} |
string |
the generated hyperlink |
Generates a hyperlink that can be clicked to cause sorting.
|
public mixed resolveAttribute(string $attribute)
|
| $attribute |
string |
the attribute name that the user requests to sort on |
| {return} |
mixed |
the attribute name or the virtual attribute definition. False if the attribute cannot be sorted. |
Returns the real definition of an attribute given its name.
The resolution is based on attributes and CActiveRecord::attributeNames.
- When attributes is an empty array, if the name refers to an attribute of modelClass,
then the name is returned back.
- When attributes is not empty, if the name refers to an attribute declared in attributes,
then the corresponding virtual attribute definition is returned. Starting from version 1.1.3, if attributes
contains a star ('*') element, the name will also be used to match against all model attributes.
- In all other cases, false is returned, meaning the name does not refer to a valid attribute.
|
public string resolveLabel(string $attribute)
|
| $attribute |
string |
the attribute name. |
| {return} |
string |
the attribute label |
Resolves the attribute label for the specified attribute.
This will invoke CActiveRecord::getAttributeLabel to determine what label to use.
If the attribute refers to a virtual attribute declared in attributes,
then the label given in the attributes will be returned instead.
how can I sort related records if the relation type is MANY_MANY?