2013-08-30 11 views
9

Versuchen, Kind einer bestimmten Kategorie, die aktiv ist, zu bekommen. Bitte helfen Sie. Ich habe Probleme damit. Ich bin derzeit in der Lage, sie alle zu zeigen, aber nicht speziell. Würde mich über jede Hilfe freuen.Get Child Kategorien magento

$category = Mage::getModel('catalog/category')->load(2); 
$category->getChildCategories(); 
$tree = $category->getTreeModel(); 
$tree->load(); 
$ids = $tree->getCollection()->getAllIds(); 

Antwort

33

hier ist der Code aktiv Kategorie

/* Load category by id*/ 
$cat = Mage::getModel('catalog/category')->load($id); 


/*Returns comma separated ids*/ 
$subcats = $cat->getChildren(); 

//Print out categories string 
#print_r($subcats); 

foreach(explode(',',$subcats) as $subCatid) 
{ 
    $_category = Mage::getModel('catalog/category')->load($subCatid); 
    if($_category->getIsActive()) 
    { 
    $caturl  = $_category->getURL(); 
    $catname  = $_category->getName(); 
    if($_category->getImageUrl()) 
    { 
     $catimg  = $_category->getImageUrl(); 
    } 
    echo '<h2><a href="'.$caturl.'" title="View the products for this category"><img src="'.$catimg.'" alt="" />'.$catname.'</a></h2>'; 
    } 
} 
?> 

Hoffnung zu laden, ist diese sicher helfen Ihnen.

+0

Vielen Dank es funktioniert jetzt. – Tonzkie

+1

Verwenden Sie getAllChildren und übergeben Sie true, um ein Array zurückzugeben. Keine Notwendigkeit, die Zeichenfolge zu explodieren. Lyle Mcclanahan bietet den besten Rat – Tisch

+0

genial Danke! – zaw

1

Hallo Ihr Code unten sehen

$category_model = Mage::getModel('catalog/category'); 
    $_category = $category_model->load(13); 
    $all_child_categories = $category_model->getResource()->getAllChildren($_category); 
    print_r($all_child_categories); 
2

Die eine Antwort Liyakat schrieb, sollte nicht in Fachgeschäften verwendet werden, da es verursacht ein Leistungsproblem, wegen der mehrfachen n Zeitlasten des Kategorienobjekts, verwenden Sie stattdessen die Sammlung der Kategorien, erhalten Sie alle Kinder

$cat->getAllChildren() 

, dann von der benötigten Kategorie ids wie

$coll->addIdFilter($idFilter); 

die Kategorie Sammlung begrenzen dann werden Sie nicht n-mal für die Datenbank zu laden.

Bitte beachten Sie, dass Loads innerhalb von Loops zu den am häufigsten verwendeten Code-Beispielen in Magento-Projekten gehören und diese vermeiden!

12

Wie von mhaupt erwähnt, ist es schneller, eine Sammlung als jede Kategorie in einer Schleife zu laden. Soweit es mich betrifft, müssen die Unterkategorien nicht manuell geladen werden. Im Prinzip ist dies bereits $category->getChildrenCategories().

Es gibt auch einen Filter, um nur aktive Kategorien zu erhalten. Rufen Sie einfach addIsActiveFilter() auf der Sammlung an.

a.) Last aktive Kind Kategorien über getChildren()

// 1. Get a list of all child category ids (e.g "12,23,11,42") 
$subcategoryIds = $category->getChildren(); 

// 2. Create collection 
$categoryCollection = Mage::getModel('catalog/category')->getCollection(); 

// 3. Add all attributes to select, otherwise you can not 
// access things like $cat->getName() etc. 
$categoryCollection->addAttributeToSelect('*'); 

// 4. Filter by ids 
$categoryCollection->addIdFilter($subcategoryIds); 

// 5. Add filter to collection to get active categories only 
$categoryCollection->addIsActiveFilter(); 

b.) Belastung aktive Kind Kategorien mit getChildrenCategories()

// 1. Load collection 
$categoryCollection= $category->getChildrenCategories(); 

// 2. Add filter to collection to get active categories only 
$categoryCollection->addIsActiveFilter(); 

Die Kollektion wird Form, sobald die Datenbank geladen werden wie es zugegriffen wird. Wenn die Sammlung nicht geladen wird und $subcategories->count() aufgerufen wird, wird nur ein "SELECT count (*)" gegen die Datenbank ausgelöst (im Gegensatz zu count($subcategories), wodurch die Sammlung zum Laden gezwungen wird).

Iterieren die Sammlung

foreach($categoryCollection as $category) { 
    echo $category->getName(); 
} 

Wenn Sie mehrere Filter zur Sammlung hinzuzufügen, nachdem es den Zugriff auf die Sammlung wird sich nicht wieder automatisch geladen. Um Änderungen an der Sammlung vorzunehmen, rufen Sie einfach $categoryCollection->load() auf, um die Sammlung von der Datenbank neu zu laden.

+0

'getChildrenCategories' gibt dir eine * geladene * und * aktiv-gefilterte * Sammlung (siehe 'Mage_Catalog_Model_Resource_Category :: getChildrenCategories()'). Nicht nur 'addIsActiveFilter' ist redundant, sondern nutzlos, wie jeder andere Aufruf, der die Sammlung verändert, weil die Sammlung bereits geladen ist. Vielleicht ist diese Methode besser: '\ Mage_Catalog_Model_Category :: getCategories ($ parent, $ recursionLevel = 0, $ sortierte = false, $ asCollection = false, $ toLoad = true)'. – nevvermind

5

Diejenigen, die sagen, getAllChildren() anstelle von getChildren() zu verwenden, sind einfach falsch. Beide Methoden geben genau dasselbe zurück, wobei getAllChildren (true) ein Array anstelle einer durch Kommas getrennten Zeichenfolge zurückgibt. getAllChildren ($ bool asArray) wird standardmäßig auf false gesetzt. Mein Punkt ist, dass Sie entweder innerhalb einer Schleife

Mage::getModel('catalog/category')->load($catId); 

verwenden müssen, wenn Sie die Funktion unten verwenden.

private function fetchCatsById($onlyThese) 
{ 
    $cats = Mage::getModel('catalog/category') 
       ->getCollection(true) 
       ->addAttributeToSelect('*') 
       ->addIdFilter($onlyThese) 
       ->addAttributeToFilter('level','2') 
       ->addIsActiveFilter(); 

    return $cats; 
} 

$cats = $this->fetchCatsById($onlyThese); 
+0

Dies ist der richtige Weg es zu tun, Schade, dass es hier zuletzt ist –

Verwandte Themen