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();
}
Vinai - Ho impostato l'osservatore e continuo a ottenere "Errore irreversibile: chiamata a una funzione membro getId() su un oggetto non in" – rlflow
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
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