Ruft Unterkategorien der übergeordneten Kategorie ab, wenn FLAT-Kategorien aktiviert sind


7

Ich überschreibe eine Blockklasse Mage_Catalog_Block_Navigation( Link zur Signatur ), um ein benutzerdefiniertes Menü zu erstellen, in dem nur Unterkategorien der aktuellen Kategorie angezeigt werden.

Innerhalb der Methode renderCategoriesMenuHtml( Link zur Signatur ) Ich versuche, untergeordnete Kategorien der ausgewählten übergeordneten Kategorie abzurufen. Also habe ich den Standardcode ersetzt:

foreach ($this->getStoreCategories() as $child) {
    //...
}

mit den folgenden:

/**
 * @param $parent ID of category from which we start
 * @param $recursionLevel How many levels of subcategories retrieve
 * getCategories(...) is a method from model Mage_Catalog_Model_Category
 */
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);
foreach ($storeCategories as $child) {
    //...
}

Dieser Code funktioniert einwandfrei und gibt Unterkategorien des ausgewählten übergeordneten Elements zurück. Sobald ich jedoch die "flache Katalogkategorie" aktiviere $parent, scheint die Variable vollständig ignoriert zu werden, und dieser Code gibt alle Kategorien der obersten Ebene anstelle von Unterkategorien der Kategorie mit ID zurück $parent.

Was mache ich falsch? Sollte die getCategoriesMethode nicht auch dann funktionieren, wenn flache Kategorien aktiviert sind?

BEARBEITEN:

Meine eigentliche Frage ist

  1. Warum ignoriert die Methode getCategoriesdes Modells Mage_Catalog_Model_CategoryParameter $parentund $recursionLevelwenn flache Kategorien aktiviert sind? (siehe Quelle der Methode unten)
  2. Gibt es mehr Methoden, die mit Flat Catalog anders funktionieren? Wie kann ich sie erkennen, um Probleme in Zukunft zu vermeiden?

Ich nenne es so in der Methode renderCategoriesMenuHtml:

$parent = 13;
$recursionLevel = 2;
$category = Mage::getModel('catalog/category');
$storeCategories = $category->getCategories($parent, $recursionLevel);

Bei nicht flachen Kategorien gibt dieser Code Unterkategorien (2 Ebenen wie in angegeben $recursionLevel) der Kategorie mit der ID 13 zurück. Bei aktivierten flachen Kategorien erhalte ich jedoch alle Kategorien der obersten Ebene mit allen Unterkategorien (begrenzt durch den Wert der Administratoreinstellungen 'catalog/navigation/max_depth', nicht durch $recursionLevel).

Methode im Modell Mage_Catalog_Model_Category:

public function getCategories($parent, $recursionLevel = 0, $sorted=false, $asCollection=false, $toLoad=true)
{
    $categories = $this->getResource()
        ->getCategories($parent, $recursionLevel, $sorted, $asCollection, $toLoad);
    return $categories;
}

ruft Methode im Ressourcenmodell auf Mage_Catalog_Model_Resource_Category:

public function getCategories($parent, $recursionLevel = 0, $sorted = false, $asCollection = false, $toLoad = true)
{
    $tree = Mage::getResourceModel('catalog/category_tree');
    /* @var $tree Mage_Catalog_Model_Resource_Category_Tree */
    $nodes = $tree->loadNode($parent)
        ->loadChildren($recursionLevel)
        ->getChildren();

    $tree->addCollectionData(null, $sorted, $parent, $toLoad, true);

    if ($asCollection) {
        return $tree->getCollection();
    }
    return $nodes;
}

Antworten:


8
$_category = Mage::getModel('catalog/category')->load(CATEGORY-ID);    
    $_categories = $_category
                    ->getCollection()
                    ->addAttributeToSelect(array('name', 'image', 'description'))
                    ->addIdFilter($_category->getChildren());

    foreach ($_categories as $_category):
       echo $_category->getName();
    endforeach;

Ich habe meine Frage bearbeitet.
Zitix

Mann, du hast meinen Arsch gerettet, danke. Das ist ein guter Trick - $ _category-> getChildren () gibt eine durch Kommas getrennte Zeichenfolge von Kategorie-IDs zurück, die Sie dann zum Filtern über addIdFilter () verwenden können. Smart :)
Siliconrockstar

2
<?php 
$parentCategoryId = 107;
$cat = Mage::getModel('catalog/category')->load($parentCategoryId);
$subcats = $cat->getChildren();

?>

// Get 1 Level sub category of Parent category.

<?php 

foreach(explode(',',$subcats) as $subCatid)
              {
                $_category = Mage::getModel('catalog/category')->load($subCatid);
  if($_category->getIsActive()) {
    echo '<ul><a href="'.$_category->getURL().'" title="View the products for the "'.$_category->getName().'" category">'.$_category->getName().'</a>';
   echo '</ul>';
  }
}

?>

Wenn Sie Unterkategorien mit 2 Ebenen, 3 Ebenen, 4 Ebenen oder n Ebenen der übergeordneten Kategorie möchten, klicken Sie hier


Könnte das Problem lösen, aber die gesamte Last ist schlecht für die Leistung, also seien Sie vorsichtig
Fabian Blechschmidt

Warum Sie alle Kategorien laden, verwenden Sie einfach die Kategorie-ID und laden Sie nur den Inhalt einer bestimmten Kategorie
user3146094
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.