undefinedoffset/sortablegridfield

为 Silverstripe 的 GridField 添加拖放功能

安装次数: 957,986

依赖关系: 65

建议者: 15

安全: 0

星标: 93

关注者: 10

分支: 62

类型:silverstripe-vendormodule

2.2.0 2023-05-08 13:51 UTC

README

CI Latest Stable Version Latest Unstable Version Total Downloads License

为 Silverstripe 的 GridField 添加拖放功能

要求

  • Silverstripe 4.11+ 或 5.0+

安装

安装仅通过 composer 支持

composer require undefinedoffset/sortablegridfield
  • 运行 dev/build?flush=all 重新生成清单
  • 进入 CMS 并首次使用 GridFieldSortableRows 组件时,您可能需要在地址末尾添加 ?flush=all 以强制重新生成模板

用法

要启用对 has_many 关系的排序,在您的数据对象上设置一个整数字段。对于 has_many 关系,请确保将 $default_sort 设置在 DataObject 上为此新整数字段,以确保在请求关系时应用排序顺序。对于 many_many 关系,您必须在 DataObject 上添加一个定义关系的 $many_many_extraFields 静态,有关更多信息,请参阅 SilverStripe 文档。如果您正在使用 many_many 关系,您需要执行自定义获取器来设置此关系的排序顺序,以便在前端使用,下面是示例。此外,对于 many_many 关系,GridField 的名称 必须 与关系名称相同,否则将发生错误。对于新的 DataObject,您不需要在您的 DataObject 中自行递增排序顺序,GridFieldSortableRows 将在下次显示网格时自动执行此操作。

public function getMyManyManyRelationship() {
    return $this->getManyManyComponents('MyManyManyRelationship')->sort('SortColumn');
}

要启用 GridField 上的拖放排序,请将以下内容添加到您的 GridField 配置中,同时确保将命名空间 UndefinedOffset\SortableGridField\Forms 添加到您的文件中。

//Namespace imports should be added to the top of your file
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;

$myGridConfig->addComponent(new GridFieldSortableRows('{Column to store sort}'));

要将项目移动到另一个页面,请将行拖动到 GridField 左右两侧的相应移动到页面按钮上,然后释放。

完整代码示例

事件

GridFieldSortableRows 提供 4 个 "事件",分别为 onBeforeGridFieldRowSort()onAfterGridFieldRowSort()onBeforeGridFieldPageSort()onAfterGridFieldPageSort()。这些 "事件" 传递给 GridFieldSortableRows 中使用的 DataList 的一个副本,在页面排序的情况下,此列表显示当前页面加减一个对象。对于在 ModelAdmin 后代上的 GridFieldSortableRows,如果这些事件没有拥有者 DataObject,则在这些事件上调用 ModelAdmin,如果您正在使用 GridFieldSortableRowsGridField 上对一个 DataObject 的关系进行操作,则在这些事件上调用该 DataObject

追加到顶部而不是底部

默认情况下,为了在大数据集上的性能,GridFieldSortableRows 将新记录追加到列表的底部,但是您可以通过在您的 GridFieldSortableRows 实例上调用 setAppendToTop(true) 来设置新记录追加到顶部。

//Namespace imports should be added to the top of your file
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;

$myGridConfig->addComponent($sortable = new GridFieldSortableRows('SortOrder'));
$sortable->setAppendToTop(true);

处理版本化记录

默认情况下,GridFieldSortableRows 不会更新版本化以外的任何其他阶段,但是您可以通过调用 setUpdateVersionedStage() 并传递要更新的阶段名称以及基本阶段来启用此功能。例如,传递 "Live" 将在任何排序发生时也更新 "Live" 阶段。

//Namespace imports should be added to the top of your file
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;

$myGridConfig->addComponent($sortable = new GridFieldSortableRows('SortOrder'));
$sortable->setUpdateVersionedStage('Live');

重写默认关系名称

默认情况下,关系名称来自 GridField 的名称,但您可以通过调用 setCustomRelationName() 并传入关系名称来覆盖此查找。这允许您在同一个表单上具有多个 GridFields,它们与同一个 many_many 列交互,可能略有不同。

//Namespace imports should be added to the top of your file
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;

$myGridConfig->addComponent($sortable = new GridFieldSortableRows('SortOrder'));
$sortable->setCustomRelationName('MyRelationship');

报告问题

在报告问题时,请确保您指定正在使用 SilverStripe 的哪个版本,例如 3.0.5、3.1beta3、3.0-master 等。还请确保包含您收到的任何 JavaScript 或 PHP 错误,对于 PHP 错误,请确保包含完整的堆栈跟踪。还请包括您的实现代码(设置网格字段的地方)以及您如何产生该问题。您可能还需要提供一些类以帮助重现问题。坚持问题,记住您看到的是问题而不是模块维护者,所以可能需要很多问题才能找到解决方案或答案。

备注

  • 在使用 GridFieldManyRelationHandler 时,请确保在例如 GridFieldManyRelationHandler 之前将 GridFieldSortableRows 添加到您的配置中。
//Namespace imports should be added to the top of your file
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;

$config->addComponent(new GridFieldSortableRows('SortOrder'), 'GridFieldManyRelationHandler');

贡献

翻译

自然语言字符串的翻译通过第三方翻译界面 transifex.com 管理。新添加的字符串将定期上传到那里进行翻译,任何新的翻译都将合并到项目源代码中。

请使用 https://www.transifex.com/projects/p/silverstripe-sortablegridfield 来贡献翻译,而不是发送带有 YAML 文件的拉取请求。