我想知道,如果有最好的做法是使用块缓存的块,该块包含具有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事件,但不幸的是,在渲染的块缓存之前没有任何事件存在,因此在不引入核心中的新事件,无法在不引入新事件的“观察者”解决方案。

许可以下: CC-BY-SA归因
scroll top