在SilverStripe中触发页面的新版本

在SilverStripe中触发页面的新版本,silverstripe,Silverstripe,我想知道是否有办法通过代码在SilverStripe中的页面对象上创建新版本 我使用模块静态缓存页面。我面临的问题是,当保存数据对象时,它不会触发父页面上的发布,因此缓存版本已过时。我通过在父页面对象上运行doPublish()克服了这一问题。但这显然会发布页面,即使发布者还没有准备好让新的更改生效 以下是我当前在数据对象上的内容: function onAfterWrite() { parent::onAfterWrite(); // Get the current page

我想知道是否有办法通过代码在SilverStripe中的
页面
对象上创建新版本

我使用模块静态缓存页面。我面临的问题是,当保存数据对象时,它不会触发父页面上的发布,因此缓存版本已过时。我通过在父
页面
对象上运行
doPublish()
克服了这一问题。但这显然会发布页面,即使发布者还没有准备好让新的更改生效

以下是我当前在数据对象上的内容:

function onAfterWrite() {
    parent::onAfterWrite();

    // Get the current page
    $page = Controller::curr()->currentPage();
    if($page) {
        // Publish the page
        $page->doPublish();
    }
}
保存
数据对象
并将
页面
设置为草稿后,是否有办法创建页面的新版本

我已经审问过这件事,但从那里找不到任何有用的东西


任何想法都会有帮助。

我假设您已经在SiteTree对象和DataObject(即hasOne、hasMany或ManyMany)之间创建了关系。如果是这样的话,您应该有一个从DO back到SiteTree的反向关系(我们称之为ParentPage)

您可以使用DataObject的onAfterWrite()调用在页面上触发草稿保存


你的页面是什么样子的?我假设编写后的
onAfterWrite
正在进行中,因此如果有
已返回到页面,您会发布
$this->YourRelationPage()
而不是
控制器::curr()->currentPage()
?我使用了
控制器::curr()->currentPage()
因为我有一些嵌套很深的对象关系,所以获取DataObject 4层的页面对象会有点混乱/棘手。当前的
控制器::curr()->currentPage()
将返回父页面,无论嵌套的深度有多深。为了测试,我刚刚将
$page
变量更新为
页面
有一个关系,问题仍然存在。这对我来说也是有意义的,但是写操作似乎没有使版本升级,也没有将页面置于草稿模式…根据,您可以尝试将$forceWrite设置为true,例如
$this->ParentPage()->write(false,false,true)尝试执行
$this->ParentPage()->writeToStage('Stage')
不会指导您将FilesystemPublisher扩展添加到DataObject类,然后添加受其更改影响的公共函数页面。其主要思想不是发布父页面,而是使其缓存版本无效。啊,这不是基于事件的事情。但我认为您需要报告,url需要从该数据对象中失效。或者,如果这不起作用,一种方法是删除下一代上的父URL缓存文件>,该文件应重新创建为缺少的URL。但是我建议首先尝试将扩展添加到需要告诉路径它们可能被使用的数据项目中。作为一项建议,我们在几个项目中使用了,它有一些事件,您可以触发这些事件来进行更新。
class MyDataObject {
 //define a relationship back to the parent
 private static $belongs_to = array('ParentPage' => 'Page');

 //define this function on your DataObject
 public function onAfterWrite() {
  parent::onAfterWrite();

  //trigger a write (but not a publish) on your parent page
  $this->ParentPage()->write();
 }
}