You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Silverstripe中如何实现拖拽重排子页面时自动发布?

Silverstripe子页面拖拽重排自动发布实现方案

实现原理

Silverstripe默认使用Sort字段存储子页面的排序值,用户在后台拖拽调整子页面顺序时,会修改对应页面的Sort字段值并触发数据写入流程,我们可以通过扩展SiteTree类的写入钩子,判断排序变更时自动执行发布操作。

实现步骤

  1. 新建扩展文件 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();
        }
    }
}
  1. 注册扩展,在 app/_config/extensions.yml 中添加以下配置:
SilverStripe\CMS\Model\SiteTree:
  extensions:
    - AutoPublishOnSortExtension
  1. 执行/dev/build?flush=all重建缓存后生效。

自定义调整说明

  • 若你的站点使用自定义字段做排序,可将代码中所有Sort替换为你的自定义排序字段名
  • 如需仅对特定页面类型开启自动发布,可在onAfterWrite的判断逻辑中增加页面类型校验,例如添加$this->owner instanceof 你的自定义页面类条件
  • 若不需要保留页面修改记录,可额外添加$this->owner->writeToStage(Versioned::LIVE)的相关逻辑

内容的提问来源于stack exchange,提问作者user3425625

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:05