Shopware Knowledgebase

Dieser Artikel ist noch nicht für Shopware 3.5 geprüft bzw. freigegeben.
Shopware Labs

Der Bereich Shopware Labs ist die Plattform für alle Entwickler. Hier findet man technische Dokumentationen und zahlreiche Tipps und Tricks rund um das Thema Programmieren. In dieser Rubrik stellen außerdem die Entwickler der shopware AG neue und experimentelle Lösungsansätze vor. Neue Funktionen, die in dieser Rubrik bereitgestellt werden, sind teilweise auch für zukünftige Releases geplant. Die Funktionen können dann ohne Programmierkenntnisse zukünftig direkt im Shopware Backend konfiguriert werden oder werden über Plugins bereitgestellt. Informationen über neue, geplante Funktionen finden Sie in unserer Roadmap.

Bitte beachten Sie, dass die hier bereitgestellten Lösungsansätze nicht offiziell supportet werden und nur eingebaut werden sollten, sofern Sie über das entsprechende, technische Wissen verfügen.

API Beispiele

0 Kommentare

Einleitung

Hier finden Sie zahlreiche Beispiele für den Import und Export von Daten in Shopware.

Hinweis: Die Beispiele sind für den Zugriff von außen nicht gesperrt. Bitte fügen Sie die nachfolgenden Zeilen an den Anfang der Datei ein um eine Absicherung über den Shopware API-Schlüssel zu gewährleisten.

 
//Beispiel zur Absicherung des API-Calls über einen eindeutigen
//API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
//im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
 

Das Script prüft dann bei jedem Aufruf ob der Get-Parameter "sAPI" mit dem in den Einstellungen hinterlegten Schlüssel übereinstimmt

Import von Artikeln (CSV)

Legen Sie die Datei engine/connectors/api/sample/csv/import.articles.csv an

Bestellnummer;Artikelname;Hersteller;Kurzbeschreibung;Langbeschreibung;Verkaufspreis;Einkaufspreis;Kategorien;MwSt;Bild1;Bild2;Aktiv;Bestand
1234Test;Test-Artikel;Test;Kurzbeschreibung;Langbeschreibung;99,00;89,00;Hauptkategorie|Unterkategorie;19;http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg;http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg;1;99

Legen Sie die Datei engine/connectors/api/sample/csv/import.articles.php an

Teil 1

 
error_reporting(E_ALL);
require_once('../../api.php');
$api = new sAPI();
 
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$import =& $api->import->shopware;
$csv =& $api->convert->csv;
$mapping =& $api->convert->mapping;
$csv->sSettings['separator'] = ";";	// Feld-Trennzeichen in der CSV-Datei
 
#$import->sDeleteAllArticles();	// Alle Artikel vor dem Import löschen
#$import->sDeleteAllCategories(); // Alle Kategorien vor dem Import löschen

$data_path = $api->load("file://".$api->sPath."/engine/connectors/api/sample/csv/import.articles.csv");
 
$articles = $api->convert->csv->decode($data_path);
 
// Zuordnung der Felder zwischen CSV-Datei und Shopware Datenbank
$mappingmask = array (
	"name"=>"Artikelname",
	"ordernumber"=>"Bestellnummer",
	"price"=>"Verkaufspreis",
	"supplier"=>"Hersteller",
	"baseprice"=>"Einkaufspreis",
	"instock"=>"Bestand",
	"active"=>"Aktiv",
	"description_long"=>"Langbeschreibung",
	"description"=>"Kurzbeschreibung",
	"Bild1",
	"Bild2",
	"Kategorien"
);
 
// Maske anwenden
$mappingmask = $mapping->prepare_mask ($mappingmask);
 

Das Script liest die CSV-Datei import.articles.csv ein und erzeugt aus dem Datenstream ein Array. Über die Mapping-Mask wird eine Zuordnung zwischen den Feldnamen der CSV-Datei und den Daten die die API erwartet durchgeführt. Intern wird die CSV-Datei in ein PHP-Array umgewandelt, welches anschließend durchlaufen wird.

Das Array hat anschließend folgenden Aufbau:

Array
(
    [0] => Array
        (
            [Bestellnummer] => 1234Test
            [Artikelname] => Test-Artikel
            [Hersteller] => Test
            [Kurzbeschreibung] => Kurzbeschreibung
            [Langbeschreibung] => Langbeschreibung
            [Verkaufspreis] => 99,00
            [Einkaufspreis] => 89,00
            [Kategorien] => Hauptkategorie|Unterkategorie
            [MwSt] => 19
            [Bild1] => http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg
            [Bild2] => http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg
            [Aktiv] => 1
            [Bestand] => 99
        )

)

Teil 2

Stammdaten

Das Array mit den Artikeldaten wird nun in einer Foreach Schleife durchlaufen. Für jeden Eintrag im Array wird ein neuer Artikel angelegt bzw. ein bestehender (Zuordnung über Artikelnummer) aktualisiert.

