2011-11-17 10 views
6

Tengo un módulo personalizado que muestra datos en mis páginas de productos. Mi módulo necesita obtener la identificación del producto actual. He intentado utilizar:Magento pasa la identificación actual del producto al módulo

Mage::registry('current_product'); 

Esto funciona en la primera carga, pero cuando restauro, current_product ya no tiene datos con el almacenamiento en caché de página completa en.

¿Alguna idea?

Respuesta

13

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(); 
} 
+0

Vinai - Configuré el observador y sigo recibiendo "Error fatal: Llamar a una función miembro getId() en un no objeto en" – rlflow

+0

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

+0

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

0

debe tener en el controlador de su módulo algo que inicie el registro del producto actual. Tendrá que publicar entre la página visitada por un usuario el ID de su producto (recomendado) o guardarlo en una sesión. Aquí está un ejemplo de lo que puede hacer en un controlador:

protected function _initAction(){ 

    if(! Mage::registry('current_product')){ 
     Mage::register('current_product', Mage::getModel('catalog/product')); 
    } 

    $id = $this->getRequest()->getParam('id'); 
    if (!is_null($id)) { 
     $model = Mage::registry('current_product')->load($id); 

     if (! $model->getId()) { 
      $this->_getSession()->addError(Mage::helper('catalog')->__('This product item no longer exists')); 
      $this->_redirect('*/*/'); 
      return; 
     } 
    } 

    return $this; 
} 

public function indexAction() 
{ 
    $this->_initAction(); 
    // your code below 
} 
+0

Diglin - Voy a tratar esto, pero es muy similar a algunas cosas que ya he probado - el problema es que cuando Mage :: registry ('current_product') está vacío, también lo es todo lo demás - por lo tanto, no creo Mage :: register ('current_product', Mage :: getModel ('catálogo/producto')); haré cualquier cosa – rlflow

Cuestiones relacionadas