Blocchi cache che contengono form_key (I.e. Contenuto dinamico)
-
13-12-2019 - |
Domanda
Mi chiedo, se c'è una migliore pratica per utilizzare il cache del blocco per blocchi che contengono un modulo con l'ingresso form_key
(Token CSRF).
Non sto parlando di una punzonatura del foro della cache a pagina intera, ma la cache del blocco standard del Magento CE.
Generalmente pronunciato: come avresti cache un blocco con una piccola porzione di contenuto dinamico o un blocco per bambini che non è memorizzato nella cache?
Soluzione
Ecco come ho risolto Alla fine, aggiungere i seguenti metodi al blocco in questione:
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);
}
.
Spiegazione:
I Sostituisco la chiave del modulo con un segnaposto prima che il blocco rendering sia memorizzato nella cache e sostituire nuovamente il segnaposto con il tasto modulo corrente dopo che il blocco è stato caricato dalla cache.
Io uso _toHtml
per inserire il segnaposto perché il valore di ritorno di questo metodo viene immediatamente scritto nella cache.
Io uso _afterToHtml
per ripristinare il tasto modulo perché questo metodo viene chiamato immediatamente dopo che il contenuto è stato caricato dalla cache (o dopo che è stato salvato nella cache se non era ancora memorizzato nella cache). Questo metodo è garantito per essere chiamato, indipendentemente dalla cache del blocco.
.
Ulteriori THUGTS
Una soluzione generica non sembra ancora esistere, ma il metodo sopra descritto funziona per qualsiasi contenuto dinamico e se ne è necessario in più di un blocco o con contenuti diversi, dovrebbe essere facile estrarre la logica del segnaposto a un separato Modello.
Per la sostituzione dei segnaposto è possibile utilizzare anche l'evento core_block_abstract_to_html_after
, ma sfortunatamente nessun evento esiste proprio prima che il blocco rendering venga memorizzato nella cache, quindi una soluzione "Observer solo" non è possibile senza introdurre nuovi eventi nel nucleo.