【问题标题】:How to hole punching a Block for Related List of Products in Magento?如何在 Magento 中为相关产品列表打孔?
【发布时间】:2012-10-23 00:08:12
【问题描述】:

我设法创建了一个自定义块,该块显示随机数据,如雾凇和字母/数字

但是,这是了解在 Magento 中创建块的过程的测试。

然后我尝试从该块切换,创建另一个块,而不是从 Mage_Core_Block_Template 扩展,我改为使用 Enterprise_TargetRule_Block_Catalog_Product_List_Related,因为我的目标是让相关产品成为动态的,我将我的 cache.xml 指向这个新区块。

我在相关的列表块类中放置了一个Mage::log 以知道何时调用它,我可以看到它被调用一次然后被缓存。

我这辈子都做不到,这是我的代码,请指教。

注意:重写还有一个单独的目的,实际上我的日志代码行设置在方法下的这部分:public function getProductIds($object)

Lg/Hole/etc/config.xml

<config>
    <modules>
        <Lg_Hole>
            <version>0.0.1</version>
        </Lg_Hole>
    </modules>

    <global>
        <blocks>
            <lg_hole>
                <class>Lg_Hole_Block</class>
            </lg_hole>
        </blocks>
        <models>
            <lg_hole>
                <class>Lg_Hole_Model</class>
            </lg_hole>
            <enterprise_targetrule_resource>
                <rewrite>
                    <index>Lg_Hole_Model_Mymodel</index>
                </rewrite>
            </enterprise_targetrule_resource>
        </models>
    </global>
</config>

Lg/Hole/etc/cache.xml

<config>
    <placeholders>
        <lg_hole>
            <block>lg_hole/related</block>
            <name>hole_view_example</name>
            <placeholder>CACHE_TEST</placeholder>
            <container>Lg_Hole_Model_Cachetest</container>
            <cache_lifetime>86400</cache_lifetime>
        </lg_hole>
    </placeholders>
</config>

Lg/Hole/Model/Cachetest.php

class Lg_Hole_Model_Cachetest extends
Enterprise_PageCache_Model_Container_Abstract {
protected function _getCacheId()
{
    return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id'));
}
protected function _renderBlock()
{
    $blockClass = $this->_placeholder->getAttribute('block');
    $template = $this->_placeholder->getAttribute('template');

    $block = new $blockClass;
    $block->setTemplate($template);
    return $block->toHtml();
}

protected function _saveCache($data, $id, $tags = array(), $lifetime = null) { 
   return false; 
}

public function applyWithoutApp(&$content)
{
    return false;
}
}

Lg/Hole/Block/Related.php

class Lg_Hole_Block_Related extends Enterprise_TargetRule_Block_Catalog_Product_List_Related
{

}

【问题讨论】:

    标签: magento


    【解决方案1】:

    您是否需要从Enterprise_TargetRule_Block_Catalog_Product_List_Related 扩展?

    如果是:你明白这个块包含它自己的逻辑吗?您必须在注册表中有一个已加载的产品(@see Enterprise_TargetRule_Block_Catalog_Product_List_Abstract::getProduct() 就像在产品页面上一样)并且在该产品上有产品链接(与类型相关)。

    如果您想制作一个完全独立的产品列表:像Mage_Catalog_BLock_Product_List 这样的简单类就足够了,因为它是产品列表中最原始的块(未添加特定逻辑)

    或者更好的......用户一个小部件

    【讨论】:

    • 感谢您的回答,实际上这是产品详细信息页面上的正常相关列表,所以并没有真正尝试重新发明轮子,我只是扩展认为在我的打孔块中可能更容易自己的模块,而不是打一个指向核心/企业文件的洞,如果我理解不需要扩展,我只需要这个正常的“相关项目块”始终不在缓存中。关于理解这个块包含它自己的逻辑,是的,我确实并且实际上必须为我正在处理的项目实现一些条件(这导致我需要它超出缓存)
    • 好的,如果您真的需要将其从缓存中取出,则容器的 _saveCache() 方法中的简单 return false 应该可以工作
    • 你试过没有激活 FPC 吗?你确定没有它你的块没问题吗?
    • 1) 我认为 return false 会做,结果它没有一直缓存它 2) 我尝试关闭 FPC,它工作得很好,就像我在打开 FPC 时需要的那样,我知道是因为我在 public function getProductIds($object) 上放置了一个日志,当 FPC 关闭时 -> 当 FPC 开启时,每个请求都会触发日志 -> 仅触发一次
    • 好的,问题显然出在容器上。首先,您确定容器被调用(在其中输入日志)?第二次点击此链接stackoverflow.com/questions/11745877/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多