Katalog kontroler akcja produkt nie jest wywoływane, gdy cała strona cache obsługuje żądanie (co ma sens, aby utrzymać rzeczy szybko). W związku z tym zmienne rejestru nigdy nie są ustawione. Zakładam, że dynamicznie generujesz blok na stronie w pełni buforowanej. Moja rekomendacja to próba uniknięcia kosztownych obciążeń, ponieważ podważyłoby to wzrost szybkości dzięki pełnej pamięci podręcznej strony. Naprawdę chcesz buforować blok, jeśli to w ogóle możliwe, nawet jeśli jest to oddzielny wpis w pamięci podręcznej dla każdego klienta i każdego produktu.
Powiedział, oto jak to zrobić:
W pojemniku, wdrożyć metodę _getIdentifier()
:
protected function _getIdentifier()
{
return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
}
rozwinąć także metodę _getCacheId()
zawierać wartość zwracaną metodzie _getIdentifier() a nowy atrybut zastępczy: pRODUCT_ID
protected function _getCacheId()
{
return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . ',' . $this->_placeholder->getAttribute('product_id')) . '_' . $this->_getIdentifier();
}
Następnie w klasie bloku, rozszerzyć metodę getCacheKeyInfo()
. Wszystkie wpisy w tablicy cache_key_info z indeksem łańcuchowym są ustawiane na symbol zastępczy jako atrybuty. W ten sposób możemy przekazać identyfikator produktu do symbolu zastępczego.
public function getCacheKeyInfo()
{
$info = parent::getCacheKeyInfo();
if (Mage::registry('current_product'))
{
$info['product_id'] = Mage::registry('current_product')->getId();
}
return $info;
}
Następnie włączyć metodę _saveCache()
przez nie przesłanianie go w swojej klasie pojemnika i powrocie false
. Teraz, ponieważ kontener zwraca poprawny identyfikator z _getCacheId()
, a _saveCache()
jest dziedziczony z klasy nadrzędnej, blok może być buforowany i stosowany do treści w skuteczny sposób w Enterprise_PageCache_Model_Container_Abstract::applyWithoutApp()
.
Można ustawić żywotność wejścia pośredniczącego poprzez swoją pojemnik rozciągają się od Enterprise_PageCache_Model_Container_Customer
zamiast Enterprise_PageCache_Model_Container_Abstract
.
Jeśli trzeba jeszcze przejść product_id do bloku (mimo to w pamięci podręcznej teraz), można to zrobić w metodzie kontenera _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 - ustawiam obserwatora i nadal otrzymuję komunikat "Błąd krytyczny: wywołanie funkcji członka getId() na obiekcie nie będącym obiektem" – rlflow
Jakoś nadal nie jestem do końca pewien, co dokładnie chcesz osiągnąć, tj. będziesz robić z identyfikatorem produktu i dlaczego blok musi być generowany dynamicznie. Może więcej informacji pomoże mi dać lepszą odpowiedź. – Vinai
cóż, to jest za blok porównania na stronie produktu. teraz jest buforowany i jeśli dodasz produkt do porównania, link do porównania jest nadal dostępny. Chcę tylko, aby link do porównania został zastąpiony linkiem porównania i porównania linków: '{domain}/catalog/product_compare/add/product/123456 /' - dodaj link '(domena}/catalog/product_compare/remove/product/123456/'- remove link ' {domain}/catalog/product_compare/index/'- porównaj link – rlflow