Wdrożyłem holepunching nagłówka w Magento i chociaż mam go działającą indywidualnie dla każdego klienta, potrzebuję możliwości przejścia o jeden poziom głębiej, aby działał on również na licznikach różnych koszyków.
Oto mój kod.
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();
}
}
Rozumiem z tego, co czytałem z holepunchingu wątków na Magento, że aplikacja Mage nie jest inicjowana, gdy pamięć podręczna FPC obsługuje żądanie, więc w zasadzie metoda dodawania atrybutu zastępczego nie może działać, ponieważ
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
nie zadziała, prawda?
I chociaż tak to powinno być, ale nie wydawało się, żeby działało, jakbym die()
zadzwonił, ale nic się nie stało.
Więc czego mi brakuje? I w jaki sposób mogę pobrać liczbę elementów koszyka, aby można go było użyć do zbudowania identyfikatora pamięci podręcznej?
Postęp: Znalazłem
Enterprise_PageCache_Model_Cookie::COOKIE_CART
ale zmienia się to tylko raz po aktualizacji wózka. Następnie pozostaje taki sam. To dziwne, wydaje się, że to rozwiązanie, ale jego zachowanie mówi inaczej.
Nie mogłem też znaleźć liczby przedmiotów w koszyku w sesji. Więc jedynym sposobem, jaki obecnie to widzę, byłoby zapisanie ilości koszyka w sesji za każdym razem, gdy się aktualizuje, a następnie użyć go w _getIdentifier()
.
Odkryłem, że obserwatorzy są niespójni w stosunku do koszyka. Ponadto aktualizacje są wysyłane, ale nie są usuwane. Myślę, że mogę w jakiś sposób dodać mojego obserwatora do aktualizacji ceny oferty, jeśli jest to zgodne z posiadaniem obserwatorów?
Przeczytałem również o unieważnieniu pełnej strony pamięci podręcznej o zmianie koszyka (oferty), ale obsługuje to
Enterprise_PageCache_Model_Cookie::COOKIE_CART
co nie działa dobrze w moim przypadku, chociaż myślę, że problem tkwi w nim. Co / jak Nie jestem pewien.
Również bieżąca wersja EE, którą mamy uruchomioną, nie ma nawet folderu Zaawansowane
Model/Container
. ja używamEE 1.10.1.1
Jakieś sugestie?
źródło
_getIdentifier
blok był unikalny dla koszyka klientów, a nawet liczby elementów w koszyku?Odpowiedzi:
Używanie
Enterprise_PageCache_Model_Cookie::COOKIE_CART
jest właściwą drogą, ale może być konieczne wprowadzenie pewnych zmian.Enterprise_PageCache_Model_Observer::registerQuoteChange
jest wywoływany przy każdym zapisaniu wyceny (wraz ze zmianą numeru pozycji) i jest również wywoływany w kontekścieMage::app()
, abyś mógł uzyskać dostęp do wszystkich danych sesji. Zastąp tego obserwatora i dodaj więcej danych,$this->_getCookie()->setObscure
aby wartość zmieniała się zawsze, gdy zajdzie taka potrzeba.źródło