Tel. 06151 / 39 10 793

Export/Import von konfigurierbaren Produkten in Magento

Die von Ihnen angeforderte Seite wurde nicht gefunden. Eine Suche nach kategorien ecommerce hat diese Seite gefunden.

Leider bietet Magento von Haus aus weder die Unterstützung für den Import noch für den Export von konfigurierbaren Produkten. Dieses Dokument erklärt, wie es uns gelungen ist, dies dennoch durchzuführen, da wir von einem alten Entwicklungsstand, der bereits online war, auf einen neueren migrieren mussten und dazu der Produktkatalog übernommen werden musste.

Wer sollte diese Anleitung lesen?

Dieses Dokument richtet sich an Entwickler die verzweifelt versuchen Ihren Produktbestand einmalig von einer Installation auf eine andere zu übertragen.

Wer sollte diese Anleitung nicht lesen?

Dieses Dokument richtet sich nicht an Personen die ein automatisiertes und perfekt getestetes Skript erwarten. Weiterhin wird nur das Vorgehen beschrieben was notwendig war um unsere Produkte zu übertragen, dies kann jedoch je nach verwendeten Funktionalitäten variieren.

Welche Funktionalitäten fehlen dafür in Magento?

  • Export
    • enthält nicht die Kategorienamen, sondern nur deren IDs(ist also kein Problem wenn die Kategorien bereits existieren)
    • enthält nicht die verknüpften einfachen Produkte eines konfigurierbaren Produkts
    • Attributsets werden nicht mit exportiert(wurden bei unserer Lösung per Hand übertragen, da es nicht sehr viele waren)
  • Import
    • nicht vorhanden Kategorien werden nicht angelegt
    • Verknüpfungen zwischen einfachen und konfigurierbaren Produkten werden nicht angelegt
    • Preise werden bei konfigurierbaren Produkten nicht übernommen

Export

Allgemeines Vorgehen beim Export

Um die Produkte zu exportieren gehen Sie im Admin Panel zu System->Import/Export->Profile und wählen dann Export All Products. Hier kann mit einem klick im Tab "Starte Profil" der Export gestartet werden.

Wie bereits weiter oben angedeutet gehen wir davon aus, dass Sie die Attributsets selbstständig per Hand übertragen.

Es ist zu beachten, dass es bei den Attributnamen zu Verwechslungen kommen kann. Beispielsweise hatten wir ein Attribut namens type, das Feld type in der CSV-Datei war jedoch schon für etwas anderes vorgesehen, sodass der Import später scheiterte.

Export mit Kategorienamen

Um die Kategorienamen mit in die CSV-Datei zu exportieren nutzten wir eine Erweiterung ,  welche installiert sein muss.

Um diese zu verwenden, muss ein eigenes Export-Profil erstellt werden. Dazu gehen Sie zu System->Import/Export->Erweiterte Profile,  um ein neues Profil anzulegen. Hier der von uns verwendete XML-Aktionscode:

<action type="catalog/convert_adapter_product" method="load">
    <var name="store"><![CDATA[0]]></var>
</action>

<action type="catalog/convert_parser_product" method="unparse">
<var name="store"><![CDATA[0]]></var>
    <var name="url_field"><![CDATA[0]]></var>
</action>

<action type="dataflow/convert_mapper_column" method="map"></action>

<action method="unparse" type="exportextension/modifier">
<var name="add_categories">true</var>
<var name="category_delimiter">,</var>
<var name="category_field_name">category</var>
<var name="category_path_delimiter"><![CDATA[/]]></var>
<var name="first_category_level">2</var>
    <var name="remove_line_breaks">true</var>   
<var name="remove_html_tags">true</var>
</action>

