Magento 1.9 Block Cache - 防止Mage目录块产品视图上的表单密钥缓存

时间:2014-08-04 20:08:13

标签: forms magento block magento-1.6 magento-1.9

Hey Magento Professionals,

我使用Magentos Block Cache机制在产品页面上获得更好的性能。 它在Magento CE 1.6.2上运行得很好但是现在我升级到CE 1.9.0.1并且阻止缓存与Magentos新表单键不匹配。

产品页面仍在缓存中,但它们自然会被缓存,包括表单操作中的新表单键。当另一个用户尝试将产品添加到购物车时,它将无法工作,因为其他用户表单密钥已被缓存。 因此,没有添加任何产品,购物车仍然是空的。

有没有办法将表单密钥注入缓存代码或其他方式来缓存产品页面?

我的扩展Mage_Catalog_Block_Product_View中的缓存方法如下所示

protected function _construct()
{
        $this->addData(array(
            'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG . "_" . $this->getProduct()->getId()),
        ));
}

public function getCacheKey()
{
    if (!$this->hasData('cache_key')) {
        //$cacheKey = LAYOUTNAME_STORE+ID_PRODUCT+ID
        $cacheKey = $this->getNameInLayout().'_STORE'.Mage::app()->getStore()->getId().'_PRODUCT'.$this->getProduct()->getId();         
        $this->setCacheKey($cacheKey);
    }
    return $this->getData('cache_key');
}

public function getCacheLifetime()
{     
      if($this->getNameInLayout()!='product.info') return null;
      if(!$this->cacheEnabled()) return null;         
      return 9999999999;
}

public static function cacheEnabled() {
    return true;
}   

2 个答案:

答案 0 :(得分:4)

我现在找到了一个quickfix,但仍在寻找更好的解决方案。 现在我在扩展块中添加了_afterToHtml($ html)方法,并在从缓存中返回html之前注入form_key。 如果其他人需要此quickfix,请确保if条件正确。它确保只在我真正缓存的块中完成,而不是在其他产品视图块上完成。

所以这是我目前的quickfix:

public function _afterToHtml($html) {
    if($this->getNameInLayout() == 'product.info') {
        $formkey = Mage::getSingleton('core/session')->getFormKey();
        $formkey = "/form_key/".$formkey."/";        
        $html = preg_replace("/\/form_key\/[a-zA-Z0-9,.-]+\//", $formkey, $html); 
    }  
    return parent::_afterToHtml($html);
}

我正在考虑将来切换到整页缓存,但修复此问题会很好,因为配置另一个缓存方法也需要花费很多时间。

如果你有比这个肮脏的快速解决方案更好的想法,请帮助。

答案 1 :(得分:0)

我想我已经建立了一个更好的解决方案。 我立刻修复了整个HTML输出,并且还修复了隐藏表单输入中的 form_key 字段。

我的扩展程序会侦听事件controller_front_send_response_before。该方法在controllerFrontSendResponseBefore

中为app/code/community/JeroenVermeulen/BlockCache/Model/Observer.php

https://github.com/jeroenvermeulen/jeroenvermeulen-blockcache/

最好使用事件而不是覆盖,因为您不会有2个扩展覆盖相同核心功能的风险。在Magento升级后,事件也更有可能发挥作用。