在我的项目中,我们使用的是Magento Enterprise Edition 1.14.1。商店中的价格直接从数据库动态更改。所以问题是Magento缓存每一件事(整页缓存)所以这些变化不会在前端产生影响。因此我们决定禁用该特定块的缓存。我知道它可以在布局文件中完成。我检查了layout catalog.xml,我发现它是块
<block type="catalog/product_price_template" name="catalog_product_price_template" />
所以在这里我不知道如何禁用它。我已经尝试在 app / etc / local.xml 中将缓存的fife时间设置为null,
<layout>
<default>
<reference name="catalog_product_price_template">
<action method="setCacheLifetime" />
</reference>
</default>
</layout>
并在layout / catalog.xml中尝试
<block type="catalog/product_price_template" name="catalog_product_price_template" >
<action method="setCacheLifetime" />
</block>
并试过,
<block type="catalog/product_price" name="Mage_Catalog_Block_Product_Price">
<action method="setCacheLifetime"><value>false</value></action>
</block>
和
<block type="catalog/product_price" name="catalog_product_price">
<action method="setCacheLifetime"><s>null</s></action>
</block>
但没有运气。
我在layout / bundle.xml文件中找到了一些其他的价格块。我们也在使用捆绑产品。所以我们还要禁用这个缓存吗?任何帮助,将不胜感激。谢谢。
答案 0 :(得分:4)
在深入挖掘magento缓存技术后,我遇到了一个决定。在此之前我想描述我得到的东西。基本上有两种解决方案可以禁用特定块或缓存标记的缓存。
<强> 1。使用阻止
禁用缓存类似于设置缓存的生命周期
<reference name="needed block">
<action method="setCacheLifetime"><s>null</s></action>
</reference>
但在我们的案例中,magento没有特定的块来提供产品的价格。价格模板直接在抽象类中定义,
Mage_Catalog_Block_Product_Abstract
protected $_priceBlockDefaultTemplate = 'catalog/product/price.phtml';
此类型缓存也只会清除阻止缓存。 所以我们不能使用这个解决方案。
<强> 2。打孔: Magento有另一个默认功能,我们可以使用缓存标签覆盖FPC流程。
Magento按标记名称保存缓存。这样我们就可以在页面呈现之前获取该标记,并且我们可以禁用再次缓存该标记。因此,每次页面加载时,该标记都不会被缓存。
我试图使用观察者(core_block_abstract_to_html_before)
,
public function disableCache(Varien_Event_Observer $observer)
{
$block = $observer->getBlock();
if ($block instanceof Mage_Catalog_Block_Product_Price) {
//echo 'got it'; exit;
$cacheKeyData = array(
Mage_Catalog_Block_Product_Price::CACHE_TAG,
$block->getBlockId(),
Mage::app()->getStore()->getId(),
intval(Mage::app()->getStore()->isCurrentlySecure())
);
}
}
但价格没有CACHE_TAG
(价格没有定义)。
我们可以使用__construct()
函数直接在价格类中设置缓存的生命周期,如
$this->addData(array(
‘cache_lifetime’=> false,
‘cache_tags’ => array(Mage_Core_Model_Store::CACHE_TAG, Mage_Catalog_Product_Price::CACHE_TAG)
));
如上所述,价格没有CACHE_TAG
。所以我们也不能使用这个技巧。
但我发现有一点如果我们从管理员那里保存产品,那么这些变化就会立即反映在前端。所以我在那里挖掘更多,我找到了解决方案。
Magento调用以下控件操作,
Mage_Adminhtml_Catalog_ProductController::saveAction()
,这个将调用以下方法,
Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId)
如果您看到此功能,则会清除缓存并重新编制索引。
public function applyAllRulesToProduct($product)
{
.......
$this->getResource()->applyAllRules($product);
$this->_invalidateCache();
Mage::getSingleton('index/indexer')->processEntityAction(
new Varien_Object(array('id' => $product->getId())),
Mage_Catalog_Model_Product::ENTITY,
Mage_Catalog_Model_Product_Indexer_Price::EVENT_TYPE_REINDEX_PRICE
);
return $this;
}
所以在我的情况下,我只使用以下代码。
$object->setPrice(555);
Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId);
$object->save();
答案 1 :(得分:1)
您可以在此文件Mage / Catalog / Block / Product / Price.php中添加此链接cache disable以下方法
protected function _construct()
{
$this->addData(
array('cache_lifetime' => false,)
);
}
答案 2 :(得分:0)
Magento 1.9.2.1
我的解决方案是添加:
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
答案 3 :(得分:0)
除了这是Magento Stack Exchange的问题之外,您还可以尝试
<reference name="footer">
<action method="setCacheLifetime"></action>
</reference>
使setCacheLifetime
为空。根据你的问题,你没有检查出来。在fbrnc.net找到了解决方案。那里的作者说
这很有效,因为方便的Varien_Object-&gt; __ call()会处理缺少的参数,并用
null
替换它们,这也很幸运,这正是我们需要的
答案 4 :(得分:-1)
尝试
<action method="setCacheLifetime"><value>false</value></action>
HTH