2012-10-31 13 views
5

Utworzono niestandardowy atrybut kategorii. Teraz potrzebuję uzyskać dostęp do jego wartości w funkcji _getHtml() z Topmenu.php.Magento uzyskać wartość atrybutu kategorii w Topmenu.php

Czy ktoś może mi powiedzieć jak to zrobić? :)

Każda pomoc jest mile widziana :)

+0

jaka wersja jesteś stronie? Odpowiedź będzie zależeć od tego, czy masz 1.7 lub niższą –

+0

Jestem w wersji 1.7.0.2 :) – Weszzz7

Odpowiedz

8

nie będzie w stanie uzyskać tego rodzaju danych wewnątrz bloku TopMenu, chyba że niektóre zmiany.

Nawigacja jest zbudowana na bazie ogólnej struktury drzewiastej, która nie ma koncepcji kategorii, ale jest zbudowana gdzie indziej przy użyciu kategorii.

Jeśli spojrzeć wewnątrz Topmenu.php widać gdzie nawigacja jest zbudowana:

Mage::dispatchEvent('page_block_html_topmenu_gethtml_before', array(
    'menu' => $this->_menu 
)); 

To będzie wystrzelić zdarzenie, które ma obserwatora dołączony który będzie budować elementy nawigacyjne dla nas, co zdarza się:

Model: Mage_Catalog_Model_Observer 
Method: _addCategoriesToMenu() 

następnie można dodać nowy atrybut do danych węzła, który będzie wtedy dostępny wewnątrz Topmenu.php

Przykład:

$categoryData = array(
    'name' => $category->getName(), 
    'id' => $nodeId, 
    'url' => Mage::helper('catalog/category')->getCategoryUrl($category), 
    'is_active' => $this->_isActiveMenuCategory($category), 
    'my_attribute' => $category->getData('my_attribute') // Add our data in... 
); 

Powinieneś być w stanie korzystać z tego środka Topmenu :: _ getHtml() Odpowiedź

echo $child->getData('my_attribute'); 
+0

Dziękuję, udało mi się to zrobić samemu i zapomniałem opublikować to tutaj. Mam jednak nadzieję, że ta odpowiedź pomoże innym, którzy próbują osiągnąć to samo. – Weszzz7

13

Andrzeja jest sposób i zazwyczaj to zrobić. Należy jednak pamiętać, że w przypadku dodawania niestandardowego atrybutu i jeśli chcesz, aby Twój sklep działał z włączonymi i włączonymi płaskimi tabelami kategorii, musisz upewnić się, że do kodu dodano następujące elementy:

Włączone Twój modułu config.xml:

... 
<frontend> 
    <category> 
     <collection> 
      <attributes> 
       <my_attribute /><!-- your attribute code here --> 
      </attributes> 
     </collection> 
    </category> 
</frontend> 
... 

to będzie upewnić się, że atrybut jest ładowany, gdy zbiór domyślna kategoria jest tworzony na Mage_Catalog_Model_Resource_Category_Tree::_getDefaultCollection(). Teraz działa to świetnie, gdy sklep jest ustawiony na NOT, aby używać kategorii płaskich tabel. Jeśli chcesz korzystać z płaskich stołów, będziesz musiał dodać swoje atrybuty w Mage_Catalog_Model_Resource_Category_Flat::_loadNodes. Znajdź poniższy kod, w którym tworzony jest select, a także dodać tam swój kod atrybutu:

$select = $_conn->select() 
    ->from(
     array('main_table' => $this->getMainStoreTable($storeId)), 
     array('entity_id', 
      new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('name')), 
      new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('path')), 
      'is_active', 
      'is_anchor', 
      'my_attribute')) /* add your attribute code here */ 

Dopiero że atrybut pojawi się na obserwatora. Nie trzeba dodawać, że robię to przy użyciu nadpisywania, nigdy nie zmieniaj podstawowego kodu.

+0

Oprócz odpowiedzi Andrzeja musiałem wykonać pokazaną tutaj część config.xml, aby to zadziałało. Dzięki! – Anthony

+0

Tak, zgadzam się z Anthonym na podstawie odpowiedzi Andrzeja, musimy również postępować zgodnie z tymi zmianami. –

1

Wystarczy wypełnić Gabriel Silva Queiroz odpowiedź:

zamiast edycji lub nadrzędnego Mage_Catalog_Model_Resource_Category_Flat :: _ loadNodes metody można użyć obserwatora:

Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select)); 
+0

Przyjemnie, że dodali to wydarzenie, którego nie było, kiedy napisałem odpowiedź ... Rzeczywiście znacznie lepiej niż przesłonięcie. –

Powiązane problemy