He implementado la perforación del encabezado en magento, y aunque lo he hecho trabajar por cliente, necesito la capacidad de llevar este nivel más profundo al hacer que también funcione en los recuentos de artículos de carrito de diferencias.
Aquí está mi 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();
}
}
Según tengo entendido, lo que he estado leyendo de los subprocesos en Magento es que la aplicación Mage no se inicializa cuando el caché FPC atiende la solicitud, por lo que básicamente el método de agregar un atributo de marcador de posición no puede funcionar, ya que
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
no funcionará, ¿verdad?
Y a pesar de cómo es que debería ser, pero no parecía funcionar en absoluto, como si die()
hubiera hecho una llamada allí pero no pasó nada.
Entonces, ¿qué me estoy perdiendo? ¿Y cómo puedo recuperar el recuento de artículos del carrito para que pueda usarse para construir la ID de caché?
Progreso: encontré
Enterprise_PageCache_Model_Cookie::COOKIE_CART
pero esto cambia solo una vez al actualizar el carrito. Después de eso se queda igual. Esto es extraño, parece la solución, pero su comportamiento dice lo contrario.
Tampoco pude encontrar el recuento de artículos del carrito en la sesión. Entonces, la única forma en que veo esto es guardar la cantidad del carrito en la sesión cada vez que se actualiza y luego usarla _getIdentifier()
.
Encontré que los observadores son inconsistentes para el carro. Además, la actualización de los eventos se envía, pero para su eliminación, no lo hace. Entonces, supongo que puedo agregar mi observador a la actualización de precios de la cotización de alguna manera, si eso es consistente en tener observadores.
Además, leí la invalidación de caché de página completa en el cambio de carrito (presupuesto) pero se maneja usando
Enterprise_PageCache_Model_Cookie::COOKIE_CART
lo que no funciona bien en mi caso, aunque creo que el problema reside en él. ¿Que? como? No estoy seguro.
Además, la versión actual de EE que tenemos en ejecución ni siquiera tiene una carpeta avanzada
Model/Container
. estoy usandoEE 1.10.1.1
¿Alguna sugerencia?
fuente
_getIdentifier
que el bloque sea exclusivo del carrito de los clientes, o incluso el número de artículos en su carrito?Respuestas:
Usar
Enterprise_PageCache_Model_Cookie::COOKIE_CART
es el camino correcto, pero es posible que deba hacer algunos cambios.Enterprise_PageCache_Model_Observer::registerQuoteChange
se llama en cada presupuesto guardado (cambio de número de artículo incluido) y también se llama en el contextoMage::app()
para que pueda acceder a todos los datos de la sesión. Sobrescriba este observador y agregue más datos$this->_getCookie()->setObscure
para que el valor cambie siempre que lo necesite.fuente