Блоки кэширования, содержащие FORM_KEY (I.E. Динамическое содержание)

magento.stackexchange https://magento.stackexchange.com//questions/79373

Вопрос

Интересно, если существует лучшая практика для использования кэширования блоков для блоков, которые содержат форму с входом 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 для восстановления клавиши формы, поскольку этот метод называется сразу после того, как содержимое будет загружено из кэша (или после того, как он был сохранен в кэш, если он еще не был кэширован). Этот метод гарантирован, независимо от кэша блока.


Далее тыссы

Общий раствор, похоже, пока не существует, но метод, описанный выше, работает для любого динамического контента, и если вам это нужно в нем более чем в одном блоке или с разным контентом, его следует легко извлечь логику заполнителя на отдельный модель.

Для замены заполнении заполненных пользователей вы также можете использовать событие core_block_abstract_to_html_after, но, к сожалению, не существует события, прежде чем предоставляется кэшируется событие, поэтому решение «только наблюдателя» невозможно без внедрения новых событий в ядре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top