magento禁用价格块的缓存

时间:2014-12-29 06:16:03

标签: xml magento caching layout block

在我的项目中,我们使用的是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文件中找到了一些其他的价格块。我们也在使用捆绑产品。所以我们还要禁用这个缓存吗?任何帮助,将不胜感激。谢谢。

5 个答案:

答案 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