Kurzinfo


Andreas von Studnitz

mehr »

Andreas von Studnitz arbeitet seit 2012 als Geschäftsführer und Entwickler für die Magento-Agentur integer_net GmbH. Aktuelle Informationen finden Sie unter www.integer-net.de

Kontakt

Telefon:
0170 486 0 464

E-Mail:
avs(at)avs-webentwicklung.de

Twitter: twitter.com/avstudnitz

mehr »

< Magento: Verbesserte Benachrichtigungen im Admin-Bereich

Magento: Import von Kategorieverknüpfungen zu Produkten

02.02.2012 15:18

Über die ImportExport-Schnittstelle lassen sich schnell viele Produkte importieren. Häufig sollen diese auch einer oder mehreren Kategorien zugewiesen werden. Mit einer kleinen Erweiterung lässt sich die Zuordnung einfacher durchführen.

Im Webguys-Adventskalender habe ich bereits beschrieben, wie Kategoriezuordnungen importiert werden: über das Feld _category.

Dieses Feld akzeptiert den Namen der Kategorie, wobei die Namen der übergeordneten Kategorien ebenfalls vorne angehängt werden. In den Beispieldaten wird eine Kategorie z.B. wie folgt repräsentiert:

Electronics/Cameras/Digital Cameras

Ein Problem gibt es jetzt, wenn es in einem Shop zwei Websites (oder Stores) gibt mit getrennten Root-Kategorien. Ist darin jetzt die gleiche Struktur abgebildet (es reicht, wenn es in beiden Shops auf oberster Ebene jeweils eine Kategorie "Neuheiten" oder "Angebote" gibt), haben beide Kategorien den gleichen Pfad. Magento kann daher nicht mehr eindeutig unterscheiden, welcher gemeint ist, das Produkt kann der falschen Website zugeordnet werden. In einem Kundenprojekt ist genau dies jetzt geschehen, was der Anlass für eine genauere Analyse war.

Es gibt zwei Lösungsansätze für dieses Problem:

  1. Es wird noch der Name der Basiskategorie vorne angehängt, also z.B. "Root Catalog/Electronics/Cameras/Digital Cameras"
  2. Man verwendet die Kategorie-ID

Für beide Lösungsansätze werden Erweiterungen des ImportExport-Moduls nötig. In der Klasse Mage_ImportExport_Model_Import_Entity_Product muss dafür die Methode _initCategories() wie folgt überschrieben werden:

/**
* Initialize categories text-path to ID hash.
*
* @return Mage_ImportExport_Model_Import_Entity_Product
*/
protected function _initCategories()
{
$collection = Mage::getResourceModel('catalog/category_collection')->addNameToResult();
/* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
foreach ($collection as $category) {
$structure = explode('/', $category->getPath());
$pathSize = count($structure);
if ($pathSize > 2) {
$path = array();
$this->_categories[implode('/', $path)] = $category->getId();
for ($i = 2; $i < $pathSize; $i++) {
$path[] = $collection->getItemById($structure[$i])->getName();
}

// additional options for category referencing: name starting from base category, or category id
$this->_categories[implode('/', $path)] = $category->getId();
array_shift($path);
$this->_categories[implode('/', $path)] = $category->getId();
$this->_categories[$category->getId()] = $category->getId();
}
}
return $this;
}

Die bestehende Funktionalität wird hierbei nicht überschrieben, das heißt, es werden lediglich weitere Möglichkeiten der Angabe von Kategorien hinzugefügt.

Achtung: selbstverständlich wird hierfür nicht die Core-Klasse überschrieben! Es sollte ein Rewrite der Klasse in einem eigenen Modul erfolgen.

In meinem Modul FastSimpleImport, das ich bereits in meinem Blog beschrieben habe, habe ich diese Funktionalität bereits eingebaut. Es befindet sich mittlerweile auf GitHub (FastSimpleImport bei GitHub), ich freue mich auch über Beiträge anderer Entwickler dazu und bin offen für Erweiterungsvorschläge.

Kommentare

Vinai Kopp, 02.02.12 18:09:
Hi Andreas,
guter Fund. Ich würde das doch mal als Bug klassifizieren. Hast Du nicht Lust das ins MCA-CE repository zu commiten?
Andreas von Studnitz, 02.02.12 19:31:
Hi Vinai,
ja, hatte ich auch schon überlegt. Ich beschäftige mich dann mal mit den Prozessen, um Code beizusteuern...
Leo , 16.03.12 13:58:
Hallo,

ist es möglich den Pfad der Kategorien als ID´s anzugeben? Ich habe in Kategorienamen einen "/" somit funktioniert das ganze nicht wenn ich mit den Namen arbeite. Folgendes geht leider nicht:


'_category' => '2/15',

ID2: Root
ID15: Unterkategorie Audi


Danke im voraus
Andreas von Studnitz, 16.03.12 14:18:
Hallo Leo,

du musst hier nicht den Pfad angeben, sondern kannst einfach die Zielkategorie verwenden:

'_category' => '15',
Leo , 16.03.12 14:27:
Hallo Andreas,

danke für die schnelle Antwort. Das funktioniert so, danke. Kann ich ein Produkt jetzt auch in mehrere Kategorien setzen? Mit einfacher Kommatrennung geht das leider nicht (15,16,17). Auch array('15', '16') geht nicht.

Gruß Leo
Andreas von Studnitz, 16.03.12 15:03:
Hallo Leo,
mehrere Kategorien müsstest du in mehrere Zeilen setzen, siehe http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/.
Leo , 16.03.12 15:37:
Hallo Andreas,

habe es hinbekommen. Eine letzte Frage: Ich importiere die Produkte und lege automatisch Kategorien dazu an. Manche Produkt oder Kategorienamen beinhalten Umlaute oder Buchstaben mit Akzent (Coupé etc.). Beim versuch diese zu Importieren, bleibt der Name des Produktes leer, der Rest aber wird importiert(SKU, Preis ...)

Hast du eine Idee dazu?


Danke & Gruß
Andreas von Studnitz, 16.03.12 16:36:
Hallo Leo,
normalerweise müsste das funktionieren, wenn die Texte in UTF-8 vorliegen. Evtl. kannst du mal versuchen, sie vorher mit dem Befehl "utf8encode" zu kodieren.
Andreas von Studnitz, 19.06.12 11:32:
Seit Magento 1.7 gibt es hierfür jetzt auch im Standard eine Lösung. Die neue Spalte "_root_category". Hier kann der Name der Root-Kategorie eingetragen werden. Der Import über eine ID ist allerdings weiterhin nicht möglich.
Ich würde nicht empfehlen, den obigen Schnipsel in Magento ab 1.7 einzusetzen.
Kommentar hinzufügen












Den Code eingeben: *


* - Pflichtfeld