Ho implementato un holepunching di header in magento, e anche se l'ho fatto funzionare su una base per cliente, ho bisogno della capacità di approfondire questo livello facendolo funzionare anche sul conteggio degli articoli del carrello diff.
Ecco il mio codice
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();
}
}
La mia comprensione da ciò che ho letto dai thread di holepunch su Magento è che l'app Mage non è inizializzata quando la cache FPC sta servendo la richiesta, quindi sostanzialmente il metodo di aggiunta di un attributo segnaposto non può funzionare, dal momento che
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
non funzionerà, vero?
E anche se come dovrebbe essere, ma non sembra funzionare affatto, come se avessi fatto una die()
chiamata ma non è successo niente.
Quindi cosa mi manca? E come posso recuperare il conteggio degli articoli del carrello in modo che possa essere utilizzato per creare l'ID cache?
Progresso: ho trovato
Enterprise_PageCache_Model_Cookie::COOKIE_CART
ma questo cambia solo una volta dopo l'aggiornamento del carrello. Dopodiché rimane lo stesso. È strano, sembra la soluzione ma il suo comportamento dice diversamente.
Non sono riuscito a trovare gli articoli del carrello nella sessione. Quindi l'unico modo che vedo attualmente per fare questo sarebbe quello di salvare la quantità del carrello in sessione ogni volta che si aggiorna e quindi utilizzarlo in _getIdentifier()
.
Ho scoperto che gli osservatori sono incoerenti per il carrello. Inoltre, gli eventi di aggiornamento vengono inviati, ma per la rimozione, non lo fa. Quindi immagino di poter aggiungere il mio osservatore all'aggiornamento del prezzo del preventivo in qualche modo, se ciò è coerente con gli osservatori?
Inoltre, ho letto l' annullamento della cache a pagina intera sulla modifica del carrello (preventivo) ma non si gestisce
Enterprise_PageCache_Model_Cookie::COOKIE_CART
che non funziona bene nel mio caso, anche se penso che il problema risieda al suo interno. Cosa come? Non sono sicuro.
Anche l'attuale versione di EE in esecuzione non ha nemmeno la cartella Avanzate in
Model/Container
. sto usandoEE 1.10.1.1
Eventuali suggerimenti?
_getIdentifier
modo che il blocco sia univoco per il carrello dei clienti o anche il numero di articoli nel loro carrello?