包含form_key的缓存块(即动态内容)
-
13-12-2019 - |
题
我想知道,如果有最好的做法是使用块缓存的块,该块包含具有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);
}
.
说明:
我在缓存渲染块之前用占位符替换表单密钥,并在从缓存中加载块后再次使用当前表单键替换占位符。
我使用_toHtml
插入占位符,因为此方法的返回值立即写入缓存。
我使用_afterToHtml
来恢复表单键,因为在从缓存中加载内容后立即调用此方法(如果尚未缓存,则在它被保存到缓存之后)。无论块高速缓存如何,保证此方法被调用。
进一步thougts
似乎似乎尚不存在,但上面描述的方法适用于任何动态内容,如果您需要在多个块或具有不同内容中,则应容易地将占位符逻辑提取到单独的模型。
要替换占位符,也可以使用core_block_abstract_to_html_after
事件,但不幸的是,在渲染的块缓存之前没有任何事件存在,因此在不引入核心中的新事件,无法在不引入新事件的“观察者”解决方案。