クラス yii\data\Sort
継承 | yii\data\Sort » yii\base\BaseObject |
---|---|
実装 | yii\base\Configurable |
利用可能なバージョン | 2.0 |
ソースコード | https://github.com/yiisoft/yii2/blob/master/framework/data/Sort.php |
Sortは、ソートに関連する情報を表現します。
データが1つまたは複数の属性に従ってソートされる必要がある場合、Sortを使用してソート情報を表現し、ソートアクションにつながる適切なハイパーリンクを生成できます。
典型的な使用例は以下のとおりです。
public function actionIndex()
{
$sort = new Sort([
'attributes' => [
'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',
],
],
]);
$models = Article::find()
->where(['status' => 1])
->orderBy($sort->orders)
->all();
return $this->render('index', [
'models' => $models,
'sort' => $sort,
]);
}
ビュー
// display links leading to sort actions
echo $sort->link('name') . ' | ' . $sort->link('age');
foreach ($models as $model) {
// display $model here
}
上記では、ソートをサポートする2つの$attributes(name
とage
)を宣言しています。Sortオブジェクトで指定された順序でクエリ結果がソートされるように、ソート情報をArticleクエリに渡します。ビューでは、対応する属性でソートされたデータを含むページにつながる2つのハイパーリンクを表示します。
Sortの詳細と使用方法については、ソートに関するガイド記事をご覧ください。
パブリックプロパティ
プロパティ | 型 | 説明 | 定義元 |
---|---|---|---|
$attributeOrders | array | 属性名でインデックス付けされたソート方向。 | yii\data\Sort |
$attributes | array | ソートが許可されている属性のリスト。 | yii\data\Sort |
$defaultOrder | array|null | 現在のリクエストが順序を指定していない場合に使用される順序。 | yii\data\Sort |
$enableMultiSort | boolean | ソートを複数の属性に同時に適用できるかどうか。 | yii\data\Sort |
$modelClass | string|null | link()メソッドが属性のラベルを取得するために使用するyii\base\Modelベースのクラスの名前。 | yii\data\Sort |
$orders | array | 列(キー)と対応するソート方向(値)。 | yii\data\Sort |
$params | array|null | 現在のソート方向を取得し、新しいソートURLを作成するために使用する必要があるパラメータ(name => value)。 | yii\data\Sort |
$route | string|null | ソートされたコンテンツを表示するためのコントローラーアクションのルート。 | yii\data\Sort |
$separator | string | ソートする必要がある異なる属性を区切るために使用される文字。 | yii\data\Sort |
$sortFlags | integer | ArrayHelper::multisort()に渡される4番目のパラメータの値を制御できるようにします | yii\data\Sort |
$sortParam | string | どの属性をどの方向にソートするかを指定するパラメータの名前。 | yii\data\Sort |
$urlManager | yii\web\UrlManager|null | ソートURLを作成するために使用されるURLマネージャー。 | yii\data\Sort |
パブリックメソッド
プロパティの詳細
属性名でインデックスされたソートの方向。ソートの方向は昇順の場合はSORT_ASC
、降順の場合はSORT_DESC
のいずれかになります。このプロパティの型はゲッターとセッターで異なることに注意してください。詳細はgetAttributeOrders() と setAttributeOrders() を参照してください。
ソート可能な属性のリスト。その構文は以下の例で説明できます。
[
'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',
],
]
上記の例では、age
と name
の2つの属性が宣言されています。age
属性は単純な属性で、以下と同等です。
'age' => [
'asc' => ['age' => SORT_ASC],
'desc' => ['age' => SORT_DESC],
'default' => SORT_ASC,
'label' => Inflector::camel2words('age'),
]
2.0.12以降では、特定のソート方向を次のように直接ソート式として指定することもできます。
'name' => [
'asc' => '[[last_name]] ASC NULLS FIRST', // PostgreSQL specific feature
'desc' => '[[last_name]] DESC NULLS LAST',
]
name
属性は複合属性です。
name
キーは、ソートアクションにつながるURLに表示される属性名を表します。asc
とdesc
要素は、それぞれ昇順と降順で属性をソートする方法を指定します。これらの値は、データをソートする際の実際の列と方向を表します。default
要素は、属性が現在ソートされていない場合(デフォルト値は昇順)に、どの方向で属性をソートするかを指定します。label
要素は、ソートリンクを作成するためにlink()を呼び出すときに使用するラベルを指定します。設定されていない場合は、yii\helpers\Inflector::camel2words() がラベルを取得するために呼び出されます。HTMLエンコードされないことに注意してください。
Sortオブジェクトがすでに作成されている場合は、すべての属性を設定するために完全なフォーマットのみを使用できることに注意してください。各属性には、asc
と desc
の要素を含める必要があります。
現在のリクエストで順序が指定されていない場合に使用される順序。配列キーは属性名、配列値は対応するソート方向です。例えば、
[
'name' => SORT_ASC,
'created_at' => SORT_DESC,
]
$attributeOrders も参照してください。
ソートを複数の属性に同時に適用できるかどうか。デフォルトはfalse
で、データは毎回1つの属性でしかソートできないことを意味します。
link()メソッドが属性のラベルを取得するために使用するyii\base\Modelベースのクラスの名前。詳細についてはlink()メソッドを参照してください。
列(キー)とそれに対応するソート方向(値)。これは、DBクエリを構築するためにyii\db\Query::orderBy()に渡すことができます。
現在のソート方向を取得し、新しいソートURLを作成するために使用する必要があるパラメータ(name => value)。設定されていない場合は、代わりに$_GET
が使用されます。
すべてのリンクにハッシュを追加するには、array_merge($_GET, ['#' => 'my-hash'])
を使用します。
$sortParamでインデックス付けされた配列要素が、現在のソート方向と見なされます。要素が存在しない場合、デフォルトの順序が使用されます。
こちらも参照してください。
ソートされたコンテンツを表示するためのコントローラアクションのルート。設定されていない場合は、現在リクエストされているルートを使用することを意味します。
ArrayHelper::multisort()に渡される4番目のパラメータの値を制御できるようにします
どの属性をどの方向でソートするかを指定するパラメータの名前。デフォルトはsort
です。
$paramsも参照してください。
ソートURLの作成に使用されるURLマネージャー。設定されていない場合、urlManager
アプリケーションコンポーネントが使用されます。
メソッドの詳細
定義元: yii\base\BaseObject::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
不明なメソッドが呼び出されたときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | string |
メソッド名 |
$params | array |
メソッドのパラメータ |
return | mixed |
メソッドの戻り値 |
---|---|---|
throws | yii\base\UnknownMethodException |
不明なメソッドを呼び出した場合 |
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定義元: yii\base\BaseObject::__construct()
コンストラクター。
デフォルトの実装では、次の2つのことを行います。
- 指定された構成
$config
でオブジェクトを初期化します。 - init()を呼び出します。
このメソッドが子クラスでオーバーライドされる場合、次の推奨事項があります。
- コンストラクタの最後のパラメータは、ここでの
$config
のように構成配列であること。 - コンストラクタの最後に親の実装を呼び出すこと。
public void __construct ( $config = [] ) | ||
$config | array |
オブジェクトのプロパティを初期化するために使用される名前と値のペア |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義元: yii\base\BaseObject::__get()
オブジェクトプロパティの値を返します。
このメソッドは、$value = $object->property;
を実行したときに暗黙的に呼び出されるPHPマジックメソッドであるため、直接呼び出さないでください。
__set()も参照してください。
public mixed __get ( $name ) | ||
$name | string |
プロパティ名 |
return | mixed |
プロパティの値 |
---|---|---|
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
throws | yii\base\InvalidCallException |
プロパティが書き込み専用の場合 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
} elseif (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定義元: yii\base\BaseObject::__isset()
プロパティが設定されているかどうか(つまり、定義されていてnullでないかどうか)を確認します。
このメソッドは、isset($object->property)
を実行したときに暗黙的に呼び出されるPHPマジックメソッドであるため、直接呼び出さないでください。
プロパティが定義されていない場合、falseが返されることに注意してください。
public boolean __isset ( $name ) | ||
$name | string |
プロパティ名またはイベント名 |
return | boolean |
指定されたプロパティが設定されている(nullではない)かどうか。 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
定義元: yii\base\BaseObject::__set()
オブジェクトプロパティの値を設定します。
このメソッドは、$object->property = $value;
を実行したときに暗黙的に呼び出されるPHPマジックメソッドであるため、直接呼び出さないでください。
__get()も参照してください。
public void __set ( $name, $value ) | ||
$name | string |
プロパティ名またはイベント名 |
$value | mixed |
プロパティの値 |
throws | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
throws | yii\base\InvalidCallException |
プロパティが読み取り専用の場合 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
定義元: yii\base\BaseObject::__unset()
オブジェクトプロパティをnullに設定します。
このメソッドは、unset($object->property)
を実行したときに暗黙的に呼び出されるPHPマジックメソッドであるため、直接呼び出さないでください。
プロパティが定義されていない場合、このメソッドは何もしないことに注意してください。プロパティが読み取り専用の場合は、例外がスローされます。
public void __unset ( $name ) | ||
$name | string |
プロパティ名 |
throws | yii\base\InvalidCallException |
プロパティが読み取り専用の場合。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
}
}
定義元: yii\base\BaseObject::canGetProperty()
プロパティを読み取ることができるかどうかを示す値を返します。
プロパティが読み取り可能であるのは、次のいずれかの場合です。
- クラスに、指定された名前に関連付けられたgetterメソッドがある場合(この場合、プロパティ名は大文字と小文字を区別しません)。
- クラスに、指定された名前のメンバー変数がある場合(
$checkVars
がtrueの場合)。
canSetProperty()も参照してください。
public boolean canGetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
return | boolean |
プロパティを読み取ることができるかどうか |
---|
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}
定義元: yii\base\BaseObject::canSetProperty()
プロパティを設定できるかどうかを示す値を返します。
プロパティが書き込み可能であるのは、次のいずれかの場合です。
- クラスに、指定された名前に関連付けられたsetterメソッドがある場合(この場合、プロパティ名は大文字と小文字を区別しません)。
- クラスに、指定された名前のメンバー変数がある場合(
$checkVars
がtrueの場合)。
canGetProperty()も参照してください。
public boolean canSetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
return | boolean |
プロパティを書き込むことができるかどうか |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
::class
を使用してください。
定義元: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
return | string |
このクラスの完全修飾名。 |
---|
public static function className()
{
return get_called_class();
}
指定された属性のソート変数を作成します。
新しく作成されたソート変数は、指定された属性でソートするためのURLを作成するために使用できます。
public string createSortParam ( $attribute ) | ||
$attribute | string |
属性名 |
return | string |
ソート変数の値 |
---|---|---|
throws | yii\base\InvalidConfigException |
指定された属性が $attributes で定義されていない場合 |
public function createSortParam($attribute)
{
if (!isset($this->attributes[$attribute])) {
throw new InvalidConfigException("Unknown attribute: $attribute");
}
$definition = $this->attributes[$attribute];
$directions = $this->getAttributeOrders();
if (isset($directions[$attribute])) {
if ($this->enableMultiSort) {
if ($directions[$attribute] === SORT_ASC) {
$direction = SORT_DESC;
} else {
$direction = null;
}
} else {
$direction = $directions[$attribute] === SORT_DESC ? SORT_ASC : SORT_DESC;
}
unset($directions[$attribute]);
} else {
$direction = isset($definition['default']) ? $definition['default'] : SORT_ASC;
}
if ($this->enableMultiSort) {
if ($direction !== null) {
$directions = array_merge([$attribute => $direction], $directions);
}
} else {
$directions = [$attribute => $direction];
}
$sorts = [];
foreach ($directions as $attribute => $direction) {
$sorts[] = $direction === SORT_DESC ? '-' . $attribute : $attribute;
}
return implode($this->separator, $sorts);
}
指定された属性でデータをソートするためのURLを作成します。
このメソッドは、$attributeOrders で与えられた現在のソートステータスを考慮します。たとえば、現在のページが既に指定された属性で昇順にデータをソートしている場合、作成されたURLは、指定された属性で降順にデータをソートするページにつながります。
こちらも参照してください。
public string createUrl ( $attribute, $absolute = false ) | ||
$attribute | string |
属性名 |
$absolute | boolean |
絶対URLを作成するかどうか。デフォルトは |
return | string |
ソート用のURL。属性が無効な場合はfalse。 |
---|---|---|
throws | yii\base\InvalidConfigException |
属性が不明な場合 |
public function createUrl($attribute, $absolute = false)
{
if (($params = $this->params) === null) {
$request = Yii::$app->getRequest();
$params = $request instanceof Request ? $request->getQueryParams() : [];
}
$params[$this->sortParam] = $this->createSortParam($attribute);
$params[0] = $this->route === null ? Yii::$app->controller->getRoute() : $this->route;
$urlManager = $this->urlManager === null ? Yii::$app->getUrlManager() : $this->urlManager;
if ($absolute) {
return $urlManager->createAbsoluteUrl($params);
}
return $urlManager->createUrl($params);
}
現在のリクエストで指定された属性のソート方向を返します。
public integer|null getAttributeOrder ( $attribute ) | ||
$attribute | string |
属性名 |
return | integer|null |
属性のソート方向。昇順の場合は |
---|
public function getAttributeOrder($attribute)
{
$orders = $this->getAttributeOrders();
return isset($orders[$attribute]) ? $orders[$attribute] : null;
}
現在リクエストされているソート情報を返します。
public array getAttributeOrders ( $recalculate = false ) | ||
$recalculate | boolean |
ソート方向を再計算するかどうか |
return | array |
属性名でインデックス付けされたソート方向。ソート方向は、昇順の場合は |
---|
public function getAttributeOrders($recalculate = false)
{
if ($this->_attributeOrders === null || $recalculate) {
$this->_attributeOrders = [];
if (($params = $this->params) === null) {
$request = Yii::$app->getRequest();
$params = $request instanceof Request ? $request->getQueryParams() : [];
}
if (isset($params[$this->sortParam])) {
foreach ($this->parseSortParam($params[$this->sortParam]) as $attribute) {
$descending = false;
if (strncmp($attribute, '-', 1) === 0) {
$descending = true;
$attribute = substr($attribute, 1);
}
if (isset($this->attributes[$attribute])) {
$this->_attributeOrders[$attribute] = $descending ? SORT_DESC : SORT_ASC;
if (!$this->enableMultiSort) {
return $this->_attributeOrders;
}
}
}
return $this->_attributeOrders;
}
if (empty($this->_attributeOrders) && is_array($this->defaultOrder)) {
$this->_attributeOrders = $this->defaultOrder;
}
}
return $this->_attributeOrders;
}
列と対応するソート方向を返します。
public array getOrders ( $recalculate = false ) | ||
$recalculate | boolean |
ソート方向を再計算するかどうか |
return | array |
列(キー)とそれに対応するソート方向(値)。これは、DBクエリを構築するためにyii\db\Query::orderBy()に渡すことができます。 |
---|
public function getOrders($recalculate = false)
{
$attributeOrders = $this->getAttributeOrders($recalculate);
$orders = [];
foreach ($attributeOrders as $attribute => $direction) {
$definition = $this->attributes[$attribute];
$columns = $definition[$direction === SORT_ASC ? 'asc' : 'desc'];
if (is_array($columns) || $columns instanceof \Traversable) {
foreach ($columns as $name => $dir) {
$orders[$name] = $dir;
}
} else {
$orders[] = $columns;
}
}
return $orders;
}
ソート定義が名前付き属性によるソートをサポートしているかどうかを示す値を返します。
public boolean hasAttribute ( $name ) | ||
$name | string |
属性名 |
return | boolean |
ソート定義が、指定された名前の属性によるソートをサポートしているかどうか。 |
---|
public function hasAttribute($name)
{
return isset($this->attributes[$name]);
}
定義元: yii\base\BaseObject::hasMethod()
メソッドが定義されているかどうかを示す値を返します。
デフォルトの実装は、php関数 method_exists()
の呼び出しです。phpのマジックメソッド __call()
を実装した場合、このメソッドをオーバーライドできます。
public boolean hasMethod ( $name ) | ||
$name | string |
メソッド名 |
return | boolean |
メソッドが定義されているかどうか |
---|
public function hasMethod($name)
{
return method_exists($this, $name);
}
定義元: yii\base\BaseObject::hasProperty()
プロパティが定義されているかどうかを示す値を返します。
プロパティは、次の場合は定義されています。
- クラスが、指定された名前に関連付けられたゲッターまたはセッターメソッドを持っている場合(この場合、プロパティ名は大小文字を区別しません)。
- クラスに、指定された名前のメンバー変数がある場合(
$checkVars
がtrueの場合)。
こちらも参照してください。
public boolean hasProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
return | boolean |
プロパティが定義されているかどうか |
---|
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}
$attributesプロパティを正規化します。
public void init ( ) |
public function init()
{
$attributes = [];
foreach ($this->attributes as $name => $attribute) {
if (!is_array($attribute)) {
$attributes[$attribute] = [
'asc' => [$attribute => SORT_ASC],
'desc' => [$attribute => SORT_DESC],
];
} elseif (!isset($attribute['asc'], $attribute['desc'])) {
$attributes[$name] = array_merge([
'asc' => [$name => SORT_ASC],
'desc' => [$name => SORT_DESC],
], $attribute);
} else {
$attributes[$name] = $attribute;
}
}
$this->attributes = $attributes;
}
指定された属性でソートするためのソートアクションにリンクするハイパーリンクを生成します。
ソート方向に基づいて、生成されたハイパーリンクのCSSクラスに "asc" または "desc" が追加されます。
public string link ( $attribute, $options = [] ) | ||
$attribute | string |
データのソートに使用する属性名。 |
$options | array |
ハイパーリンクタグの追加のHTML属性。ハイパーリンクのラベルとして使用される特別な属性 |
return | string |
生成されたハイパーリンク |
---|---|---|
throws | yii\base\InvalidConfigException |
属性が不明な場合 |
public function link($attribute, $options = [])
{
if (($direction = $this->getAttributeOrder($attribute)) !== null) {
$class = $direction === SORT_DESC ? 'desc' : 'asc';
if (isset($options['class'])) {
$options['class'] .= ' ' . $class;
} else {
$options['class'] = $class;
}
}
$url = $this->createUrl($attribute);
$options['data-sort'] = $this->createSortParam($attribute);
if (isset($options['label'])) {
$label = $options['label'];
unset($options['label']);
} else {
if (isset($this->attributes[$attribute]['label'])) {
$label = $this->attributes[$attribute]['label'];
} elseif ($this->modelClass !== null) {
$modelClass = $this->modelClass;
/** @var \yii\base\Model $model */
$model = $modelClass::instance();
$label = $model->getAttributeLabel($attribute);
} else {
$label = Inflector::camel2words($attribute);
}
}
return Html::a($label, $url, $options);
}
$sortParamの値をソート属性の配列に解析します。
形式は、昇順の場合は属性名のみ、降順の場合は属性名の前に -
を付ける必要があります。
たとえば、次の戻り値は、category
での昇順ソートと、created_at
での降順ソートになります。
[
'category',
'-created_at'
]
こちらも参照してください。
- 属性名の区切り文字の $separator。
- $sortParam
protected array parseSortParam ( $param ) | ||
$param | string |
$sortParam の値。 |
return | array |
有効なソート属性。 |
---|
protected function parseSortParam($param)
{
return is_scalar($param) ? explode($this->separator, $param) : [];
}
現在のソート情報を設定します。
public void setAttributeOrders ( $attributeOrders, $validate = true ) | ||
$attributeOrders | array|null |
属性名でインデックス付けされたソート方向。ソート方向は、昇順の場合は |
$validate | boolean |
$attributes と $enableMultiSort に対して、指定された属性の順序を検証するかどうか。検証が有効になっている場合、不正なエントリは削除されます。 |
public function setAttributeOrders($attributeOrders, $validate = true)
{
if ($attributeOrders === null || !$validate) {
$this->_attributeOrders = $attributeOrders;
} else {
$this->_attributeOrders = [];
foreach ($attributeOrders as $attribute => $order) {
if (isset($this->attributes[$attribute])) {
$this->_attributeOrders[$attribute] = $order;
if (!$this->enableMultiSort) {
break;
}
}
}
}
}
コメントするには、サインアップ または ログイン してください。