Magento 购物车(报价单)更改时整页缓存失效
我正在尝试将一个块(按钮)添加到迷你购物车块中:要么添加到Magento 购物车(报价单)更改时整页缓存失效,magento,Magento,我正在尝试将一个块(按钮)添加到迷你购物车块中:要么添加到name=“cart\u边栏”,要么最好添加到name=“topCart.extra\u actions”,因为它会自动将其子块呈现为核心/文本列表类型 一切都很好,除了由于FPC生效,块不会在产品页面上被调用。我试图从Enterprise\u PageCache\u Model\u container\u Advanced\u Quote类扩展我的容器(也尝试了Enterprise\u PageCache\u Model\u conta
name=“cart\u边栏”
,要么最好添加到name=“topCart.extra\u actions”
,因为它会自动将其子块呈现为核心/文本列表类型
一切都很好,除了由于FPC生效,块不会在产品页面上被调用。我试图从Enterprise\u PageCache\u Model\u container\u Advanced\u Quote
类扩展我的容器(也尝试了Enterprise\u PageCache\u Model\u container\u Abstract
),但是没有调用\u renderBlock
方法
My cache.xml似乎正确有效:
国际结帐/国际
国际大学国际
内部检查
GSX\u国际签出\u型号\u容器\u按钮
84600
嵌套动态块时,如有任何帮助或提示,将不胜感激
您试图做的是嵌套动态块,即动态迷你购物车块应包含一个嵌套的动态块,其type=internationalcheckout/international
这不起作用,因为FPC处理器实现动态块的方式(holepunching)。
FPC处理流程
让我们一步一步地看看发生了什么
首先调用\u processContainers()
方法时,$content
包含缓存页面,包括所有占位符标记。这还包括您定义的嵌套块
第二个,该方法匹配所有占位符标记。在此之后,$placeholder
包括迷你购物车占位符,然后还包括嵌套占位符定义
第三个,按顺序处理找到的占位符。这意味着迷你购物车占位符将在处理嵌套占位符之前进行处理,因为这就是preg\u match\u all()
收集匹配项的方式
第四个,迷你购物车容器被实例化。它依次实例化checkout/cart\u侧栏
块,初始化渲染器并在其上调用toHtml()
第五个,将呈现checkout/cart/cartweader.phtml模板。当Magento接到电话时
<?php echo $this->getChildHtml('extra_actions') ?>
它不会为它呈现任何内容,因为在处理applyWithoutApp()
和applyWithApp()
期间不存在子块
第六个,FPC处理器将迷你购物车占位符标记的完整内容区域替换为迷你购物车容器返回的呈现内容。$content
现在包含更新的迷你购物车html
第七个,FPC容器尝试处理嵌套块的占位符。但是$content
不再包含它的占位符标记。通过用新生成的内容替换包装迷你购物车占位符,它们已被删除
总结
FPC处理内容时,不会加载布局XML,并且不会实例化常规块层次结构。
对于动态(“holepunched”)块,子块的所有输出都将被删除,除非块实例本身或容器在不加载布局XML的情况下负责实例化它们。
在FPC处理页面内容时,加载布局XML并生成所有块,这在性能方面不是一个好主意
这归结起来就是,topCart.extra_actions
容器块看起来是个好主意,但它与FPC不兼容:(
不能在动态块中使用子块
要实施一个解决方案,您必须将您的区块移出购物车侧栏区块。对于任何想寻找额外行动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,答案非常翔实
/**
* 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;
}