2

在插件中,我需要为两个类别停用 Shopware HTTP-Cache。手册说我应该发出这个事件:

Shopware()->Events()->notify(
    'Shopware_Plugins_HttpCache_InvalidateCacheId',
    array(
        'cacheId' => 'a14',
    )
);

a14 代表 ID 为 14 的文章。根据手册,ac 可用于取消缓存类别页面。所以我把它放在我的插件 bootstrap.php 中,以停止缓存 ID 为 113 和 114 的类别:

public function afterInit()
{
    Shopware()->Events()->notify(
        'Shopware_Plugins_HttpCache_InvalidateCacheId',
        array(
            'cacheId' => 'c113',
            'cacheId' => 'c114',
        )
    );
}

我已经在所有级别上手动清空了缓存,但是没有任何反应,无论好坏,没有抛出错误,并且当清空后重建缓存时,类别不会从缓存中删除。有人知道我应该改变什么吗?

这是完整的解决方案,感谢 Thomas 的回答,一切都在 Bootstrap.php 中完成:

首先订阅 PostDispatch_Frontend_Listing 事件:

public function install() 
{
    $this->subscribeEvent('Enlight_Controller_Action_PostDispatch_Frontend_Listing', 'onPostDispatchListing');
    return true;
}

其次创建一个函数在特定条件下发送 no-cache-header:

public function onPostDispatchListing(Enlight_Event_EventArgs $arguments)
{
    $response = $arguments->getResponse();
    $categoryId = (int)Shopware()->Front()->Request()->sCategory;
    if ($categoryId === 113 || $categoryId === 114) {
        $response->setHeader('Cache-Control', 'private, no-cache');
    }
}

第三次安装或重新安装插件,以便对事件的订阅将保留在数据库中。

4

1 回答 1

7

我认为最好的方法是添加一个插件,Cache-Control: no-cache为指定类别的响应添加一个标题。设置此标头后,类别不会存储在 HTTP 缓存中,您无需使其无效。

您可以收听该Enlight_Controller_Action_PostDispatch_Frontend_Listing事件并检查类别 ID 是否是您需要的,并将标头添加到响应中。

$response->setHeader('Cache-Control', 'private, no-cache');
于 2015-12-10T05:05:35.577 回答