我正在尝试将一个块(按钮)添加到迷你购物车块:要么是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>
Run Code Online (Sandbox Code Playgroud)
任何帮助或提示都表示赞赏
Vin*_*nai 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()
// ...
}
Run Code Online (Sandbox Code Playgroud)
让我们一步一步地看看会发生什么.
首先,_processContainers()调用方法时,$content包含缓存页面,包括所有占位符标记.这还包括您定义的嵌套块.
其次,该方法匹配所有占位符标记.在此之后$placeholders包括迷你购物车占位符,然后是您的嵌套占位符定义.
第三,找到的占位符按顺序处理.这意味着将在处理嵌套占位符之前处理迷你购物车占位符,因为这是preg_match_all()收集匹配的方式.
第四,实例化迷你推车容器.它反过来实例化checkout/cart_sidebar块,初始化渲染器并调用toHtml()它.
第五,渲染checkout/cart/cartheader.phtml模板.当Magento接到电话时
<?php echo $this->getChildHtml('extra_actions') ?>
Run Code Online (Sandbox Code Playgroud)
它不会为它呈现任何内容,因为在处理期间applyWithoutApp()并且applyWithApp() 不存在子块.
第六,FPC处理器用迷你购物车容器返回的渲染内容替换由迷你购物车占位符标签标记的完整内容区域.在$content现在包含更新的微型车的HTML.
第七,FPC容器尝试处理嵌套块的占位符.但$content不再包含占位符标记.通过使用新生成的内容替换包装迷你购物车占位符来删除它们!
当FPC处理内容时,不加载布局XML,并且不实例化常规块层次结构.
对于动态("打孔")块,子块的所有输出都将被删除,除非块实例本身或容器负责实例化它们而不加载布局XML.
在FPC处理页面内容时加载布局XML并生成所有块是性能上的一个坏主意.
这归结为topCart.extra_actions容器块看起来是个好主意,但它与FPC不兼容:(
您不能在动态块中使用子块.
要实现一种变通方法,您必须将块移出cart_sidebar块.