只是花了几个小时研究这个。问题是页面缓存没有加载页面布局是有充分理由的,这意味着当页面缓存尝试重新加载此块的缓存时,不会调用 Mage_Catalog_Block_Breadcrumbs->_prepareLayout()。_prepareLayout() 是在调用 Mage_Page_Block_Html_Breadcrumbs->_toHtml() 之前加载面包屑的内容
使用保存到文件系统的全页缓存复制问题的一种快速方法是:
- 转到产品或类别页面
- 刷新整页缓存
- 进入 /var/full_page_cache 并搜索包含两个看起来像“%CONTAINER_BREADCRUMBS%”的文件的文件夹并删除它们
这将要求页面缓存尝试仅重新加载该块。由于加载没有调用 Mage_Catalog_Block_Breadcrumbs->_prepareLayout(),因此对 Mage_Page_Block_Html_Breadcrumbs->_toHtml() 的调用返回一个空字符串,并且新的缓存文件为空,直到缓存被完全清除并重新加载整个页面。
我为此提出的解决方案并不漂亮,但它似乎是侵入性最小的。只需为 _toHtml() 方法创建一个块覆盖,该方法执行 _prepareLayout() 所做的工作。
class Package_Module_Block_Html_Breadcrumbs extends Mage_Page_Block_Html_Breadcrumbs
{
protected function _toHtml()
{
if (!is_array($this->_crumbs)) {
$this->addCrumb('home', array(
'label'=>Mage::helper('catalog')->__('Home'),
'title'=>Mage::helper('catalog')->__('Go to Home Page'),
'link'=>Mage::getBaseUrl()
));
$path = Mage::helper('catalog')->getBreadcrumbPath();
foreach ($path as $name => $breadcrumb) {
$this->addCrumb($name, $breadcrumb);
}
}
return parent::_toHtml();
}
}