在 silverstripe cms 中,当内容管理者通过拖放操作对子页面进行重新排序时,系统会更新这些页面的 sort 字段,以反映其新的位置。然而,默认情况下,这些页面并不会自动发布到 live 阶段。相反,它们会被标记为“已修改”(modified),需要用户手动点击“发布”按钮才能使排序变更在前端生效。对于频繁进行页面排序的网站,这无疑增加了内容管理者的工作量,降低了操作效率。因此,实现子页面重排后自动发布,是提升 silverstripe cms 用户体验的关键需求。
要实现这一自动化功能,我们需要利用 Silverstripe CMS 的数据对象生命周期钩子(DataObject Lifecycle Hooks),特别是 onBeforeWrite() 和 onAfterWrite() 方法。
您需要创建一个继承自 Page 的自定义页面类型(例如 FooPage),并在其中重写 onBeforeWrite() 和 onAfterWrite() 方法。如果您希望将此功能应用于所有页面,可以考虑使用 Extension。
<?php use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Versioned\Versioned; /** * FooPage 示例:演示如何在子页面重排后自动发布。 * 您可以将其应用于任何需要此功能的 Page 类型。 */ class FooPage extends Page { /** * 用于存储在写入操作之前页面的发布状态。 * 如果页面在写入前已发布且不是草稿独有或已归档,则为 true。 * * @var bool */ private $wasPublishedBeforeWrite = false; /** * 在数据写入数据库之前执行。 * 用于在保存操作发生前捕获页面的发布状态。 */ protected function onBeforeWrite() { parent::onBeforeWrite(); // 检查页面在当前写入操作之前是否已发布。 // 以下条件确保我们只考虑那些已经在 Live 阶段存在, // 且不是草稿独有或已归档,并且其 Live 版本与 Stage 版本一致的页面。 $this->wasPublishedBeforeWrite = !$this->isArchived() && !$this->isOnDraftOnly() && !$this->isModifiedOnDraft(); } /** * 在数据写入数据库之后执行。 * 用于检测 Sort 字段是否变化,并根据预存的发布状态决定是否自动发布。 */ protected function onAfterWrite() { parent::onAfterWrite(); // 检查 Sort 字段是否发生变化,并且页面在写入操作之前已处于发布状态。 // 只有当页面位置被调整且页面之前已发布时,才执行自动发布。 if ($this->isChanged('Sort') && $this->wasPublishedBeforeWrite) { // 在 Silverstripe 4/5 中,`publish()` 方法用于将当前页面发布到 Live 阶段。 // 对于 Silverstripe 3,对应的方法是 `doPublish()`。 $this->publish(); } } }
private $wasPublishedBeforeWrite = false;:
protected function onBeforeWrite():
protected function onAfterWrite():
通过在自定义页面类型中巧妙地利用 onBeforeWrite 和 onAfterWrite 钩子,并结合对页面发布状态和 Sort 字段变化的精确判断,我们成功实现了 Silverstripe 子页面在重排后自动发布的功能。这一解决方案不仅提升了内容管理效率,减少了手动操作,还通过智能判断确保了只有已发布的页面才会被自动更新,避免了意外发布草稿页面的风险,从而优化了 Silverstripe CMS 的用户体验。
以上就是Silverstripe 子页面重排后自动发布实现指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号