Als erstes werden über

 
$article_insert = $import->sArticle($article_data); // Einfügen der Artikel-Stammdaten
 

die Artikel-Stammdaten generiert (s_articles / s_articles_details / s_articles_attributes). Die Funktion gibt ein Array zurück mit den Primary-Keys der neu hinzugefügten Datensätze. Diese werden für die nachfolgenden Import-Funktionen benötigt.

Array
(
    [articledetailsID] => 1
    [articleID] => 1
    [articleattributesID] => 1
)

Bild-Import

 
// Bild-Import
$import->sDeleteArticleImages(array("articleID"=>$article_data["articleID"]));
$images[] = $api->load($article_data["Bild1"]);
$images[] = $api->load($article_data["Bild2"]);
foreach ($images as $image){
	$import->sArticleImage(array("image"=>$image,"articleID"=>$article_data["articleID"]));
}
 

Zunächst werden mit der Funktion sDeleteArticleImages alle in vorherigen Importen hinzugefügten Bilder des Artikels gelöscht.

Anschließend werden die 2 für diesen Artikel definierten Bilder dem Array images hinzugefügt. Images wird anschließend in einer Schleife durchlaufen Für jeden Schleifen-Eintrag wird via sArticleImage der Konvertierungsprozess für das Bild durchgeführt. Danach wird der Bildverweis in die Datenbank s_articles_img gespeichert

Importieren von Kategorien

 
$category_insert = array();
$categories = explode("|",$article_data["Kategorien"]);
foreach ($categories as $category){
	if (empty($cat)) $cat = 3;
	$cat = $import->sCategory(array("description"=>$category,"parent"=>$cat));
  	$categories_insert[] = $cat;
  	$catids = $import->sArticleCategory ($article_data["articleID"], $cat);
}
$import->sDeleteOtherArticlesCategories($article_data["articleID"], $catids);
 

In unserem Beispiel wird die Kategorie-Zuordnung des Artikels über die Spalte "Kategorien" in der CSV-Datei realisiert. Hier findet sich die hierarchische Kategorie-Struktur mit "|" als Trennzeichen wieder. Auf dieses Feld wird ein Explode durchgeführt, um die Kategorien in einem Array durchlaufen zu können. Mit der Funktion sCategory wird die Kategorie in die Datenbank eingefügt (s_categories). Die Funktion gibt die ID des neu eingefügten Datensatzes zurück. Über sArticleCategory wird dann die Zuordnung zum Artikel hergestellt.

Quellcode Teil 2

 
 
foreach ($articles as $article)
{
 
	$article_data = $mapping->convert_line($mappingmask, $article, true);
 
	// Stammdaten
	$article_insert = $import->sArticle($article_data); // Einfügen der Artikel-Stammdaten
	$article_data = array_merge($article_data,$article_insert);
 
	// Bild-Import
	$import->sDeleteArticleImages(array("articleID"=>$article_data["articleID"]));
	$images[] = $api->load($article_data["Bild1"]);
	$images[] = $api->load($article_data["Bild2"]);
	foreach ($images as $image){
		$import->sArticleImage(array("image"=>$image,"articleID"=>$article_data["articleID"]));
	}
 
	// Kategorien/Warengruppen
	$category_insert = array();
	$categories = explode("|",$article_data["Kategorien"]);
	foreach ($categories as $category){
		if (empty($cat)) $cat = 3;
		$cat = $import->sCategory(array("description"=>$category,"parent"=>$cat));
	  	$categories_insert[] = $cat;
	  	$catids = $import->sArticleCategory ($article_data["articleID"], $cat);
	}
	$import->sDeleteOtherArticlesCategories($article_data["articleID"], $catids);
 
	$articles_insert[] = $article_insert["articledetailsID"];
 
	// Preise
	$customergroup = "EK";
	$tax = $article_data["tax"];
	$price = array(
		"price" => $article_data["price"],
		"articledetailsID" => $article_data["articledetailsID"],
		"pricegroup" => $customergroup,
		"tax" => $tax,
		"baseprice"=>$article_data["baseprice"]
	);
	$import->sArticlePrice($price);
}
// Aufräumen
//$import->sDeleteOtherCategories (array_unique($categories_insert));
$import->sDeleteOtherArticles ($articles_insert);	// Alle nicht im Import vorkommenden Artikel löschen
$import->sDeleteCache();	// Shopcache leeren
 

Importieren von Attributen / Zusatzfelder

Shopware unterstützt bis zu 20 Freitext-Attribute die für jeden Artikel gespeichert werden können. Diese Attribute finden sich in der Tabelle s_articles_attributes.

Hinweis: Bitte prüfen Sie den Datentyp der jeweiligen Spalte in s_articles_attributes, bevor Sie Daten importieren. Dieser muss ggf. auf "varchar" oder "text" geändert werden, je nachdem welche Art von Daten in diese Felder gespeichert werden soll.

Modifizierte CSV-Datei: Neu: Spalten Zusatzfeld1|Zusatzfeld2

