fromholdio/silverstripe-sortable

添加一个扩展,使任何SilverStripe DataObject可排序。

安装: 1,282

依赖项: 2

建议者: 0

安全: 0

星星: 1

关注者: 2

分支: 1

公开问题: 0

类型:silverstripe-vendormodule

3.1.0 2023-05-18 03:15 UTC

This package is auto-updated.

Last update: 2024-09-18 06:12:21 UTC


README

添加一个扩展,使任何SilverStripe DataObject可排序。

也就是说,它执行了以下基本操作:

  • 向您的对象添加一个类型为DBIntSort字段
  • 从CMS字段中移除自动生成的字段
  • 将您的对象的$default_sort设置为'Sort'
  • 管理在定义的范围内设置最大+1的Sort值,首次写入时

版本控制

经过一些混乱,v1.1.1和v2.1.1是相同的。为了清晰起见,以后只有2.x将接收任何必要的补丁/修复。

已添加返回类型,并已建立新的主要版本跟踪,为v3.x。因此,这需要PHP >=7.0,现在是主要跟踪,并将接收未来的任何增强/功能。

要求

SilverStripe 4或5

安装

composer require fromholdio/silverstripe-sortable

详细信息

一旦将扩展应用于您的数据对象,它就全部是即插即用的 - 唯一的例外是。

要允许扩展自动生成基于最大+1的默认值,您需要告诉扩展您从哪个组的范围中获取最大值。

因此,在您要扩展/应用Sortable的对象上,您可以添加一个getSortableScope()方法。此方法应返回一个在Sortable上运行 ->max('Sort')DataList

如果没有getSortableScope()方法,作为后备,扩展将获取此类型的所有对象,排除当前对象,并在该列表上运行->max('Sort')

下面是一个示例。

使用示例

我们正在将Sortable应用于Widget数据对象

class Widget extends DataObject
{
    // or apply via config.yml
    private static $extensions = [
        Sortable::class
    ];
    
    public function getSortableScope()
    {
        # this is the default behaviour
        return self::get()->exclude('ID', $this->ID);
    }
}

就是这样!它假设Widget将在全球范围内相互排序。

如果Widget与页面有一个一对多关系,并且我们想要按页面排序它们,则可以执行以下操作

class Widget extends DataObject
{
    private static $has_one = [
        'Page' => \Page::class  // (assuming a has_many on Page for Widgets)
    ];
    
    // or apply via config.yml
    private static $extensions = [
        Sortable::class
    ];
    
    public function getSortableScope()
    {
        return self::get()
            ->filter('PageID', $this->PageID)
            ->exclude('ID', $this->ID);
    }
}

根据您的数据模型结构,传递范围DataList的功能可能非常有用。祝您玩得开心!