Class rootlocal\widgets\sortable\SortableGridBehavior
Inheritance | rootlocal\widgets\sortable\SortableGridBehavior » yii\base\Behavior |
---|---|
Implements | rootlocal\widgets\sortable\SortableGridBehaviorInterface |
Behavior for sortable Yii2 GridView widget.
For example:
public function behaviors()
{
return [
'sort' => [
'class' => SortableGridBehavior::class,
'sortableAttribute' => 'sort_order',
'scope' => function ($query) {
$query->andWhere(['group_id' => $this->group_id]);
},
],
];
}
Public Properties
Property | Type | Description | Defined By |
---|---|---|---|
$afterGridSort | \rootlocal\widgets\sortable\Closure|mixed | Callable function for after before insert sorting | rootlocal\widgets\sortable\SortableGridBehavior |
$scope | \rootlocal\widgets\sortable\Closure|mixed | Callable function for query | rootlocal\widgets\sortable\SortableGridBehavior |
$sortableAttribute | string | Database field name for row sorting default value: sort_order | rootlocal\widgets\sortable\SortableGridBehavior |
Public Methods
Method | Description | Defined By |
---|---|---|
beforeInsert() | ModelEvent an event that is triggered before inserting a record. | rootlocal\widgets\sortable\SortableGridBehavior |
events() | Declares event handlers for the owner's events. | rootlocal\widgets\sortable\SortableGridBehavior |
getSortableAttribute() | Getting Database field name for row sorting default value: sort_order | rootlocal\widgets\sortable\SortableGridBehavior |
gridSort() | Сортировка строк таблицы перетаскиванием "Drag-and-drop" | rootlocal\widgets\sortable\SortableGridBehavior |
gridSortUpOrDownButton() | Сортировка строк таблицы нажатием на кнопки up или down | rootlocal\widgets\sortable\SortableGridBehavior |
setSortableAttribute() | Setting Database field name for row sorting | rootlocal\widgets\sortable\SortableGridBehavior |
Property Details
Callable function for after before insert sorting
Callable function for query
Database field name for row sorting default value: sort_order
Method Details
ModelEvent an event that is triggered before inserting a record.
public void beforeInsert ( ) | ||
throws | \yii\base\InvalidConfigException |
---|
public function beforeInsert(): void
{
/** @var ActiveRecord $model */
$model = $this->owner;
if (!$model->hasAttribute($this->getSortableAttribute())) {
throw new InvalidConfigException("Invalid sortable attribute `{$this->getSortableAttribute()}`.");
}
if (empty($model->{$this->getSortableAttribute()})) {
$query = $model::find();
if (is_callable($this->scope)) {
call_user_func($this->scope, $query);
}
/* Override model alias if defined in the model's class */
$query->from([$model::tableName() => $model::tableName()]);
$maxOrder = $query->max('{{' . trim($model::tableName(), '{}')
. '}}.[[' . $this->getSortableAttribute() . ']]');
$model->{$this->getSortableAttribute()} = $maxOrder + 1;
}
}
Declares event handlers for the owner's events.
public array events ( ) | ||
return | array |
Events (array keys) and the corresponding event handler methods (array values). |
---|
public function events(): array
{
return [BaseActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert'];
}
Getting Database field name for row sorting default value: sort_order
public string getSortableAttribute ( ) |
public function getSortableAttribute(): string
{
if ($this->_sortableAttribute === null) {
$this->_sortableAttribute = 'sort_order';
}
return $this->_sortableAttribute;
}
Сортировка строк таблицы перетаскиванием "Drag-and-drop"
public array gridSort ( array $items = [] ) | ||
$items | array |
['old_primary_key' => 'new_primary_key'] |
return | array |
New values attributes (new sorted values)
[['id' => |
---|---|---|
throws | \yii\base\InvalidConfigException | |
throws | Throwable |
public function gridSort(array $items = []): array
{
/** @var ActiveRecord $model */
$model = $this->owner;
/** @var ?string $primaryKey */
$primaryKey = !empty($model::primaryKey()) && is_array($model::primaryKey()) ? $model::primaryKey()[0] : null;
if ($primaryKey === null) {
throw new InvalidConfigException("Model does not have primaryKey");
}
if (!$model->hasAttribute($this->getSortableAttribute())) {
throw new InvalidConfigException(
"Model does not have sortable attribute `{$this->getSortableAttribute()}`."
);
}
/** @var int[] $newOrder */
$newOrder = [];
/** @var ActiveRecord[] $models */
$models = [];
foreach ($items as $old => $new) {
$models[$new] = $model::find()
->select([$this->getSortableAttribute(), $primaryKey])
->where([$primaryKey => $new])->one();
$newOrder[$old] =
!empty($models[$new]->{$this->getSortableAttribute()})
? $models[$new]->{$this->getSortableAttribute()} : $new;
}
$transaction = $model::getDb()->beginTransaction();
$result = [];
try {
foreach ($newOrder as $modelId => $orderValue) {
$models[$modelId]->updateAttributes([$this->getSortableAttribute() => $orderValue]);
$result[] = ['id' => $modelId, 'sort_id' => $orderValue];
}
$transaction->commit();
} catch (Exception|Throwable $e) {
$transaction->rollBack();
Yii::error($e->getMessage(), self::class);
return [];
}
if (is_callable($this->afterGridSort)) {
call_user_func($this->afterGridSort, $model);
}
return $result;
}
Сортировка строк таблицы нажатием на кнопки up или down
public array gridSortUpOrDownButton ( string $button, integer $id ) | ||
$button | string |
String name "up" or "down" action button |
$id | integer |
Primary Key value Model |
return | array |
New values models New values attributes (new sorted values)
[['id' => |
---|---|---|
throws | \yii\web\BadRequestHttpException |
public function gridSortUpOrDownButton(string $button, int $id): array
{
/** @var ActiveRecord $model */
$model = $this->owner;
/** @var ?string $primaryKey */
$primaryKey = !empty($model::primaryKey()) && is_array($model::primaryKey()) ? $model::primaryKey()[0] : null;
if ($primaryKey === null) {
throw new InvalidConfigException("Model does not have primaryKey");
}
$owner = $model->find()
->select([$this->getSortableAttribute(), $primaryKey])
->where([$primaryKey => $id])->one();
$target = $model::find()->select([$this->getSortableAttribute(), $primaryKey]);
if ($button === 'up') {
$target = $target->andWhere($model::tableName() . '.' . $this->sortableAttribute . ' < :sort', [
':sort' => $owner->{$this->sortableAttribute}
])->orderBy([$this->sortableAttribute => SORT_DESC])->one();
} else {
$target = $target->andWhere($model::tableName() . '.' . $this->sortableAttribute . ' > :sort', [
':sort' => $owner->{$this->sortableAttribute}
])->orderBy([$this->sortableAttribute => SORT_ASC])->one();
}
if ($target === null) {
throw new BadRequestHttpException('Can\'t find target model');
}
$transaction = $model->getDb()->beginTransaction();
try {
$ownerSortId = $owner->{$this->sortableAttribute};
$targetSortId = $target->{$this->sortableAttribute};
$owner->{$this->sortableAttribute} = $targetSortId;
$target->{$this->sortableAttribute} = $ownerSortId;
if ($owner->save(false)
&& $target->save(false)) {
$transaction->commit();
return [
0 => ['id' => $owner->getPrimaryKey(), 'sort_id' => $owner->{$this->sortableAttribute}],
1 => ['id' => $target->getPrimaryKey(), 'sort_id' => $target->{$this->sortableAttribute}],
];
}
$transaction->rollBack();
} catch (Exception|Throwable $e) {
$transaction->rollBack();
Yii::error($e->getMessage(), self::class);
}
throw new BadRequestHttpException('Unknown error');
}
Setting Database field name for row sorting
public void setSortableAttribute ( string $sortableAttribute ) | ||
$sortableAttribute | string |
public function setSortableAttribute(string $sortableAttribute): void
{
$this->_sortableAttribute = $sortableAttribute;
}