Bestellnummer;Artikelname;Hersteller;Kurzbeschreibung;Langbeschreibung;Verkaufspreis;Einkaufspreis;Kategorien;MwSt;Bild1;Bild2;Aktiv;Bestand;Zusatzfeld1;Zusatzfeld2
1234Test;Test-Artikel;Test;Kurzbeschreibung;Langbeschreibung;99,00;89,00;Hauptkategorie|Unterkategorie;19;http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg;http://www.shopware.de/dev/w/images/5/54/Aktion_valid.jpg;1;99;Test1;Test2

Die beiden neuen Spalten Zusatzfeld1 und Zusatzfeld2 enthalten Freitext der in die Tabelle s_articles_attributes gespeichert werden soll (Attr1 und Attr2)

Die einzige Änderung die Sie am Import selbst durchführen müssen, ist die Aktualisierung der Mapping-Mask.

 
$mappingmask = array (
	"name"=>"Artikelname",
	"ordernumber"=>"Bestellnummer",
	"price"=>"Verkaufspreis",
	"supplier"=>"Hersteller",
	"baseprice"=>"Einkaufspreis",
	"instock"=>"Bestand",
	"active"=>"Aktiv",
	"description_long"=>"Langbeschreibung",
	"description"=>"Kurzbeschreibung",
	"Bild1",
	"Bild2",
	"Kategorien",
	"tax"=>"Mwst",
	"attr1"=>"Zusatzfeld1",
	"attr2"=>"Zusatzfeld2"
 
);
 

So wird der API mitgeteilt, das die Spalten Zusatzfeld1 und Zusatzfeld2 in die Felder attr1 bzw. attr2 gespeichert werden sollen.

Anschließend können diese Felder z.B. im Template ausgegeben werden {$sArticle.attr1}

{$sArticle.attr2}

Importieren von mehrdimensionalen Varianten

Beispiel:

 
 $article_configurator = array("values" => array(
    array (
     "standard"=>1,
     "active"=>1,
     "instock"=>1,
     "ordernumber"=>"test123",
     "group1" => "farbe",
     "option1" => "grün",
     "group2" => "größe",
     "option2" => "l",
     "prices" => array(array("pricegroup"=>"H","net_price"=>10.10),array("pricegroup"=>"EK","net_price"=>10.10))
    ),
    array (
     "active"=>1,
     "instock"=>1,
     "ordernumber"=>"test124",
     "group1" => "farbe",
     "option1" => "blau",
     "group2" => "größe",
     "option2" => "xl", 
     "prices" => array(array("pricegroup"=>"H","net_price"=>10.10))
    )
  )
 );
 
 
	$import->sArticleConfigurator ($article_data, $article_configurator);
 

Hiermit würden die Varianten Farbe Blau / Größe XL und Farbe Grün / Größe L importiert. Jede Variante kann hierbei einen eigenen Preis, eigenen Lagerbestand und eigene Bestellnummer erhalten.

Abgleich Lagerbestände (CSV)

Beispiel-Daten:

ordernumber;instock
test1;5
test2;25

Beispiel-Script:

 
<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
set_time_limit(1000);
ini_set('memory_limit','512M');
 
 
require_once('../../api.php');
$api = new sAPI();
 
#if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"])
	#exit;

$import =& $api->import->shopware;
$csv =& $api->convert->csv;
$mapping =& $api->convert->mapping;
$csv->sSettings['separator'] = ";";	// Feld-Trennzeichen in der CSV-Datei
$data_path = $api->load("file://".$api->sPath."/engine/connectors/api/sample/csv/instock.csv");
$articles = $api->convert->csv->decode($data_path);
$mappingmask = array("ordernumber","instock");
$mappingmask = $mapping->prepare_mask ($mappingmask);
 
 
foreach ($articles as $article)
{
	$result = $import->sArticleStock(array(
		"ordernumber"=>$article["ordernumber"],
		"instock"=>$article["instock"]
	));
}
unset($articles,$article);
?>
 

Import Cross-Selling / Ähnliche Artikel

 
$article_data['crosselling'] = "test1,test2,test3";
// Cross-Selling
$import->sArticleCrossSelling((int)$article_data["articleID"], explode(',', $article_data['crosselling']));
 
$article_data['similar'] = "test1,test2,test3";
// Similar
$import->sArticleSimilar((int)$article_data["articleID"], explode(',', $article_data['similar']));
 

