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

Bitte kontaktieren Sie mich über die Website von integer_net.

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