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;
}
答案 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升级后,事件也更有可能发挥作用。