Eu implementei o furo do cabeçalho no magento, e mesmo tendo trabalhado por cliente, preciso da capacidade de elevar esse nível um pouco mais fundo, fazendo com que ele funcione também na contagem de itens do carrinho de compras.
Aqui está o meu código.
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();
}
}
Meu entendimento do que tenho lido em threads de perfuração no Magento é que o aplicativo Mage não é inicializado quando o cache do FPC está atendendo à solicitação, portanto, basicamente, o método de adicionar um atributo de espaço reservado não pode funcionar, pois
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
não vai funcionar, certo?
E apesar de como é que deveria ser, mas não parecia funcionar, como se eu die()
tivesse feito uma ligação lá, mas nada aconteceu.
Então o que estou perdendo? E como posso recuperar a contagem de itens do carrinho para que ele possa ser usado para criar o ID do cache?
Progresso: encontrei
Enterprise_PageCache_Model_Cookie::COOKIE_CART
mas isso muda apenas uma vez após a atualização do carrinho. Depois disso, permanece o mesmo. Isso é estranho, parece a solução, mas seu comportamento diz o contrário.
Também não consegui encontrar a contagem de itens do carrinho na sessão. Portanto, a única maneira que vejo atualmente para fazer isso seria salvar a quantidade do carrinho na sessão sempre que ela for atualizada e usá-la _getIdentifier()
.
Eu descobri que os observadores são inconsistentes para o carrinho. Além disso, a atualização dos eventos é despachada, mas para remoção, não. Então, acho que posso adicionar meu observador à atualização de preço da cotação de alguma forma, se isso for consistente em ter observadores?
Além disso, li a invalidação do cache de página inteira na alteração do carrinho (cotação), mas lida com o uso de
Enterprise_PageCache_Model_Cookie::COOKIE_CART
o que não funciona bem no meu caso, embora eu ache que o problema está dentro dele. O quão? Não tenho certeza.
Além disso, a versão atual do EE que estamos executando nem tem a pasta Avançado
Model/Container
. estou usandoEE 1.10.1.1
Alguma sugestão?
fonte
_getIdentifier
que o bloco seja exclusivo do carrinho de clientes ou mesmo o número de itens no carrinho?Respostas:
Usar
Enterprise_PageCache_Model_Cookie::COOKIE_CART
é o caminho certo a seguir, mas pode ser necessário fazer algumas alterações.Enterprise_PageCache_Model_Observer::registerQuoteChange
é chamado em cada salvamento de cotação (mudança de número de item incluída) e também é chamado no contextoMage::app()
para que você possa acessar todos os dados da sessão. Substitua esse observador e inclua mais dados$this->_getCookie()->setObscure
para que o valor mude sempre que você precisar.fonte