如何为购物车块实现magento缓存打孔

Posted

技术标签:

【中文标题】如何为购物车块实现magento缓存打孔【英文标题】:How to implement magento cache hole punching for shopping cart block 【发布时间】:2012-12-02 08:25:46 【问题描述】:

我使用的是 Magento EE 1.12 版并启用了全页缓存

a) 我的产品详情页面已缓存 b)因此我在此页面中的购物车没有显示动态商品数量 c)所以我无法在我的产品详细信息页面中显示有效的购物车项目数

我遵循的步骤

1) 我创建了一个块并从 header.phtml 调用 2) 试图使 topcart.phtml 块不被缓存

作为 magento 的新手,我得到了一些缓存打孔的链接

我点击了以下链接,但没有成功

我的文件结构

app-code-local-Enterprise-PageCache->etc-cache.xml

和 PageCache - 模型 - 容器 - TopCart.php

代码如下图

help link one

help link two

link three

我创建了文件 cache.xml 和 cart.php 容器文件

 <page_html_topcart>
        <block>page/html_topcart</block>
        <name>topcart</name>
        <placeholder>PAGE_HTML_HEADER_CART</placeholder>
        <container>Enterprise_PageCache_Model_Container_TopCart</container>
        <cache_lifetime>36400</cache_lifetime>
    </page_html_topcart>

这是我的 topcart.php 容器文件的样子

  protected function _getIdentifier()

    $cacheId = $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '')
        . '_'
        . $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_LOGGED_IN, '');

    return $cacheId;


 protected function _getCacheId()

    return 'CONTAINER_TOPCART_' . md5($this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier());


protected function _renderBlock()

    $block = $this->_getPlaceHolderBlock(); //('page/html_header_cart');
    Mage::dispatchEvent('render_block', array('block' => $block, 'placeholder' => $this->_placeholder));
    return $block->toHtml();

请帮助我提供有用的链接和步骤

【问题讨论】:

你的问题不是很清楚,但如果我理解你的问题,你可以将你想要的数据存储在 cookie 中并用 javscript 显示 @OSdave 我无法将其存储在 cookie 中,因为它的购物车项目计数显示在标题块中,因为我的产品详细信息页面正在全页缓存中缓存,因此无法使购物车动态化那是我的问题, 请看我在另一篇关于 FPC 的帖子中的回答。也许有帮助:***.com/questions/12948235/… 【参考方案1】:

我遇到了同样的问题。所以,我认为,问题在于,在这种情况下我们没有可缓存的模板。因此,如果您按照您的方式缓存它(就像我一样),您最终会在缓存文件中得到一个 base64 编码的链接列表。为了验证这一点,我解压缩了 var/full_page_cache 中的文件 - 我们开始了:购物车计数被缓存,即使您的购物车更改也不会更改,并且它在服务器端不可替换(至少不是在干净的方式)。

这种行为的原因很简单:对于 FPC,您只渲染模板,传递一些值。但是模板只在这种特殊情况下呈现一个列表,只访问一个块方法(getLinks)。在您的布局 xml 文件中,您会发现一些“addLink”调用,它提供该块,这就是为什么所有结果都变成 base64 编码并最终出现在您的缓存文件中。您的容器无法访问它们。

但我认为,有办法解决这个问题。只需收集您想要呈现的链接并为此创建自定义模板和自定义块。您现在可以以适当的方式缓存它了。

【讨论】:

您能否详细解释一下如何在自定义块中收集和呈现这些链接?那我应该提供什么 PageCache 容器呢?谢谢

以上是关于如何为购物车块实现magento缓存打孔的主要内容,如果未能解决你的问题,请参考以下文章

Magento:将静态块添加到结帐购物车

在 Magento 1.8.1 中编辑/自定义购物车块

在多种货币之间切换时,Magento Enterprise 整页缓存(FPC)购物车侧边栏问题

无法从 Magento 的购物车中获取小计?

Magento 使用 varnish 进行整页缓存

Magento2 主题迷你购物车 KO 模板问题