これを調べるのに数時間を費やしました。問題は、正当な理由でページキャッシュがページレイアウトをロードしないことです。つまり、ページキャッシュがこのブロックのキャッシュをリロードしようとしたときに、Mage_Catalog_Block_Breadcrumbs-> _ prepareLayout()が呼び出されません。_prepareLayout()は、Mage_Page_Block_Html_Breadcrumbs-> _ toHtml()を呼び出す前にブレッドクラムをロードするものです。
ファイルシステムに保存されるフルページキャッシュの問題を再現する簡単な方法は、次のとおりです。
- 製品またはカテゴリのページに移動します
- ページ全体のキャッシュをフラッシュする
- / var / full_page_cacheに移動し、「%CONTAINER_BREADCRUMBS%」のような2つのファイルを含むフォルダーを検索して削除します
これには、ページキャッシュがそのブロックだけをリロードしようとする必要があります。ロードはMage_Catalog_Block_Breadcrumbs->_prepareLayout()を呼び出さないため、Mage_Page_Block_Html_Breadcrumbs-> _ toHtml()を呼び出すと空の文字列が返され、キャッシュが完全にパージされてページ全体が再ロードされるまで、新しいキャッシュファイルは空になります。
このために私が思いついた修正はきれいではありませんが、最も侵襲性が低いように見えました。_prepareLayout()が行うことを行う_toHtml()メソッドのブロックオーバーライドを作成するだけです。
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();
}
}