Import von Produkteigenschaften / Filter

 
if(!empty($article_data["Filtergruppe"]))
{
	$sql = "
		SELECT o.id as optionID, v.value, v.id as valueID
		FROM s_filter_relations r
		INNER JOIN s_filter_options o
		LEFT JOIN s_filter_values v ON v.groupID=r.groupID AND v.optionID=r.optionID AND v.articleID=?
		WHERE r.optionID = o.id
		AND r.groupID=?
		ORDER BY r.position
	";
	$options = $api->sDB->GetAll($sql,array(
		$article_data["articleID"],
		$article_data["Filtergruppe"]
	));
}
if(!empty($article_data["Filtergruppe"])&&!empty($options))
{
	foreach ($options as $key => $option)
	{
		if(isset($article_data["Eigenschaft".($key+1)]))
			$value = $article_data["Eigenschaft".($key+1)];
		else
			continue;
 
		if(empty($value)&&!empty($option["valueID"]))
		{
			$sql = "DELETE FROM s_filter_values WHERE id=?";
			$api->sDB->Execute($sql,array($option["valueID"]));
		}
		elseif(empty($option["valueID"])&&!empty($value))
		{
			$sql = "INSERT INTO s_filter_values (groupID, optionID, articleID, value) VALUES (?, ?, ?, ?)";
			$api->sDB->Execute($sql, array(
			$article_data["Filtergruppe"],
			$option["optionID"],
			$article_data["articleID"],
			$value
			));
		}
		elseif (!empty($option["valueID"])&&$option["value"]!=$value)
		{
			$sql = "UPDATE s_filter_values SET value=? WHERE id=?";
			$api->sDB->Execute($sql,array($value,$option["valueID"]));
		}
	}
	foreach ($languages as $language)
	{
		$values = array();
		foreach ($options as $key => $option)
		{
			if(isset($article_data["Eigenschaft".($key+1)."_$language"]))
				$value = $article_data["Eigenschaft".($key+1)."_$language"];
			else
				continue;
			if(!empty($value))
				$values[$option['optionID']] = $value;
		}
		$import->sTranslation("properties", $article_data["articleID"], $language, $values);
	}
 
	$sql = "UPDATE s_articles SET filtergroupID=? WHERE id=?";
	$api->sDB->Execute($sql,array($article_data["Filtergruppe"],$article_data["articleID"]));
}
else
{
	$sql = "DELETE FROM s_filter_values WHERE articleID=?";
	$api->sDB->Execute($sql,array($article_data["articleID"]));
	$sql = "UPDATE s_articles SET filtergroupID=NULL WHERE id=?";
	$api->sDB->Execute($sql,array($article_data["articleID"]));
}
 

Import von Übersetzungen

 
$sql = "SELECT DISTINCT isocode FROM s_core_multilanguage WHERE skipbackend=0 AND isocode!='de'";
$languages = $api->sDB->GetCol($sql);
if(!empty($languages))
{
	if(empty($article["mainnumber"]))
	{
		$translate_type = 'article';
		$translate_fields = array('name','keywords','description','description_long','additionaltext');
		$translate_key = $article_data['articleID'];
	}
	else
	{
		$translate_type = 'variant';
		$translate_fields = array('additionaltext');
		$translate_key = $article_data['articledetailsID'];
	}
	foreach ($languages as $language)
	{
		$translate = array();
		foreach ($translate_fields as $field)
		{
			if(!empty($article[$field.'_'.$language]))
			{
				$translate[$field] = $article[$field.'_'.$language];
			}
		}
		for ($i=1;$i<=20;$i++)
		{
			if(isset($article['attr_'.$i.'_'.$language]))
			{
				$translate['attr'.$i] = $article['attr_'.$i.'_'.$language];
			}
		}
		$import->sTranslation($translate_type, $translate_key, $language, $translate);
	}
}
 

Kunden-Export (CSV)

 
<?php
/**
 * Shopware API Beispiel: Bestellungen in XML exportieren
 *
 * @package     Shopware 2.08.01
 * @subpackage  API
 */
/*
	Klassen laden, Aliase erstellen und Einstellungen vornehmen
*/
 
require_once('../../api.php');
$api = new sAPI();
 
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$export =& $api->export->shopware;
$csv =& $api->convert->csv;
$mapping =& $api->convert->mapping;
$xml->sSettings['encoding'] = "ISO-8859-1";
 
$customers = $export->sCustomers();
if(!$customers)
	die("NO Customers");
 
$salutationmap = array(
	"mr" => "Herr",
	"ms" => "Frau",
	"_default" => ""
);
$customermask = array (
	"customernumber",
	"billing_company",
	"billing_department",
	"billing_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"billing_firstname",
	"billing_lastname",
	"billing_street",
	"billing_streetnumber",
	"billing_street",
	"billing_zipcode" => array (
		"convert" => "intval"
	),
	"billing_city",
	"billing_country",
	"billing_country_iso",
	"shipping_company",
	"shipping_department",
	"shipping_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"shipping_firstname",
	"shipping_lastname",
	"shipping_street",
	"shipping_streetnumber",
	"shipping_street",
	"shipping_zipcode" => array (
		"convert" => "intval"
	),
	"shipping_city",
	"shipping_country",
	"shipping_country_iso",
	"ustid" => array (
		"convert" => "trim"
	),
	"phone",
	"fax",
	"email",
	"customergroup",
	"newsletter",
);	
$customers = $mapping->convert_array ($customermask, $customers);
 
$customers = $csv->encode($customers);
 
/*
	CSV-Daten ausgeben
*/
 
echo $customers;
?>