<action type="dataflow/convert_parser_csv" method="unparse">
<var name="delimiter"><![CDATA[,]]></var>
<var name="enclose"><![CDATA["]]></var>
<var name="fieldnames">true</var>
</action>

<action type="dataflow/convert_adapter_io" method="save">
<var name="type">file</var>
<var name="path">var/export</var>
<var name="filename">
<![CDATA[export_all_products_with_categories.csv]]>
</var>
</action>

Nun sollte es ein Feld category in der CSV-Datei geben, welches die mit Slash getrennten Kategorienamen enthält.

Was nun noch fehlt, sind die Verknüpfungen zwischen konfigurierbaren und einfachen Produkten. Um diese herzustellen, wählten wir einen eher unkonventionellen Weg und importierten die CSV-Datei zunächst in eine MySQL-Tabelle.

Um eine passende MySQL-Tabelle anzulegen, führen sie folgendes SQL-Statement aus und ändern zuvor gegebenfalls den Namen der Tabelle.

CREATE TABLE IF NOT EXISTS `import` (
`store` varchar(255) NOT NULL,
`websites` varchar(255) NOT NULL,
`attribute_set` varchar(255) NOT NULL,
`art` varchar(255) NOT NULL,
`sku` varchar(255) NOT NULL,
`category_ids` text NOT NULL,
`has_options` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL, 
`meta_title` varchar(255) NOT NULL, 
`meta_description` text NOT NULL, 
`image` text NOT NULL, 
`small_image` text NOT NULL, 
`thumbnail` text NOT NULL, 
`url_key` text NOT NULL, 
`url_path` text NOT NULL, 
`custom_design` text NOT NULL, 
`page_layout` text NOT NULL, 
`options_container` text NOT NULL, 
`image_label` text NOT NULL, 
`small_image_label` text NOT NULL, 
`thumbnail_label` text NOT NULL, 
`gift_message_available` text NOT NULL, 
`price` text NOT NULL, 
`description` text NOT NULL, 
`short_description` text NOT NULL, 
`meta_keyword` text NOT NULL, 
`custom_layout_update` text NOT NULL, 
`status` text NOT NULL, 
`tax_class_id` text NOT NULL, 
`visibility` text NOT NULL, 
`enable_googlecheckout` text NOT NULL, 
`gender` text NOT NULL, 
`size` text NOT NULL, 
`qty` text NOT NULL, 
`min_qty` text NOT NULL, 
`use_config_min_qty` text NOT NULL, 
`is_qty_decimal` text NOT NULL, 
`backorders` text NOT NULL, 
`use_config_backorders` text NOT NULL, 
`min_sale_qty` text NOT NULL, 
`use_config_min_sale_qty` text NOT NULL, 
`max_sale_qty` text NOT NULL, 
`use_config_max_sale_qty` text NOT NULL, 
`is_in_stock` text NOT NULL, 
`low_stock_date` text NOT NULL, 
`notify_stock_qty` text NOT NULL, 
`use_config_notify_stock_qty` text NOT NULL, 
`manage_stock` text NOT NULL, 
`use_config_manage_stock` text NOT NULL, 
`stock_status_changed_automatically` text NOT NULL, 
`product_name` text NOT NULL, 
`store_id` text NOT NULL, 
`type` text NOT NULL, 
`product_status_changed` text NOT NULL, 
`product_changed_websites` text NOT NULL, 
`special_price` text NOT NULL, 
`special_from_date` text NOT NULL, 
`special_to_date` text NOT NULL, 
`categories` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Nun kann die CSV-Datei mit Hilfe von folgenden Befehlen importiert werden:

LOAD DATA INFILE 'export_all_products_with_categories.csv'
INTO TABLE import
FIELDS
TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES
TERMINATED BY '\n'

Um nun die fehlende Spalte zu erzeugen, verwendeten wir folgenden SQL-Befehl, welcher zu jedem Produkt andere Produkte mit gleich beginnendem Artikelnamen(SKU) sucht und ggf. auflistet.:

SELECT
*,
(
SELECT
GROUP_CONCAT(sku SEPARATOR ',')
FROM
import imp2
WHERE
imp2.sku LIKE CONCAT(imp.sku, '%')
AND
imp2.sku <> imp.sku
GROUP BY imp2.store
) associated
FROM
import imp

Bitte überprüfen Sie, ob das Ergebnis dieser Abfrage das korrekte Ergebnis liefert. Ist dies der Fall kann die Abfrage in eine CSV-Datei zurückgeschrieben werden(ggf. Pfad anpassen):

SELECT
*,
(
SELECT
GROUP_CONCAT(sku SEPARATOR ',')
FROM
import imp2
WHERE
imp2.sku LIKE CONCAT(imp.sku, '%')
AND
imp2.sku <> imp.sku
GROUP BY imp2.store
) associated
FROM
import imp
INTO OUTFILE 'modified.export.csv'
FIELDS
TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES
TERMINATED BY '\n'

Das waren alle Schritte die für unseren Export der Daten notwendig waren.

Import

Der Import erfolgte bei uns in 2 Schritten. Im ersten importierten wir die Daten in Magento und im zweiten fügten wir die beim Import nicht eingetragenen Preise der konfigurierbaren Produkte ein.

Wichtig: Verwendete Bilder müssen, um übernommen zu werden, vor dem Import von media/catalog/product(alte Installation) nach media/import(neue Installation) kopiert werden.

1. Schritt

Um beim Anlegen fehlende Kategorien zu ergänzen und konfigurierbare Produkte mit einfachen zu verknüpfen, muss die Datei app/code/core/Mage/Catalog/Model/Convert/Adapter/Product.php bearbeitet werden, wie in diesem Forenbeitrag beschrieben, jedoch glaube ich einige Dinge geändert zu haben, weswegen die von uns verwendete Product.php hier separat nochmal geladen werden kann.

Wenn Sie diese Datei überschrieben haben, sollte der Import beim ersten Anlauf alle fehlenden Kategorien erzeugen und alle Produkte anlegen. Starten sie den Import nun ein zweites Mal, damit die Verknüpfungen zwischen konfigurierbaren und einfachen Produkten hergestellt werden.

2. Schritt

Zunächst scheint der Import fast geglückt, jedoch bei genauerem Hinsehen sollte auffallen, dass die Preisfelder bei konfigurierbaren Produkten leer sind wie in folgendem Bild zu sehen:

Um das zu beheben, haben wir ein kleines PHP-Skript geschrieben, welches nachträglich alle Produkte durchgeht und die fehlenden Preise errechnet und einträgt.

Kopieren Sie den folgenden Code in eine PHP-Datei im Hauptverzeichniss Magentos:

<?php
require_once 'app/Mage.php';
umask(0);
Mage::app('default');

$db = Mage::getSingleton('core/resource')->getConnection('core_write');

$attrId = 497;
$attrCode = 'size';
$websiteId = 0;

$query = " SELECT entity_id
FROM `catalog_product_entity`
WHERE `type_id` = 'simple';"
;
$productIds = $db->fetchAll($query);

foreach (

$productIds as $productId ) {

$product = Mage::getModel('catalog/product');
$product->load($productId['entity_id']);

if ( !

$product->isConfigurable() ) {

$product->loadParentProductIds();

$superIds = $product->getParentProductIds();

foreach (

$superIds as $superId ) {

$superProduct = Mage::getModel('catalog/product');
$superProduct->load($superId);

if (

$superProduct->isConfigurable() ) {

$newPrice = $product->getPrice()-$superProduct->getPrice();

if (

$newPrice > 0 ) {
$query = "SELECT `product_super_attribute_id` FROM `catalog_product_super_attribute` WHERE `product_id`={$superProduct->getId()} AND `attribute_id`={$attrId}";
if (
$superAttributeId = $db->fetchOne($query) ) {

$data = $product->getData();
$attrValue = $data[$attrCode];

$query = "SELECT value_id
FROM `catalog_product_super_attribute_pricing`
WHERE product_super_attribute_id={$superAttributeId}
AND value_index={$attrValue}
AND website_id=0
LIMIT 1;"
;

$id = $db->fetchOne($query);

if (

$id > 0 ) {
$query = " UPDATE `catalog_product_super_attribute_pricing`
SET is_percent=0, pricing_value={$newPrice}
WHERE product_super_attribute_id={$superAttributeId}
AND value_index={$attrValue}
AND website_id={$websiteId}"
;
} else {
$query = " INSERT INTO `catalog_product_super_attribute_pricing` (
`value_id` ,
`product_super_attribute_id` ,
`value_index` ,
`is_percent` ,
`pricing_value` ,
`website_id`
)
VALUES (
'',
'{$superAttributeId}',
'{$attrValue}',
'0',
'{$newPrice}',
'{$websiteId}'
);"
;

}
echo

$superProduct->getId()." - ".$product->getId()."
\n"
;

$db->query($query);
}
}
}

}
}
}

?>

Führen sie die Datei nun aus. Empfehlungsweise sollte dies über die Konsole geschehen(php -f fixPrices.php).

Alternativ können Sie das Skript natürlich auch über den Browser aufrufen, jedoch kann es bei einer großen Anzahl von Produkten in Ihrem Katalog zu einem PHP timeout kommen. Ist dies der Fall, so müssen Sie die maximale Ausführungszeit von PHP erhöhen.

Nach dem Aufruf sollten theoretisch alle Produkte die richten Preise anzeigen.

Schlusswort

Ich hoffe diese Anleitung hat Ihnen geholfen dieses eklatanten Makel in Magento zu überwinden.

Alternativ dazu sind einige kostenpflichtige Skripte im Internet erhältlich, welche aber meist auch nur die Importseite übernehmen.

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
CAPTCHA
Diese Frage hat den Zweck zu testen, ob Sie ein menschlicher Benutzer sind und um automatisierten Spam vorzubeugen.
5 + 14 =
Das einfache mathematische Problem ist zu lösen und das Ergebnis einzugeben. Z.B. muss für 1+3 der Wert 4 eingegebene werden.