Pregunta

Me pregunto si existe una buena práctica para utilizar el almacenamiento en caché de bloques que contienen un formulario con el form_key entrada (token CSRF).

No me refiero a la perforación de caché de página completa, sino al caché de bloque estándar de Magento CE.

Hablado en general:¿Cómo almacenarías en caché un bloque con una pequeña porción de contenido dinámico o un bloque secundario que no está almacenado en caché?

¿Fue útil?

Solución

Finalmente lo resolví así, agregue los siguientes métodos al bloque en cuestión:

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);
}

Explicación:

Reemplazo la clave del formulario con un marcador de posición antes de que el bloque renderizado se almacene en caché y reemplazo el marcador de posición con la clave del formulario actual nuevamente después de que el bloque se haya cargado desde la caché.

yo suelo _toHtml para insertar el marcador de posición porque el valor de retorno de este método se escribe inmediatamente en la memoria caché.

yo suelo _afterToHtml para restaurar la clave del formulario porque este método se llama inmediatamente después de que el contenido se haya cargado desde la memoria caché (o después de que se haya guardado en la memoria caché si aún no se ha almacenado en la memoria caché).Se garantiza que se llamará a este método, independientemente del caché de bloques.


Pensamientos adicionales

Parece que aún no existe una solución genérica, pero el método descrito anteriormente funciona para cualquier contenido dinámico y si lo necesita en más de un bloque o con contenido diferente, debería ser fácil extraer la lógica del marcador de posición a un modelo separado.

Para reemplazar los marcadores de posición también puedes usar el core_block_abstract_to_html_after evento, pero desafortunadamente no existe ningún evento justo antes de que el bloque renderizado se almacene en caché, por lo que no es posible una solución "solo observador" sin introducir nuevos eventos en el núcleo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top