質問

form_key入力(CSRFトークン)を含むフォームを含むブロックのブロックキャッシュを使用するのに最適な方法がある場合は、

私は全ページキャッシュホールパンチングについて話していませんが、Magento CEの標準ブロックキャッシュ。

一般的な音声:動的コンテンツの少数の部分、またはキャッシュされていない子ブロックをどのようにキャッシュしますか?

役に立ちましたか?

解決

これは最終的に解決した方法で、問題のブロックに次の方法を追加します:

const FORM_KEY_PLACEHOLDER = '{{FORM_KEY}}';

protected function _toHtml()
{
    return $this->_insertFormKeyPlaceholder(parent::_toHtml());
}

protected function _afterToHtml($html)
{
    return $this->_restoreFormKey(parent::_afterToHtml($html));
}

protected function _insertFormKeyPlaceholder($html)
{
    /** @var $session Mage_Core_Model_Session */
    $session = Mage::getSingleton('core/session');
    return str_replace($session->getFormKey(), self::FORM_KEY_PLACEHOLDER, $html);
}

protected function _restoreFormKey($html)
{
    /** @var $session Mage_Core_Model_Session */
    $session = Mage::getSingleton('core/session');
    return str_replace(self::FORM_KEY_PLACEHOLDER, $session->getFormKey(), $html);
}
.

説明:

レンダリングされたブロックがキャッシュされる前にフォームキーをプレースホルダに置き換え、ブロックがキャッシュからロードされた後にプレースホルダを再度置き換えます。

このメソッドの戻り値は直ちにキャッシュに書き込まれるため、PlaceHolderを挿入するためにPlaceHolderを挿入します。

_toHtmlを使用してフォームキーを復元します。このメソッドは、ブロックキャッシュに関係なく、呼び出されることが保証されています。


さらにThougts

一般的な解決策はまだ存在していないようですが、動的コンテンツについては動的コンテンツのために機能し、複数のブロックまたは異なるコンテンツで必要な場合は、プレースホルダーロジックを別のブロックに抽出するのは簡単であるはずです。モデル

プレースホルダーを置き換えるために_afterToHtmlイベントを使用することもできますが、残念ながら、レンダリングされたブロックがキャッシュされる直前にイベントが存在しませんので、コアに新しいイベントを導入せずに "オブザーバのみ"ソリューションは不可能です。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top