我想块(按钮),添加到小型车块:要么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>
任何帮助或暗示的赞赏
嵌套动态块
你所试图做的是巢动态块,即动态微型车块应该包含嵌套的动态块type=internationalcheckout/international
。
这不起作用,因为方式的FPC处理器实现动态块(holepunching)。
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()
收集的匹配。
四 ,小型车的容器被实例化。 它反过来实例化checkout/cart_sidebar
块,初始化渲染器,并调用toHtml()
就可以了。
五 , 结帐/车/ cartheader.phtml模板呈现。 当Magento的到达呼叫
<?php echo $this->getChildHtml('extra_actions') ?>
因为在加工过程中也不会渲染任何内容applyWithoutApp()
和applyWithApp()
没有子块存在 。
六 ,FPC处理器替换由与微型车容器返回的呈现内容的小型车占位符标记标示完整内容区域 。 在$content
现在包含更新的微型车的HTML。
第七 ,FPC容器尝试处理您的嵌套块的占位符。 但是, $content
不再包含它的占位符标记。 他们已经通过与新产生的内容替换包装的迷你车占位符删除!
摘要
当FPC正在处理的内容,没有布局XML被加载,而普通块层次不是实例。
对于动态(“holepunched”)的块,从子块中的所有输出将被移除,除非块实例本身或容器需要实例化它们而不装载的布局XML的护理。
这将是一个坏主意性能明智加载布局XML和生成所有块,而FPC正在处理页面的内容。
这是什么归结为是, topCart.extra_actions
容器块看起来像一个好主意,但它不与FPC兼容:(
你不能动态块中使用子块。
要实现一种变通方法,你将不得不将您块之外cart_sidebar
块。
到任何人寻找一种解决extra_actions PayPal按钮,有一个Magento的贴片固定它(SUPEE-87_1.12.0.0_v1.patch)。
因为它是一个Magento的补丁,你可以直接打开文件“应用程序/代码/核心/企业/页缓存/型号/集装箱/侧边栏/ 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;
}
了解它是如何工作可以帮助其他类似问题。
由于威奈的方式,内容非常丰富的答案。