Question

Je me demande, si il n'y est plus pratique d'utiliser le bloc de mise en cache pour les blocs qui contiennent un formulaire avec le form_key d'entrée (jeton CSRF).

Je ne parle pas de full page cache trou de poing, mais la norme bloc de cache de Magento CE.

Généralement parlées:Comment voulez-vous mettre en cache un bloc avec une petite portion de contenu dynamique, ou un enfant de bloc qui n'est pas mis en cache?

Était-ce utile?

La solution

C'est comment je l'ai résolu finalement, ajoutez les méthodes suivantes pour le bloc en question:

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

Explication:

- Je remplacer la forme de la clé avec un espace réservé avant le rendu du bloc est mis en cache et remplacez l'espace réservé à la forme actuelle à nouveau sur la touche après le bloc a été chargé à partir du cache.

J'utilise _toHtml pour insérer le repère d'emplacement, car la valeur de retour de cette méthode est immédiatement écrit dans le cache.

J'utilise _afterToHtml pour restaurer la forme de la clé, car cette méthode est appelée immédiatement après que le contenu a été chargé à partir de la mémoire cache (ou après qu'il a été enregistré dans le cache si il n'était pas mis en cache encore).Cette méthode est garanti d'être appelé, quel que soit le bloc de cache.


En outre thougts

Une solution générique ne semble pas exister encore, mais la méthode décrite ci-dessus fonctionne pour n'importe quel contenu dynamique et si vous en avez besoin en plus d'un bloc ou avec un contenu différent, il devrait être facile à extraire l'espace réservé logique pour un modèle distinct.

Pour remplacer les espaces réservés vous pourriez aussi utiliser l' core_block_abstract_to_html_after l'événement, mais malheureusement aucun cas avant le rendu du bloc de mise en cache, de sorte qu'un "observateur seulement" la solution n'est pas possible sans introduire de nouveaux événements dans le noyau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top