Frage

Ich frage mich, ob es eine bewährte Methode gibt, Block-Caching für Blöcke zu verwenden, die ein Formular mit dem enthalten form_key eingabe (CSRF-Token).

Ich spreche nicht von Ganzseiten-Cache-Lochstanzen, sondern vom Standard-Block-Cache von Magento CE.

Allgemein gesprochen:Wie würden Sie einen Block mit einem kleinen Teil des dynamischen Inhalts oder einen untergeordneten Block, der nicht zwischengespeichert wird, zwischenspeichern?

War es hilfreich?

Lösung

So habe ich es schließlich gelöst, füge dem fraglichen Block die folgenden Methoden hinzu:

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

Erklärung:

Ich ersetze den Formularschlüssel durch einen Platzhalter, bevor der gerenderte Block zwischengespeichert wird, und ersetze den Platzhalter erneut durch den aktuellen Formularschlüssel, nachdem der Block aus dem Cache geladen wurde.

Ich benutze _toHtml um den Platzhalter einzufügen, da der Rückgabewert dieser Methode sofort in den Cache geschrieben wird.

Ich benutze _afterToHtml um den Formularschlüssel wiederherzustellen, da diese Methode sofort aufgerufen wird, nachdem der Inhalt aus dem Cache geladen wurde (oder nachdem er im Cache gespeichert wurde, falls er noch nicht zwischengespeichert wurde).Diese Methode wird garantiert aufgerufen, unabhängig vom Blockcache.


Weitere Gedanken

Eine generische Lösung scheint noch nicht zu existieren, aber die oben beschriebene Methode funktioniert für jeden dynamischen Inhalt und wenn Sie ihn in mehr als einem Block oder mit unterschiedlichem Inhalt benötigen, sollte es einfach sein, die Platzhalterlogik in ein separates Modell zu extrahieren.

Zum Ersetzen der Platzhalter könnten Sie auch das verwenden core_block_abstract_to_html_after ereignis, aber leider existiert kein Ereignis unmittelbar bevor der gerenderte Block zwischengespeichert wird, sodass eine "Nur-Beobachter" -Lösung nicht möglich ist, ohne neue Ereignisse in den Kern einzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top