silverstripe static publisher - 受DataObject更改影响的页面

时间:2013-07-17 13:35:10

标签: caching content-management-system silverstripe

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

很多, 弗洛里安

3 个答案:

答案 0 :(得分:1)

以下是使用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编译成一个大数组,然后添加该数组到静态发布队列。队列将逐渐处理,直到重新发布所有受影响的页面。

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

答案 1 :(得分:0)

StaticPublisherQueue模块将为您处理。

答案 2 :(得分: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指定需要更新的确切页面。