fromholdio / silverstripe-sortable
添加一个扩展,使任何SilverStripe DataObject可排序。
3.1.0
2023-05-18 03:15 UTC
Requires
- silverstripe/framework: ~4.0 || ~5.0
README
添加一个扩展,使任何SilverStripe DataObject可排序。
也就是说,它执行了以下基本操作:
- 向您的对象添加一个类型为
DBInt
的Sort
字段 - 从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的功能可能非常有用。祝您玩得开心!