如果编辑 DataObject,是否有可能触发缓存更新?例如更新新闻数据对象应该更新显示这些新闻对象的页面缓存。
多谢,弗洛里安
如果编辑 DataObject,是否有可能触发缓存更新?例如更新新闻数据对象应该更新显示这些新闻对象的页面缓存。
多谢,弗洛里安
这是我可以使用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 模块的博文)
万一其他人遇到这种情况,并且不希望使用 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 指定需要更新的确切页面。
StaticPublisherQueue模块将为您处理。