paulzi/yii2-sortable

Yii2 的可排序行为

安装次数: 241 017

依赖者: 4

建议者: 0

安全: 0

星星: 15

关注者: 4

分支: 3

开放性问题: 2

类型:yii2-extension

v1.0.3 2022-01-10 13:31 UTC

This package is auto-updated.

Last update: 2024-09-10 19:09:26 UTC


README

它实现了控制 ActiveRecord 排序顺序的能力。

Packagist Version Code Coverage Build Status Total Downloads

安装

通过 Composer 安装

composer require paulzi/yii2-sortable

或者将以下内容添加到你的 composer.json 文件的 require 部分。

"paulzi/yii2-sortable" : "^1.0"

require

迁移

在你的模型中添加一个签名整数列。为了快速操作行为,添加索引以用于范围字段和排序属性,例如

$this->createIndex('parent_sort', '{{%item}}', ['parent_id', 'sort']);

配置

use paulzi\sortable\SortableBehavior;

class Sample extends \yii\db\ActiveRecord
{
    public function behaviors() {
        return [
            [
                'class' => SortableBehavior::className(),
            ],
        ];
    }
}

选项

  • $query = null - 属性列表、回调或 ActiveQuery,用于查找范围元素。见下文。
  • $sortAttribute = 'sort' - 表架构中的排序属性。
  • $step = 100 - 元素之间的间隙大小。
  • $joinMode = true - 未分配值的搜索方法。当 joinMode 为 true 时,使用与自身连接的表。否则,使用窗口搜索。窗口大小由 $windowSize 属性定义。
  • $windowSize = 1000 - 当 joinMode 为 false 时,定义搜索窗口的大小。

$query 选项的详细信息:属性列表 - 一种简单的方式,通过具有相同内容字段的元素来限定范围,不需要别名。当使用 joinMode 时,您必须使用 tableName() 别名在 ActiveQuery 中。

例如,

public function behaviors()
{
    return [
        [
            'class' => SortableBehavior::className(),
            'query' => ['parent_id'],
        ]
    ];
}

这等同于

public function behaviors()
{
    return [
        [
            'class' => SortableBehavior::className(),
            'query' => function ($model) {
                $tableName = $model->tableName();
                return $model->find()->andWhere(["{$tableName}.[[parent_id]]" => $model->parent_id]);
            },
        ]
    ];
}

使用方法

获取排序属性值

$model = Sample::findOne(1);
$position = $model->getSortablePosition();

移动到第一个项目

$model = new Sample(['parent_id' => 1]);
$model->moveFirst()->save(); // inserting new node

移动到最后一个项目

$model = Sample::findOne(1);
$model->moveLast()->save(); // move existing node

移动到指定位置的项目

$model = Sample::findOne(1);
$model->moveTo(-33, true)->save(); // move to position -33, and move existing items forward
$model = Sample::findOne(2);
$model->moveTo(4, false)->save(); // move to position 4, and move existing items backward

将项目移动到另一个项目之前: 注意:如果您需要更改范围,请手动进行

$model1 = new Sample(['parent_id' => 1]);
$model2 = Sample::findOne(2);
$model1->moveBefore($model2)->save(); // move $model1 before $model2

将项目移动到另一个项目之后: 注意:如果您需要更改范围,请手动进行

$model1 = Sample::findOne(1);
$model2 = Sample::findOne(2);
$model1->parent_id = $model2->parent_id;
$model1->moveAfter($model2)->save(); // move $model1 after $model2 with change scope

与相邻元素一起重新排序项目

$model = Sample::findOne(1);
$model->reorder(true); // reorder with center zero
$model = Sample::findOne(2);
$model->reorder(false); // reorder from zero

SortableTrait

如果您需要,可以使用可选的 SortableTrait(例如,您正在使用类似 ISortable 接口的东西)。