Блоки кэширования, содержащие FORM_KEY (I.E. Динамическое содержание)
-
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
для восстановления клавиши формы, поскольку этот метод называется сразу после того, как содержимое будет загружено из кэша (или после того, как он был сохранен в кэш, если он еще не был кэширован). Этот метод гарантирован, независимо от кэша блока.
Далее тыссы
Общий раствор, похоже, пока не существует, но метод, описанный выше, работает для любого динамического контента, и если вам это нужно в нем более чем в одном блоке или с разным контентом, его следует легко извлечь логику заполнителя на отдельный модель.
Для замены заполнении заполненных пользователей вы также можете использовать событие core_block_abstract_to_html_after
, но, к сожалению, не существует события, прежде чем предоставляется кэшируется событие, поэтому решение «только наблюдателя» невозможно без внедрения новых событий в ядре.