Holepunching nagłówka w sklepie Magento

10

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?

Nirav Sheth
źródło
Nie jestem pewien, ale myślę, że to pytanie jest bardziej związane z przepełnieniem stosu, ale nie ta strona ...
Sergei Guk
2
Holepunching wydaje się być tutaj stosowany w nietradycyjnym sensie, czy możesz wyjaśnić funkcję, którą próbujesz wdrożyć bez użycia żargonu?
Ralph Tice
1
Dlaczego nie dołączyć identyfikatora koszyka klientów, aby _getIdentifierblok był unikalny dla koszyka klientów, a nawet liczby elementów w koszyku?
B00MER
@SergeiGuk Cóż, jest to bardzo związane z Magento
j0k
@RalphTice Próbuję zaimplementować wskaźnik wartości koszyka w nagłówku, który pokazuje użytkownikowi, ile przedmiotów ma w koszyku. Ponieważ ta wartość jest różna dla poszczególnych użytkowników, nie chcę, aby była buforowana.
Nirav Sheth

Odpowiedzi:

3

Używanie Enterprise_PageCache_Model_Cookie::COOKIE_CARTjest właściwą drogą, ale może być konieczne wprowadzenie pewnych zmian.

Enterprise_PageCache_Model_Observer::registerQuoteChangejest wywoływany przy każdym zapisaniu wyceny (wraz ze zmianą numeru pozycji) i jest również wywoływany w kontekście Mage::app(), abyś mógł uzyskać dostęp do wszystkich danych sesji. Zastąp tego obserwatora i dodaj więcej danych, $this->_getCookie()->setObscureaby wartość zmieniała się zawsze, gdy zajdzie taka potrzeba.

Paul Grigoruta
źródło
Jakieś przykłady, którymi chciałbyś się podzielić?
Nirav Sheth