Bestell-Export (CSV)

 
<?php
/**
 * Shopware API Beispiel: Bestellungen in XML exportieren
 *
 * @package     Shopware 2.08.01
 * @subpackage  API
 */
/*
	Klassen laden, Aliase erstellen und Einstellungen vornehmen
*/
 
require_once('../../api.php');
$api = new sAPI();
 
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$export =& $api->export->shopware;
$csv =& $api->convert->csv;
$mapping =& $api->convert->mapping;
$xml->sSettings['encoding'] = "ISO-8859-1";
 
/*
	Bestellungen mit dem Status 0 holen
*/
$orders = $export->sGetOrders (array("where"=>"status=0"));
$orderIDs = array_keys($orders);
if(!$orders)
	exit();
 
/*
	Die dazu passenden Kunden holen
*/
$customers = $export->sOrderCustomers(array("orderIDs"=> $orderIDs));
if(!$customers)
	exit();
 
/*
	Und die dazu passenden Bestellpositionen holen
*/
$positions = $export->sOrderDetails(array("orderIDs"=> $orderIDs));
if(!$positions)
	exit();	
 
/*
	Bestellung maskieren
*/
$ordermask = array (
	"orderID",
	"order_number",
	"customerID",
	"paymentID",
	"transactionID",
	"partnerID",
	"clearedID",
	"statusID",
	"paymentID",
	"invoice_amount",
	"invoice_amount_net",
	"invoice_shipping",
	"invoice_shipping_net",
	"invoice_amount_net",
	"invoice_amount_net",
	"net",
	"cleared_description",
	"status_description",
	"payment_description"
);	
$orders = $mapping->convert_array ($ordermask, $orders);
 
/*
	Kunden maskieren
*/
$salutationmap = array(
	"mr" => "Herr",
	"ms" => "Frau",
	"_default" => ""
);
$customermask = array (
	"customernumber",
	"billing_company",
	"billing_department",
	"billing_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"billing_firstname",
	"billing_lastname",
	"billing_street",
	"billing_streetnumber",
	"billing_street",
	"billing_zipcode" => array (
		"convert" => "intval"
	),
	"billing_city",
	"billing_country",
	"billing_countryen",
	"billing_countryiso",
	"shipping_company",
	"shipping_department",
	"shipping_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"shipping_firstname",
	"shipping_lastname",
	"shipping_street",
	"shipping_streetnumber",
	"shipping_street",
	"shipping_zipcode" => array (
		"convert" => "intval"
	),
	"shipping_city",
	"shipping_country",
	"shipping_countryen",
	"shipping_countryiso",
	"ustid" => array (
		"convert" => "trim"
	),
	"phone",
	"fax",
	"email",
	"customergroup",
);	
$customers = $mapping->convert_array ($customermask, $customers);
 
/*
	Bestellpositionen maskieren
*/
$positionmask = array (
	"articleID",
	"articleordernumber",
	"name",
	"price",
	"quantity",
	"invoice",
	"releasedate",
	"tax",
	"esd",
	"modus",
);	
foreach ($positions as $orderID =>$position)
{
	$tmp[$orderID] = $mapping->convert_array ($positionmask, $position);
}
$positions = $tmp;
 
/*
	Alle Daten zusammenfassen
*/
$open_orders = array();
//$max_postions = 0;
foreach ($orderIDs as $orderID)
{
	if(isset($orders[$orderID])&&$customers[$orderID]&&$positions[$orderID])
	{
		$open_orders[$orderID] = array_merge($customers[$orderID],$orders[$orderID]);
		$i = 1;
		foreach ($positions[$orderID] as $positionKey=>$position)
		{
			foreach ($position as $key=>$value)
			{
				$open_orders[$orderID]["position_{$i}_{$key}"] = $value;
			}
			$i++;
		}
	}
}
 
/*
	Daten in CSV konvertieren
*/
$open_orders = $csv->encode($open_orders,$csv->get_all_keys($open_orders));
 
/*
	CSV-Daten ausgeben
*/
 
echo $open_orders;
?>
 

Export von Bestellungen (XML)

 
<?php
/**
 * Shopware API Beispiel: Bestellungen in XML exportieren
 *
 * @package     Shopware 2.08.01
 * @subpackage  API
 */
/*
	Klassen laden, Aliase erstellen und Einstellungen vornehmen
*/
 
require_once('../../api.php');
$api = new sAPI();
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$export =& $api->export->shopware;
$xml =& $api->convert->xml;
$mapping =& $api->convert->mapping;
$xml->sSettings['encoding'] = "ISO-8859-1";
 
/*
	Bestellungen mit dem Status 0 auslesen
*/
$orders = $export->sGetOrders (array("where"=>"status=0"));
$orderIDs = array_keys($orders);
if(!$orders)
	exit();
 
/*
	Die dazu passenden Kunden auslesen
*/
$customers = $export->sOrderCustomers(array("orderIDs"=> $orderIDs));
if(!$customers)
	exit();
 
