El controlador de acción producto de catálogo, no se expide, cuando la caché de página completa controla la solicitud (que tiene sentido mantener las cosas rápido). Entonces, las variables de registro nunca se establecen. Supongo que está generando el bloque de forma dinámica en la página de otro modo completamente en caché. Mi recomendación es tratar de evitar las cargas costosas, ya que eso socavaría las mejoras de velocidad del caché de página completa. Realmente desea almacenar en caché el bloque, si es posible, incluso si se trata de una entrada de caché independiente para cada cliente y cada producto.
Dicho esto, aquí es cómo hacerlo:
En el recipiente, poner en práctica la _getIdentifier()
método:
protected function _getIdentifier()
{
return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
}
también amplían el método _getCacheId()
para incluir el valor de retorno de la _getIdentifier método() y un nuevo atributo marcador de posición: product_id
protected function _getCacheId()
{
return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . ',' . $this->_placeholder->getAttribute('product_id')) . '_' . $this->_getIdentifier();
}
a continuación, en la clase de bloque, extender el método getCacheKeyInfo()
. Todas las entradas en la matriz cache_key_info con un índice de cadena se establecen en el marcador de posición como atributos. Así es como podemos pasar la identificación del producto al marcador de posición.
public function getCacheKeyInfo()
{
$info = parent::getCacheKeyInfo();
if (Mage::registry('current_product'))
{
$info['product_id'] = Mage::registry('current_product')->getId();
}
return $info;
}
a continuación, active el método _saveCache()
por no anulando en su clase de contenedor y volviendo false
. Así que ahora, dado que el contenedor devuelve un ID válido de _getCacheId()
, y _saveCache()
se hereda de la clase principal, el bloque se puede almacenar en caché y aplicarse al contenido de manera eficiente en Enterprise_PageCache_Model_Container_Abstract::applyWithoutApp()
.
Puede establecer la duración de la entrada de la memoria caché haciendo que su contenedor se extienda desde Enterprise_PageCache_Model_Container_Customer
en lugar de Enterprise_PageCache_Model_Container_Abstract
.
Si usted todavía tiene que pasar el product_id al bloque (a pesar de que se almacena en caché ahora), puede hacerlo en el método de su contenedor _renderBlock()
:
protected function _renderBlock()
{
$blockClass = $this->_placeholder->getAttribute('block');
$template = $this->_placeholder->getAttribute('template');
$block = new $blockClass;
$block->setTemplate($template)
->setProductId($this->_placeholder->getAttribute('product_id'));
return $block->toHtml();
}
Vinai - Configuré el observador y sigo recibiendo "Error fatal: Llamar a una función miembro getId() en un no objeto en" – rlflow
De alguna manera todavía no estoy muy seguro de qué es exactamente lo que quiere lograr, es decir, qué lo hará con la identificación del producto y por qué el bloque debe generarse dinámicamente. Quizás más información me ayude a dar una mejor respuesta. – Vinai
bien esto es para tener un bloque de comparación en la página del producto. en este momento se está almacenando en caché y si agrega un producto para comparar, el enlace agregar para comparar aún está allí. Lo que quiero que suceda es que el enlace agregar para comparar sea reemplazado por un enlace de eliminar comparar y comparar: '{dominio}/catálogo/producto_compare/agregar/producto/123456 /' - agregar enlace '(dominio}/catálogo/product_compare/remove/product/123456/'- eliminar el enlace ' {domain}/catalog/product_compare/index/'- comparar el enlace – rlflow