2011-11-17 17 views
6

Mam niestandardowy moduł, który wyświetla dane na stronach moich produktów. Mój moduł musi uzyskać aktualny identyfikator produktu. Próbowałem za pomocą:Magento przekazuje bieżący identyfikator produktu do modułu

Mage::registry('current_product'); 

Działa to na pierwszym obciążeniu ale gdy odświeżam, current_product nie ma już danych z pełną buforowanie stron dalej.

Wszelkie pomysły?

Odpowiedz

13

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

Vinai - ustawiam obserwatora i nadal otrzymuję komunikat "Błąd krytyczny: wywołanie funkcji członka getId() na obiekcie nie będącym obiektem" – rlflow

+0

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

+0

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

0

powinieneś mieć w kontrolerze swojego modułu coś, co inicjuje rejestrację bieżącego produktu. Będziesz musiał opublikować między odwiedzoną stroną przez użytkownika identyfikator swojego produktu (zalecane) lub zapisać go w sesji. Oto przykład tego, co można zrobić w kontrolerze:

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 - Postaram się to, ale jest bardzo podobne do niektórych rzeczy, które już wypróbowałem - problem polega na tym, że kiedy Mage :: registry ("current_product") jest pusty, tak samo jest wszystko inne - dlatego nie wierzę Magowi :: register ('current_product', Mage :: getModel ("katalog/produkt")); zrobi wszystko, co można, – rlflow

Powiązane problemy