4

我正在尝试向迷你购物车块添加一个块(按钮):name="cart_sidebar"或者最好name="topCart.extra_actions"是因为它自动呈现它的子块是core/text_list类型

一切都很好,除了由于 FPC 生效而在产品页面上没有调用该块。我正在尝试从Enterprise_PageCache_Model_Container_Advanced_Quote类扩展我的容器(也尝试Enterprise_PageCache_Model_Container_Abstract过),但是_renderBlock没有调用方法。

我的 cache.xml 似乎是正确且有效的:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <placeholders>
        <internationalcheckout_international>
            <block>internationalcheckout/international</block>
            <name>internationalcheckout_international</name>
            <placeholder>INT_CHECKOUT</placeholder>
            <container>GSX_InternationalCheckout_Model_Container_Button</container>
            <cache_lifetime>84600</cache_lifetime>
        </internationalcheckout_international>
    </placeholders>
</config>

任何帮助或提示表示赞赏

4

2 回答 2

18

嵌套动态块

您正在尝试做的是嵌套动态块,即动态迷你购物车块应该包含一个嵌套的动态块type=internationalcheckout/international

由于 FPC 处理器实现动态块(打孔)的方式,这不起作用。

protected function _processContainers(&$content)
{
    $placeholders = array();
    preg_match_all(
        Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN,
        $content, $placeholders, PREG_PATTERN_ORDER
    );

    // ...
    // ... if applyWithoutApp() on each placeholder then update content
    // ... else prepare data for applyWithApp()
    // ...

    }

FPC加工流程

让我们一步一步来看看会发生什么。

首先,在_processContainers()调用该方法时,$content包含缓存的页面,包括所有占位符标记。这也包括您定义的嵌套块。

其次,该方法匹配所有占位符标签。之后$placeholders包括迷你购物车占位符,然后还有嵌套的占位符定义。

第三,将找到的占位符按顺序处理。这意味着将在处理嵌套占位符之前处理迷你购物车占位符,因为这就是preg_match_all()收集匹配项的方式。

第四,mini-cart 容器被实例化。它反过来实例化checkout/cart_sidebar块,初始化渲染器并调用toHtml()它。

第五,呈现checkout/cart/cartheader.phtml模板。当 Magento 接听电话时

<?php echo $this->getChildHtml('extra_actions') ?>

它不会为它呈现任何内容,因为在处理过程中applyWithoutApp()applyWithApp() 存在子块

第六,FPC 处理器将迷你购物车占位符标记所标记的完整内容区域替换为迷你购物车容器返回的渲染内容。现在$content包含更新的迷你购物车 html。

第七,FPC 容器尝试处理嵌套块的占位符。但$content不再包含它的占位符标签。通过用新生成的内容替换包装迷你购物车占位符,它们已被删除!

概括

当 FPC 处理内容时,不会加载布局 XML,也不会实例化常规块层次结构。
对于动态(“打孔”)块,将删除子块的所有输出,除非块实例本身或容器负责在不加载布局 XML 的情况下实例化它们。
在 FPC 处理页面内容时加载布局 XML 并生成所有块是一个坏主意。

这归结为topCart.extra_actions容器块看起来是个好主意,但它与 FPC 不兼容 :(

您不能在动态块中使用子块。

要实施解决方法,您必须将块移出cart_sidebar块。

于 2012-12-12T08:07:18.907 回答
2

对于正在寻找 extra_actions PayPal 按钮解决方案的任何人,有一个 Magento 补丁修复它(SUPEE-87_1.12.0.0_v1.patch)。

由于它是一个 Magento 补丁,您可以简单地打开文件“app/code/core/Enterprise/PageCache/Model/Container/Sidebar/Cart.php”并将这两个函数添加到 _renderBlock 函数之后,这正是补丁所做的:

    /**
 * Get Place Holder Block
 *
 * @return Mage_Core_Block_Abstract
 */
protected function _getPlaceHolderBlock()
{
    $block = parent::_getPlaceHolderBlock();
    $block->setChild('extra_actions', $this->_getExtraActionsChildBlock());
    return $block;
}

/**
 * Get child Block
 *
 * @return Mage_Core_Block_Abstract
 */
protected function _getExtraActionsChildBlock()
{
     $paypalShortcutBlock = Mage::app()->getLayout()->createBlock('paypal/express_shortcut');
     $paypalShortcutBlock->setTemplate('paypal/express/shortcut.phtml');
     $paypalShortcutBlock->setLayout(Mage::app()->getLayout());

     return $paypalShortcutBlock;
}

了解其工作原理有助于解决其他类似问题。

顺便感谢Vinai,非常有用的答案。

于 2014-01-03T20:18:29.693 回答