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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top