3

如果编辑 DataObject,是否有可能触发缓存更新?例如更新新闻数据对象应该更新显示这些新闻对象的页面缓存。

多谢,弗洛里安

4

3 回答 3

2

这是我可以使用StaticPublishQueue模块做的事情。在您的 NewsDataObject.php 中:

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

    $url = array();
    $pages = $this->Pages(); //has_many link to pages that include this DataObject
    foreach($pages as $page) {
        $pagesAffected = $page->pagesAffected();
        if ($pagesAffected && count($pagesAffected) > 0) {
            $urls = array_merge((array)$urls, (array)$pagesAffected);
        }
    }
    URLArrayObject::add_urls($urls);
}

这需要引用您的 DataObject 的每个页面,询问它的所有 URL 和任何相关页面的 URL(例如,引用该页面的虚拟页面),将所有 URL 编译成一个大数组,然后将该数组添加到静态发布队列。队列将逐渐处理,直到重新发布所有受影响的页面。

事件系统允许您在重新发布和重新发布触发器之间添加一个抽象层,但对于一些简单的事情您不一定需要使用它。相反,您可以直接将页面添加到队列中。(您可能还想阅读这篇描述 StaticPublishQueue 模块的博文

于 2013-10-24T08:54:03.583 回答
0

万一其他人遇到这种情况,并且不希望使用 StaticPublishQueue 模块而不是 StaticPublisher,它似乎在 StaticPublisher 中是可能的,以下对我有用:

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

    $urls = array();

    $pages = Page::get();
    foreach($pages as $page) {
        $urls[] = $page->Link();
    }

    $sp = new FilesystemPublisher();
    $sp->publishPages($urls);
}

注意最后两行,并使用 Page::get 指定需要更新的确切页面。

于 2014-05-06T16:02:27.200 回答
0

StaticPublisherQueue模块将为您处理

于 2013-10-15T05:03:27.460 回答