2011-11-17 16 views
6

Ho un modulo personalizzato che visualizza i dati sulle mie pagine di prodotto. Il mio modulo deve ottenere l'id del prodotto corrente. Ho provato ad utilizzare:Magento passa l'ID prodotto corrente al modulo

Mage::registry('current_product'); 

Questo funziona al primo carico, ma quando rinfresco, current_product non ha più dati con tutta pagina la memorizzazione nella cache.

Qualche idea?

risposta

13

Il controller azione di catalogo non viene inviato, quando la cache della pagina intera gestisce la richiesta (che ha senso per mantenere le cose in fretta). Quindi, le variabili di registro non sono mai impostate. Suppongo che tu stia generando il blocco dinamicamente sulla pagina altrimenti completamente memorizzata nella cache. La mia raccomandazione è di cercare di evitare carichi costosi, poiché ciò comprometterebbe i miglioramenti di velocità della cache della pagina intera. Vuoi davvero mettere in cache il blocco se possibile, anche se si tratta di una voce cache separata per ogni cliente e ogni prodotto.

Ciò detto, ecco come fare:

Nel contenitore, implementare il metodo _getIdentifier():

protected function _getIdentifier() 
{ 
    return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, ''); 
} 

ampliare Anche il metodo _getCacheId() includere il valore di ritorno del metodo _getIdentifier() e un nuovo attributo placeholder: product_ID

protected function _getCacheId() 
{ 
    return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . ',' . $this->_placeholder->getAttribute('product_id')) . '_' . $this->_getIdentifier(); 
} 

successiva, nella classe blocco, estendere il metodo getCacheKeyInfo(). Tutte le voci nell'array cache_key_info con un indice stringa sono impostate sul segnaposto come attributi. È così che possiamo passare l'id del prodotto al segnaposto.

public function getCacheKeyInfo() 
{ 
    $info = parent::getCacheKeyInfo(); 
    if (Mage::registry('current_product')) 
    { 
     $info['product_id'] = Mage::registry('current_product')->getId(); 
    } 
    return $info; 
} 

quindi attivare il metodo _saveCache() da non override nella vostra classe contenitore e il ritorno false. Quindi, poiché il contenitore restituisce un ID valido da _getCacheId() e _saveCache() è ereditato dalla classe padre, il blocco può essere memorizzato nella cache e applicato al contenuto in modo efficiente in Enterprise_PageCache_Model_Container_Abstract::applyWithoutApp().

È possibile impostare la durata della voce della cache estendendo il contenitore da Enterprise_PageCache_Model_Container_Customer anziché da Enterprise_PageCache_Model_Container_Abstract.

Se hai ancora bisogno di passare il product_id al blocco (anche se è memorizzato nella cache ora), è possibile farlo nel metodo del vostro contenitore _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 - Ho impostato l'osservatore e continuo a ottenere "Errore irreversibile: chiamata a una funzione membro getId() su un oggetto non in" – rlflow

+0

In qualche modo non sono ancora abbastanza sicuro di cosa esattamente si vuole realizzare, cioè cosa lo farai con l'ID del prodotto e il motivo per cui il blocco deve essere generato dinamicamente. Forse ulteriori informazioni mi aiuteranno a dare una risposta migliore. – Vinai

+0

bene questo è per avere un blocco di confronto sulla pagina del prodotto. in questo momento viene memorizzato nella cache e se aggiungi un prodotto da confrontare, il link aggiungi a confronto è ancora lì. quello che voglio succedere è che il link aggiungi a confrontare sia sostituito con un link di confronto e confronto delete: '{dominio}/catalogo/prodotto_compare/aggiungi/prodotto/123456 /' - aggiungi il link '(dominio}/catalogo/product_compare/remove/product/123456/'- rimuovi link ' {domain}/catalog/product_compare/index/'- confronta il link – rlflow

0

si dovrebbe avere nel controller del modulo qualcosa che avvia la registrazione del prodotto corrente. Dovrai pubblicare tra la pagina visitata da un utente l'id del tuo prodotto (consigliato) o salvarlo in una sessione. Ecco un esempio di cosa si può fare in un controllore:

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 - Cercherò questo, ma è molto simile ad alcune cose che ho già provato - il problema è che quando Mage :: registry ('current_product') è vuoto, così è tutto il resto - quindi non credo Mage :: register ('current_product', Mage :: getModel ('/ catalogo della merce')); farà qualsiasi cosa – rlflow

Problemi correlati