在Silverstripe中如何实现拖拽重排子页面时自动发布?
Silverstripe子页面拖拽重排自动发布实现方案
实现原理
Silverstripe默认使用Sort字段存储子页面的排序值,用户在后台拖拽调整子页面顺序时,会修改对应页面的Sort字段值并触发数据写入流程,我们可以通过扩展SiteTree类的写入钩子,判断排序变更时自动执行发布操作。
实现步骤
- 新建扩展文件
app/src/Extension/AutoPublishOnSortExtension.php,写入以下代码:
<?php use SilverStripe\ORM\DataExtension; use SilverStripe\Versioned\Versioned; class AutoPublishOnSortExtension extends DataExtension { // 存储写入前的原始排序值 private $originalSortVal; public function onBeforeWrite() { parent::onBeforeWrite(); // 仅对已存在的页面记录原始排序值,新创建页面无需处理 if (!$this->owner->isInDB()) { return; } $this->originalSortVal = $this->owner->getOriginal('Sort'); } public function onAfterWrite() { parent::onAfterWrite(); // 仅当排序值发生变更、页面有草稿修改、当前用户有发布权限时自动发布 if ( $this->originalSortVal !== null && $this->originalSortVal != $this->owner->Sort && $this->owner->isModifiedOnStage(Versioned::DRAFT) && $this->owner->canPublish() ) { // 如需仅发布页面本身不连带发布关联依赖,可替换为 publishSingle() $this->owner->publishRecursive(); } } }
- 注册扩展,在
app/_config/extensions.yml中添加以下配置:
SilverStripe\CMS\Model\SiteTree: extensions: - AutoPublishOnSortExtension
- 执行
/dev/build?flush=all重建缓存后生效。
自定义调整说明
- 若你的站点使用自定义字段做排序,可将代码中所有
Sort替换为你的自定义排序字段名 - 如需仅对特定页面类型开启自动发布,可在
onAfterWrite的判断逻辑中增加页面类型校验,例如添加$this->owner instanceof 你的自定义页面类条件 - 若不需要保留页面修改记录,可额外添加
$this->owner->writeToStage(Versioned::LIVE)的相关逻辑
内容的提问来源于stack exchange,提问作者user3425625
相关产品推荐
相关产品推荐

