【发布时间】:2013-07-16 02:11:46
【问题描述】:
如果 DataObject 被编辑,是否有可能触发缓存更新? 例如更新新闻数据对象应该更新显示这些新闻对象的页面缓存。
多谢, 弗洛里安
【问题讨论】:
标签: caching content-management-system silverstripe
如果 DataObject 被编辑,是否有可能触发缓存更新? 例如更新新闻数据对象应该更新显示这些新闻对象的页面缓存。
多谢, 弗洛里安
【问题讨论】:
标签: caching content-management-system silverstripe
这是我可以使用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)
【讨论】:
StaticPublisherQueue 模块将为您处理。
【讨论】:
如果其他人遇到这种情况,并且不希望使用 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 指定需要更新的确切页面。
【讨论】: