kirillemko/yii2-order-behavior

此包的最新版本(1.0.3)没有可用的许可证信息。

管理模型订单

安装: 56

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分叉: 0

开放性问题: 0

类型:yii2-extension

1.0.3 2022-07-25 11:35 UTC

This package is auto-updated.

Last update: 2024-09-25 16:24:24 UTC


README

此扩展为ActiveRecord自定义记录排序设置提供支持。

安装

通过composer安装此扩展是首选方式。

运行以下命令:

php composer.phar require --prefer-dist kirillemko/order-behavior

或添加以下内容到您的composer.json文件的require部分:

"kirillemko/order-behavior": "*"

用法

此扩展通过基于列的位置索引支持自定义记录的排序设置。

此扩展为Yii2中的此类解决方案提供支持,提供了[[\kirillemko\ar\position\OrderBehavior]] ActiveRecord行为。您可以通过以下方式将其附加到模型类:

class Item extends ActiveRecord
{
    public function behaviors()
    {
        return [
            'positionBehavior' => [
                'class' => OrderBehavior::className(),
                'positionAttribute' => 'order',
            ],
        ];
    }
}

行为使用数据库实体特定的整数字段来设置位置索引。因此,模型所引用的数据库实体必须包含[[positionAttribute]]字段。

为了按正确顺序显示自定义列表,您应该按[[positionAttribute]]升序排序

$records = Item::find()->orderBy(['position' => SORT_ASC])->all();
foreach ($records as $record) {
    echo $record->position . ', ';
}
// outputs: 1, 2, 3, 4, 5,...

位置保存

附加后,行为自动填充新记录的positionAttribute值,将其放置在列表末尾

echo Item::find()->count(); // outputs: 4

$item = new Item();
$item->save();

echo $item->position // outputs: 5

但是,您也可以明确设置新记录的位置

echo Item::find()->count(); // outputs: 4

$item = new Item();
$item->position = 2; // enforce position '2'
$item->save();

echo $item->position // outputs: 2 !!!

位置切换

可以使用以下方法将现有记录移动到另一个位置:

  • [[movePrev()]] - 将记录向列表开头移动一个位置。
  • [[moveNext()]] - 将记录向列表末尾移动一个位置。
  • [[moveFirst()]] - 将记录移动到列表开头。
  • [[moveLast()]] - 将记录移动到列表末尾。
  • [[moveToPosition()]] - 将所有者记录移动到特定位置。

您还可以通过直接提供给positionAttribute的属性来更改记录的位置

$item = Item::find()->andWhere(['position' => 3])->one();
$item->position = 5; // switch position to '5'
$item->save();

组内位置

有时单个数据库实体包含多个列表,这些列表需要自定义排序,通过分组属性逻辑上分离。例如:FAQ问题可以按类别分组,而单个类别中的问题应手动排序。在这种情况下,可以使用[[\yii2tech\ar\position\PositionBehavior::$groupAttributes]]

class FaqQuestion extends ActiveRecord
{
    public function behaviors()
    {
        return [
            'positionBehavior' => [
                'class' => PositionBehavior::className(),
                'positionAttribute' => 'position',
                'groupAttributes' => [
                    'categoryId' // multiple lists varying by 'categoryId'
                ],
            ],
        ];
    }
}

在这种情况下,行为将使用groupAttributes的所有者值作为位置计算和更改的附加条件

echo FaqQuestion::find()->andWhere(['categoryId' => 1])->count(); // outputs: '4'
echo FaqQuestion::find()->andWhere(['categoryId' => 2])->count(); // outputs: '7'

$record = new FaqQuestion();
$record->categoryId = 1;
$record->save();
echo $record->position // outputs: '5'

$record = new FaqQuestion();
$record->categoryId = 2;
$record->save();
echo $record->position // outputs: '8'

列表导航

应用了自定义位置顺序的记录将形成一个链式列表,您可以根据需要导航。您可以使用[[\yii2tech\ar\position\PositionBehavior::getIsFirst()]]和[[\yii2tech\ar\position\PositionBehavior::getIsLast()]]方法确定特定记录是否是列表中的第一个或最后一个。例如

echo Item::find()->count(); // outputs: 10

$firstItem = Item::find()->andWhere(['position' => 1])->one();
echo $firstItem->getIsFirst(); // outputs: true
echo $firstItem->getIsLast(); // outputs: false

$lastItem = Item::find()->andWhere(['position' => 10])->one();
echo $lastItem->getIsFirst(); // outputs: false
echo $lastItem->getIsLast(); // outputs: true

有一个特定的记录实例,您可以使用[[\yii2tech\ar\position\PositionBehavior::getNext()]]或[[\yii2tech\ar\position\PositionBehavior::getPrev()]]方法始终找到位于其之前或之后的记录。例如

$item = Item::find()->andWhere(['position' => 5])->one();

$nextItem = $item->findNext();
echo $nextItem->position; // outputs: 6

$prevItem = $item->findPrev();
echo $prevItem->position; // outputs: 4

您还可以获取列表中的第一个和最后一个记录。例如

echo Item::find()->count(); // outputs: 10
$item = Item::find()->andWhere(['position' => 5])->one();

$firstItem = $item->findFirst();
echo $firstItem->position; // outputs: 1

$lastItem = $item->findLast();
echo $lastItem->position; // outputs: 10