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?
quelle
_getIdentifier
damit der Block nur für den Warenkorb des Kunden oder sogar für die Anzahl der Artikel in seinem Warenkorb gilt?Antworten:
Die Verwendung
Enterprise_PageCache_Model_Cookie::COOKIE_CART
ist der richtige Weg, aber möglicherweise müssen Sie einige Änderungen vornehmen.Enterprise_PageCache_Model_Observer::registerQuoteChange
wird 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()->setObscure
damit sich der Wert bei Bedarf ändert.quelle