Kategorieimport aus Datenbanksicht

Kategorieimport mit Unterkategorien ohne Rekursionen – so wollte ich den Artikel eigentlich nennen….

Gibt es das Wort „Rekursionen“ – im Laufe dieses Beitrags werde ich es nachschlagen und Ihr müsst bis zum Ende lesen, bevor ich das Nachschlageergebnis zum besten geben werde.

Solange rede ich halt vom Kategorieimport.

Der Kategorieimport ist denkbar simpel – auf den ersten Blick.

Im ersten Adventskalendertürchen im Magento-Webguys-Adventskalender-2010 (Türchen 01: Eine Kateogrie anlegen) steht’s geschrieben:

$category = Mage::getModel('catalog/category');
$category->setPath( '1/2' );
$category->setName( $name );
$category->save();

Um einen Vergleich zu haben, wie es aus Datenbanksicht richtig aussieht, habe ich zunächst eine Kategorie über das Magento-Backend eingepflegt. Und eine Unterkategorie gab’s auch noch. Das sieht dann so aus:

Meine Kategorien heißen ‚Top-Categoy-Backend‘ und ‚Sub-Category-Backend‘.

Wenn man nun die Motorhaube einmal aufmacht, dann findet man diese Kategorien in der Tabelle ‚catalog_category_entity‘ wieder:

entity_id -> ist die Entity ID der Kategorie, also quasi der Primärschlüssel.

entity_type_id -> 3 ist der Typ „Kategorie“

attribute_set_id -> ist das Attributset für Kategorien (Kategorien haben ja auch Attribute, nicht nur Produkte). Dies fehlt im obigen Beispiel. Diese ID sollte man also auf jeden Fall noch setzen.

parent_id -> ist die entity_id der Kategorie, unter der die Kategorie eingruppiert wird.

created_at und updated_at erklär ich mal nicht.

path -> Im Feld Path werden die entity_id’s beginnend mit der obersten (der Root Catalog) gesetzt, bis man bei der entity_id angelangt ist, die zur Kategorie selbst gehört.
path = 1 ist also die ID der Root-Catalog – der Container für alle Kategorie-Container, sozusagen. Den wird man nie im Frontend namentlich zu sehen bekommen…. Dann folgt in diesem Fall die ‚Default Category‘, das ist der Kategorie-Container für den jeweiligen Store, der in den Manage-Store-Einstellungen zugewiesen wird. Und dann folgen schließlich die entity_id’s der im Shop sichtbaren Kategorien: 3 für die Top-Category-Backend und 4 für die Sub-Category-Backend.

Demnach hätte eine weitere Top-Category-Backend-2 mit der Entity ID 5 den Pfad: 1/2/5.
Und eine weitere Sub-Category-Backend-2 mit der Entity ID 6 den Pfad 1/2/3/6, wenn sie denn zur Top-Category-Backend gehört. Wenn sie zur Top-Category-Backend-2 gehören würde wäre es ein 1/2/5/6-Pfad.

Hausaufgaben: Pfade bauen.

Die Position erklärt sich dann schon fast wieder von selbst. Das ist die Position, die die Kategorie in ihrer jeweiligen Parent-Kategorie inne hat.

Der Level besagt, wie weit sich diese Kategorie im Baumgeäst befindet. Erste Ebene. zweite Ebene. Die ‚Default Category‘ nimmt Level 1 ein. Die erste im Shop sichtbare Kategorie hat demnach Level 2.

Testfrage: Wechen Level hat die Kategorie mit dem Pfad 1/2/5/6?

Children Count gibt die Summe der Kategorien an, die sich innerhalb dieser Kategorie befinden. Die Summe aller Kategorien kann man daher in der Kategorie ‚Root Catalog‘ ablesen, wenn es 200 Kategorien gibt, hat diese 200 Children. In meinem Beispiel hat die ‚Default Category‘ 2 Kinder, wenn ich die beiden weiteren Kategorien gespeichert hätte, wären es vier… usw. usf.

Warum ich das alles erkläre?

Weil man sehr sehr leicht und sehr sehr schnell die Pfade vergißt… und dann würde ein

$category = Mage::getModel('catalog/category');
$category->setName( $name );
$category->save();

zu einem solchen Ergebnis führen:

Dann wäre die Kateogrie nicht zu sehen.

Unliebsam wird es dann, wenn der Kategoriebaum größer wird und man bei den Importinformationen nur den Namen der nächsten Parent-Kategorie hat, nicht aber alle IDs der übergeordneten Kategorien – sprich: was tun, wenn man nicht sicher weiß, dass man immer nur „1/2“ schreiben muss, um das Menü zu füllen.

Da gibt es dann zwei Möglichkeiten:
Laden der Parent-Kategorie und deren Pfad (z.B. 1/2/7) verwenden, um diesen als Path beim neuen Model zu setzen.

Oder:
Neue Category speichern – ohne Pfad. Und dann mittels der Methode ‚move()‘ die Kategorie in die vorgesehene verschieben. Dann werden alle Pfade von Magento gesetzt:
$category = Mage::getModel(‚catalog/category‘)->load($catId);
$category->move($parentCategoryId, 1);
Das geht allerdings nur, wenn die Kategorie einmal mittels ->save() gepseichert wurde, dann kann man die ID laden und für move() verwenden.

Ach – und nun hätt ich’s fast vergessen. Das Wort, worauf am End, ich kommen wollte.


Als Rekursion (lat. recurrere „zurücklaufen“) bezeichnet man die Technik in Mathematik, Logik und Informatik, eine Funktion durch sich selbst zu definieren (rekursive Definition). Wenn man mehrere Funktionen durch wechselseitige Verwendung voneinander definiert, spricht man von wechselseitiger Rekursion.

Ist das nicht hübsch? Eine Funktion durch sich selbst zu definieren.

Kontakt
E-Mail: office@neoshops.de
Tel.: +49 [0]151 7000 7107
Carmen Bremen
Magento Certified Developer
Magento Certified Solution Specialist
Magento Certified Frontend Developer
Magento Freelancer


Magento Certified Developer Magento Certified Solution Specialist Magento Certified Frontend Developer



Magento Stammtisch Köln
Magento Stammtisch KölnDer nächste Kölner Magento Stammtisch findet statt am 25. September 2017. (Xing Event) Wer Interesse hat, kann sich in die Stammtisch-Gruppe auf Xing eintragen, ich sende eine Rund-E-Mail mit Details kurz vor dem Event!

Kontakt

Carmen Bremen.

In: Xing
In: Skype
In: Twitter
In: Google+
Per: Formular
Innermail: Office (t) neoshops.de
In Köln: In der Lößbörde 1, 50859 Köln
Per Handy: +49 [0]151- 7000 7107

Letzte Beiträge