/*
	Und die dazu passenden Bestellpositionen auslesen
*/
$positions = $export->sOrderDetails(array("orderIDs"=> $orderIDs));
if(!$positions)
	exit();	
 
/*
	Bestellung maskieren
*/
$ordermask = array (
	"orderID",
	"ordernumber",
	"customerID",
	"paymentID",
	"transactionID",
	"partnerID",
	"clearedID",
	"statusID",
	"paymentID",
	"invoice_amount",
	"invoice_amount_net",
	"invoice_shipping",
	"invoice_shipping_net",
	"invoice_amount_net",
	"invoice_amount_net",
	"net",
	"cleared_description",
	"status_description",
	"payment_description"
);	
$orders = $mapping->convert_array ($ordermask, $orders);
 
/*
	Kunden maskieren
*/
$salutationmap = array(
	"mr" => "Herr",
	"ms" => "Frau",
	"_default" => ""
);
$customermask = array (
	"customernumber",
	"billing_company",
	"billing_department",
	"billing_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"billing_firstname",
	"billing_lastname",
	"billing_street",
	"billing_streetnumber",
	"billing_street",
	"billing_zipcode" => array (
		"convert" => "intval"
	),
	"billing_city",
	"billing_country",
	"billing_countryen",
	"billing_countryiso",
	"shipping_company",
	"shipping_department",
	"shipping_salutation" => array (
		"convert" => array(
			"map" =>  $salutationmap
		)
	),
	"shipping_firstname",
	"shipping_lastname",
	"shipping_street",
	"shipping_streetnumber",
	"shipping_street",
	"shipping_zipcode" => array (
		"convert" => "intval"
	),
	"shipping_city",
	"shipping_country",
	"shipping_countryen",
	"shipping_countryiso",
	"ustid" => array (
		"convert" => "trim"
	),
	"phone",
	"fax",
	"email",
	"customergroup",
);	
$customers = $mapping->convert_array ($customermask, $customers);
 
/*
	Bestellpositionen maskieren
*/
$positionmask = array (
	"articleID",
	"articleordernumber",
	"name",
	"price",
	"quantity",
	"invoice",
	"releasedate",
	"tax",
	"esd",
	"modus",
);	
foreach ($positions as $orderID =>$position)
{
	$tmp[$orderID] = $mapping->convert_array ($positionmask, $position);
}
$positions = $tmp;
 
/*
	Alle Daten zusammenfassen
*/
$open_orders = array();
foreach ($orderIDs as $orderID)
{
	if(isset($orders[$orderID])&&$customers[$orderID]&&$positions[$orderID])
	{
		$open_orders[$orderID] = array_merge($orders[$orderID],$customers[$orderID]);
		$open_orders[$orderID]['positions']['position'] = $positions[$orderID];
	}
}
 
/*
	Daten in XML konvertieren
*/
$orders = $xml->encode(array("shopware"=>array("orders"=>array("order"=>$open_orders))));
 
/*
	XML-Daten ausgeben
*/
echo $orders;
?>
 

Export von Artikeln (XML)

 
<?php
/**
 * Shopware API Beispiel: Bestellungen in XML exportieren
 *
 * @package     Shopware 2.08.01
 * @subpackage  API
 */
/*
	Klassen laden, Aliase erstellen und Einstellungen vornehmen
*/
//exit; // Aus Sicherheitsgründen deaktiviert
require_once('../../api.php');
$api = new sAPI();
 
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$export =& $api->export->shopware;
$xml =& $api->convert->xml;
$mapping =& $api->convert->mapping;
$xml->sSettings['encoding'] = "ISO-8859-1";
 
 
$articles = $export->sFullArticles();
 
$articlemask = array (
	"articledetailsID",
	"articleID",
	"ordernumber",
	"name",
	"description",
	"description",
	"shippingtime",
	"added",
	"shippingfree",
	"releasedate",
	"topseller",
	"free",
	"keywords",
	"minpurchase",
	"purchasesteps",
	"maxpurchase",
	"purchaseunit",
	"status_description",
	"referenceunit",
	"changed",
	"suppliernumber",
	"kind",
	"additionaltext",
	"active",
	"instock",
	"stockmin",
	"esd",
	"weight",
	"position",
	"taxID",
	"supplierID",
	"unitID",
	"tax",
	"supplier",
	"unit",
	"mainnumber" => array("isset"),
	"mainID" => array("isset"),
	"maindetailsID" => array("isset"),
	"attributes" => array(
		"isset",
		"field" => "attr",
		"convert" => array(
			"key_as_atr"=>"id",
			"put_value" => "attribute"
		)
	),
	"downloads" => array(
		"isset",
		"convert" => array(
			"put_value" => "download"
		)
	),
	"informations" => array(
		"isset",
		"field" => "information",
		"convert" => array(
			"put_value" => "information"
		)
	),
	"images" => array(
		"isset",
		"convert" => array(
			"put_value" => "image"
		)
	),
	"prices" => array(
		"isset",
		"convert" => array(
			"put_value" => "price"
		)
	),
	"relationships" => array(
		"isset",
		"convert" => array(
			"put_value" => "relationship"
		)
	),
	"categories" => array(
		"isset",
		"convert" => array(
			"put_value" => "category"
		)
	)
);
$articles = $mapping->convert_array ($articlemask, $articles);
$categories = $export->sCategories();
$articles = $xml->encode(array(
	"shopware"=>array(
		"articles"=>array(
			"article"=>$articles
		),
		"categories"=>array(
			"category"=>$categories
		)
	)
));
echo $articles;
?>
 

