Holepunching des Headers im Magento Store

10

Ich habe das Holepunching von Headern in Magento implementiert, und obwohl ich es auf Kundenbasis zum Laufen gebracht habe, muss ich in der Lage sein, diese eine Ebene tiefer zu gehen, indem ich es auch für die Anzahl der verschiedenen Warenkorbartikel verwenden kann.

Hier ist mein Code.

    class AD_PageCache_Model_Container_Header extends Enterprise_PageCache_Model_Container_Abstract {

    protected function _getIdentifier() {
        return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
    }

    // public function getCacheKeyInfo() {
    //  $info = parent::getCacheKeyInfo();
    //  die('boo');
    //  $info['cart_count'] = Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();

    //  return $info;
    // }

    protected function _getCacheId() {
        //return 'CONTAINER_HEADER_' . md5($this->_placeholder->getAttribute('cache_id') . $this->_placeholder->getAttribute('cart_count') ) . '_' . $this->_getIdentifier();
        return 'CONTAINER_HEADER_' . md5( $this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier() );
    }

    protected function _renderBlock() {
        $blockClass = $this->_placeholder->getAttribute('block');
        $template = $this->_placeholder->getAttribute('template');

        $block = new $blockClass;
        $block->setTemplate($template);
        return $block->toHtml();
    }

}

Mein Verständnis von dem, was ich aus Holepunching-Threads in Magento gelesen habe, ist, dass die Mage-App nicht initialisiert wird, wenn der FPC-Cache die Anforderung bedient, sodass die Methode zum Hinzufügen eines Platzhalterattributs im Grunde nicht funktioniert, da

Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();

wird nicht funktionieren, oder?

Und obwohl, wie ist das, sollte es sein, aber es schien überhaupt nicht zu laufen, als hätte ich dort einen die()Anruf getätigt, aber nichts ist passiert.

Also was fehlt mir? Und wie kann ich die Anzahl der Warenkorbartikel abrufen, damit daraus die Cache-ID erstellt werden kann?

Fortschritt: Ich habe gefunden

Enterprise_PageCache_Model_Cookie::COOKIE_CART

Dies ändert sich jedoch nur einmal bei der Aktualisierung des Warenkorbs. Danach bleibt es gleich. Das ist komisch, das fühlt sich wie die Lösung an, aber sein Verhalten sagt etwas anderes aus.

Ich konnte auch in der Sitzung keine Anzahl von Warenkorbartikeln finden. Die einzige Möglichkeit, die ich derzeit sehe, besteht darin, die Warenkorbmenge in der Sitzung zu speichern, wenn sie aktualisiert wird, und diese dann in zu verwenden _getIdentifier().

Ich fand, dass Beobachter für Wagen inkonsistent sind. Bei der Aktualisierung werden die Ereignisse ausgelöst, beim Entfernen jedoch nicht. Also kann ich meinen Beobachter irgendwie zur Preisaktualisierung des Angebots hinzufügen, wenn dies mit Beobachtern vereinbar ist?

Außerdem habe ich die Ungültigkeit des gesamten Seitencaches bei der Änderung des Warenkorbs (Zitat) gelesen , aber es wird nicht mit verwendet

Enterprise_PageCache_Model_Cookie::COOKIE_CART

Das funktioniert in meinem Fall nicht gut, obwohl ich denke, dass das Problem darin liegt. Was wie? Ich bin nicht sicher.

Auch die aktuelle Version von EE, die wir ausführen, hat nicht einmal den Ordner "Erweitert" Model/Container. ich benutzeEE 1.10.1.1

Irgendwelche Vorschläge?

Nirav Sheth
quelle
Ich bin mir nicht sicher, aber ich denke, dass diese Frage mehr mit Stack Overflow zu tun hat, aber nicht mit dieser Seite ...
Sergei Guk
2
Holepunching scheint hier in einem nicht traditionellen Sinne verwendet zu werden. Können Sie die Funktion erklären, die Sie implementieren möchten, ohne Jargon zu verwenden?
Ralph Tice
1
Warum nicht die Warenkorb-ID des Kunden anhängen, _getIdentifierdamit der Block nur für den Warenkorb des Kunden oder sogar für die Anzahl der Artikel in seinem Warenkorb gilt?
B00MER
@ SergeiGuk Nun, es ist stark mit Magento verwandt
j0k
@RalphTice Ich versuche, eine Warenkorbwertanzeige in der Kopfzeile zu implementieren, die dem Benutzer anzeigt, wie viele Artikel sich in seinem Warenkorb befinden. Da dieser Wert pro Benutzer unterschiedlich ist, möchte ich nicht, dass er zwischengespeichert wird.
Nirav Sheth

Antworten:

3

Die Verwendung Enterprise_PageCache_Model_Cookie::COOKIE_CARTist der richtige Weg, aber möglicherweise müssen Sie einige Änderungen vornehmen.

Enterprise_PageCache_Model_Observer::registerQuoteChangewird bei jedem Angebotsspeicher aufgerufen (einschließlich Änderung der Artikelnummer) und im Kontext am aufgerufen, Mage::app()damit Sie auf alle Sitzungsdaten zugreifen können. Überschreiben Sie diesen Beobachter und fügen Sie weitere Daten hinzu, $this->_getCookie()->setObscuredamit sich der Wert bei Bedarf ändert.

Paul Grigoruta
quelle
Gibt es Beispiele, die Sie dazu mitteilen möchten?
Nirav Sheth