2013-08-30 5 views
9

Cercando di avere figli di una categoria specifica che è attiva. Per favore aiuto. Sto avendo problemi a farlo. Al momento sono in grado di mostrarli tutti ma non specificamente. Gradirei qualsiasi aiuto.Ottieni categorie bambino magento

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

risposta

33

qui è il codice per caricare categoria attiva

/* 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>'; 
    } 
} 
?> 

speranza questo è sicuro aiuto.

+0

Grazie mille ora funziona. – Tonzkie

+1

Usa getAllChildren e passa true ad esso, questo restituirà un array. Non c'è bisogno di esplodere la corda. Lyle Mcclanahan offre il miglior consiglio – Tisch

+0

fantastico grazie! – zaw

1

Ciao si vedrà in seguito il codice

$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

Il liyakat una risposta ha scritto, non deve essere utilizzato nei negozi professionali, perché solleva un problema di prestazioni, a causa dei molteplici carichi temporali dell'oggetto categoria, piuttosto usa la raccolta di categorie per quello, ottieni tutti i bambini

$cat->getAllChildren() 

, quindi limitare la raccolta categoria dai ID di categoria necessari come

$coll->addIdFilter($idFilter); 

quindi non sarà necessario caricare n volte a fronte del database.

Si prega di tenere presente che i carichi nei loop sono uno degli esempi di codice errato più frequentemente usati in tutti i progetti Magento e per evitarli!

12

Come menzionato da mhaupt, è più veloce caricare una raccolta piuttosto che ogni categoria in un ciclo. Ma, per quanto mi riguarda, non è necessario caricare manualmente le categorie figlio. Fondamentalmente questo è quello che già fa $category->getChildrenCategories().

C'è anche un filtro per ottenere solo le categorie attive. Basta chiamare lo addIsActiveFilter() sulla raccolta.

a.) Carico attivo categorie bambino tramite 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.) Load-categorie attive con getChildrenCategories()

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

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

La collezione saranno caricati modulo del database non appena a cui si accede. Se la raccolta non viene caricata e $subcategories->count() viene chiamato solo un "SELECT count (*)" verrà generato contro il database (in contrasto con count($subcategories) che costringerà la raccolta a caricarsi).

Iterando la raccolta

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

Se si aggiungono altri filtri per la raccolta dopo l'accesso di esso, la collezione non caricarsi di nuovo automaticamente. Per applicare le modifiche alla raccolta, è sufficiente chiamare lo $categoryCollection->load() per ricaricare la raccolta dal database.

+0

'getChildrenCategories' ti darà una raccolta * caricata * e * filtrata attiva * (vedi 'Mage_Catalog_Model_Resource_Category :: getChildrenCategories()'). Non solo 'addIsActiveFilter' è ridondante, ma inutile, come qualsiasi altra chiamata che modifica la raccolta successiva, perché la raccolta è già stata caricata. Forse questo metodo è migliore: '\ Mage_Catalog_Model_Category :: getCategories ($ parent, $ recursionLevel = 0, $ sorted = false, $ asCollection = false, $ toLoad = true)'. – nevvermind

5

Coloro che stanno dicendo di utilizzare getAllChildren() anziché getChildren() sono semplicemente errati. Entrambi i metodi restituiscono la stessa identica cosa, con una differenza, getAllChildren (true) restituirà una matrice invece di una stringa delimitata da virgole. getAllChildren ($ bool asArray) ha come valore predefinito false. Il mio punto è che in entrambi i casi si dovrà usare

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

all'interno di un ciclo a meno che non si usi la funzione di seguito.

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

Questo è il modo giusto per farlo, peccato che sia l'ultimo qui –