Import von Artikeln (XML)

Beispiel-XML-Datei:


<shopware>
	<articles>
		<article>
			<name>Schwebeglobus</name>
			<!-- Bestellnummer -->
			<ordernumber>107911</ordernumber>
			<!-- Bestellnummer des Hauptartikel, nur bei Varianten -->
			<mainnumber></mainnumber>
			<description>Der große Schwebeglobus ist da.</description>
			<description_long>Der große Schwebeglobus ist da...</description_long>
			<!-- Hersteller -->
			<supplier>3DO</supplier>
			<!-- Herstellernummer -->
			<suppliernumber>E10011</suppliernumber>
			<!-- Lieferzeit in Tagen -->
			<shippingtime>3</shippingtime>
			<!-- Erscheinungsdatum -->
			<releasedate>2008-12-12</releasedate>
			<!-- Bestand -->
			<instock>10</instock>
			<!-- Bestandsminimum  -->
			<stockmin>2</stockmin>
			<weight></weight>
			<active>1</active>
			<!-- Weitere Atribute maximal 10 Stück  -->
			<attributes>
				<!-- ID als Key -->
				<attribute id="1">freitext</attribute>
				<attribute id="10">freitext</attribute>
			</attributes>
			<images>
				<image>
					<!-- Zeigt an das es das Hauptbild ist -->
					<mainpicture>1</mainpicture>
					<!-- Name des Bildes im Bildimport Ordner -->
					<file>image.1.jpg</file>
				</image>
				<image>
					<file>image.2.jpg</file>
				</image>
				<image>
					<file>image.3.jpg</file>
				</image>
			</images>
			<categories>
				<category>4</category>
				<category>5</category>
			</categories>
			<prices>
				<price>
					<!-- Kundengruppe -->
					<customergroup>EK</customergroup>
					<!-- Basispreis - Ist nur für statistische Zwecke -->
					<baseprice>8.00</baseprice>
					<!-- Pseudopreis - Wird den Kunden durchgestrichen im Shop angezeigt -->
					<pseudoprice>9.00</pseudoprice>
					<!-- Preis -->
					<value>10.00</value>
				</price>
				<price>
					<customergroup>H</customergroup>
					<!-- Staffelung - Ab wieviel bestellten Stücken ist der Preis gültig -->
					<from>1</from>
					<value>10.00</value>
				</price>
				<price>
					<customergroup>H</customergroup>
					<!-- Staffelung - Die nächste Staffelung solte größer sein als die davor, da sonst die niedrigeren Staffelung gelöscht werden-->
					<from>10</from>
					<value>5.00</value>
				</price>
			</prices>
			<!-- Bestellnummern der Cross Selling Artikel -->
			<crossselling>
				<article>EB100</article>
				<article>EB200</article>
				<article>EB300</article>
				<article>EB400</article>
			</crossselling>	
		</article>
	</articles>
	<categories>
		<category>
			<parentID></parentID>
			<description>Programme</description>
			<id>2</id>
		</category>
		<category>
			<parentID></parentID>
			<description>Games</description>
			<id>3</id>
		</category>
		<category>
			<parentID>3</parentID>
			<description>PC</description>
			<id>4</id>
		</category>
		<category>
			<parentID></parentID>
			<description>Sonstiges</description>
			<id>5</id>
		</category>
	</categories>
</shopware>

Beispiel-Import-Script

 
<?php
/**
 * Shopware API Beispiel: Artikel im XML - Format importieren
 *
 * @package     Shopware 2.08.01
 * @subpackage  API
 */
/* 
	Klassen laden, Aliase erstellen und Einstellungen vornehmen
*/
exit; // Aus Sicherheitsgründen deaktiviert
require_once('../../api.php');
$api = new sAPI();
 
/*
Beispiel zur Absicherung des API-Calls über einen eindeutigen
API - Schlüssel - Kann über Einstellungen > Schnittstellen > API 
im Backend generiert werden.
if ($_REQUEST["sAPI"]!=$api->sSystem->sCONFIG["sAPI"]){
	exit;
}
*/
 
$import =& $api->import->shopware;
$xml =& $api->convert->xml;
$mapping =& $api->convert->mapping;
$xml->sSettings['encoding'] = "ISO-8859-1";
 
/*
Laden der XML - Datei
*/
$data_path = $api->load("file://".$api->sPath."/engine/connectors/api/sample/xml/import.articles.xml");
 
