我正在尝试将一个块(按钮)添加到迷你购物车块:要么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>
感谢任何帮助或提示
答案 0 :(得分: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()
// ...
}
让我们一步一步地看看会发生什么。
首先,当调用_processContainers()
方法时,$content
包含缓存页面,包括所有占位符标记。这还包括您定义的嵌套块。
第二,该方法匹配所有占位符标记。在此$placeholders
包含迷你购物车占位符,然后是您的嵌套占位符定义。
第三次,按顺序处理找到的占位符。这意味着迷你购物车占位符将在处理嵌套占位符之前进行处理,因为这是preg_match_all()
收集匹配的方式。
第四,实例化迷你购物车容器。它反过来实例化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
块之外。
答案 1 :(得分: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,回复非常丰富。