/*
Konvertieren der XML Datei in ein Array
*/
$articles = $api->convert->xml->decode($data_path);
 
/*
	Da es in XML keine eindeutigen Keys gibt (siehe Beispiel: category, category)
	erzeugen wir mit der Hilfsfunktion "fix_array" eine kompatible Datenstruktur
 
	XML - Format
	<categories>
		<category>22</category>
		<category>17</category>
	</categories>
 
	In Array Form
	$data["categories"] = array (
		"category" => 22,
		"category" => 17,
	)
 
	Nach Umwandlung durch fix_array
	$data["categories"]["category"] = array (
		22,
		17,
	)
*/
 
$xml->fix_array($articles["shopware"]["articles"],"article");
$articles = $articles["shopware"]["articles"];
 
/*
Über das Array "mapping" werden die Felder aus der XML - Datei
Standard Shopware-Feldern zugeordnet
*/
$mappingmask = array (
	"name",
	"ordernumber",
	"mainnumber",
	"supplier",
	"suppliernumber",
	"shippingtime",
	"releasedate",
	"instock",
	"stockmin",
	"weight",
	"active",
	"description_long",
	"description",
	"attr" => "attributes",
);
 
/* Prepare-Mask ergänzt das Array um Shopware API
spezifische Einstellungen
*/
 
$mappingmask = $mapping->prepare_mask ($mappingmask);
 
/*
Nun wird der Artikel - Import gestartet
*/
foreach ($articles as $article)
{
 
	// Korrektur des Array-Formats, damit wir es leichter verarbeiten können
	$xml->fix_array($article['attributes'],"attribute");
	$xml->fix_array($article['images'],"image");
	$xml->fix_array($article['categories'],"category");
	$xml->fix_array($article['prices'],"price");
	$xml->fix_array($article['crossselling'],"article");
 
	/*
		Mit attr_as_key kann man aus folgender XML-Konstellation:
		<attributes>
			<attribute id="1">freitext</attribute>
			<attribute id="10">sprache</attribute>
		</attributes>
		folgendes Array erzeugen:
		$data = array (
			1 => "freitext",
			10 => "sprache"
		)
	*/
	$xml->attr_as_key($article['attributes'],"id");
 
	/*
		Mit der Convert-Line Funktion können diverse Funktionen
		auf die Datenfelder des Artikels angewandt werden.
		So z.B. Funktionen zur Maskierung des Inhalts
	*/
  	$article_data = $mapping->convert_line($mappingmask, $article, true);
 
  	/*
  	Wenn der Artikel eine Variante ist, werden die nicht benötigten
  	Datenfelder zurückgesetzt
  	*/
  	if(!empty($article_data["mainnumber"]))
  	{
  		unset($article_data["description_long"], $article_data["description"],$article_data["name"], $article_data["supplier"], $article_data["supplier"]);
  	}
 
  	//Artikel Stammdaten speichern und neue ArtikelID und ArticledetailsID in $article_data speichern
 
  	$article_data = array_merge($article_data, $import->sArticle($article_data));
 
  	//Wenn Artikel keine Variante ist Bilder-, CrossSelling- und Kategorie-Daten speichern
  	if(empty($article_data["mainnumber"]))
  	{
  		$import->sDeleteArticleImages(array("articleID"=>$article_data["articleID"]));
	  	foreach ($article["images"] as $image)
	  	{
	  		$image["articleID"] = $article_data["articleID"];
	  		$image["main"] = $image["mainpicture"];
	  		$image["image"] = $api->load("file://".$api->sPath."/engine/connectors/api/sample/images/".$image["file"]);
	  		$import->sArticleImage($image);
	  	}
	  	$import->sArticleCrossSelling (array("articleID"=>$article_data["articleID"]), $article["crossselling"]);
 
	  	$import->sArticleCategories (array("articleID"=>$article_data["articleID"]), $article["categories"]);
  	}
 
  	//Zum Schluss werden die Staffelpreise gespeichert
  	foreach ($article["prices"] as $price)
  	{
  		$price["price"] = $price["value"];
  		$price["articledetailsID"] = $article_data["articledetailsID"];
  		$price["pricegroup"] = $price["customergroup"];
 
  		$import->sArticlePrice($price);
  	}
}
?>
 

Test

Artikel-PDF erstellen

Artikel bewerten

Waren diese Informationen hilfreich? Ja Nein


Kommentare:

Artikel kommentieren


Die mit einem * markierten Felder sind Pflichtfelder.

Weitere interessante Artikel:

Bezeichnung:
Rating:
Klicks:
Datum:
7 Punkte
1698
10.06.2009
7 Punkte
2357
10.06.2009
7 Punkte
3099
10.06.2009

Bestell-Nr.: SW1203

Lieferzeit ca. 5 Tage

€ 1,00

Preise inkl. gesetzlicher
MwSt. zzgl. Versandkosten*

€ 1,00

Preise inkl. gesetzlicher
MwSt. + Versandkosten*

Kategorien: