Selbstständige 2.0 API unter 4.0 laufen lassen

Das Umstellen eines PHP Programmes von der API 2.0 auf 4.x ist ja angebich ganz einfach. Nur zwei Zeilen tauschen . Aber unser PHP Programm zum Export von Bestellungen liegt im shopware Verzeichnis und kann autark aus unserer Desktop Applikation gestartet werden. Das bekomme ich uter V 4 nicht hin, weil alle Beispiele eingebunde Plugins sind. Das Problem sind wohl die ersten beiden Zeilen: require_once(’…/…/api.php’); $api = new sAPI(); Hier das ganze PHP Programm, welches wir direkt aufrufen können und weiterhin müssen. Vielen Dank für jegliche Hilfe.<?php /**

  • Shopware API Beispiel: Bestellungen in XML exportieren
  • @author Heiner Lohaus hl@shopware2.de * @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”]) { echo “ERROR keine Zugangsberechtigung”; 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) { echo “ERROR keine Bestellungen vorhanden”; exit(); } /* Die dazu passenden Kunden auslesen */ $customers = $export->sOrderCustomers(array(“orderIDs”=> $orderIDs)); if (!$customers) { echo “ERROR keine Kundenzuordnung vorhanden”; exit(); } /* Und die dazu passenden Bestellpositionen auslesen */ $positions = $export->sOrderDetails(array(“orderIDs”=> $orderIDs)); if (!$positions) { echo “ERROR keine Positionen vorhanden”; 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”, “ordertime”, “customercomment” ); $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 */ if ($orders=="") { echo “ERROR - keine Daten”; } else { echo $orders; } ?>

Was spricht dagegen das ganze als Plugin zu erstellen und die Funktionalität in einem Backend-/Frontend-Controller unterzubringen?

Diese aufzurufenden Methoden sind Bestandteil unser kaufm. Software und werden aus dieser heraus angesteuert., z.B. der Statuswechsel oder das EIntragen der TrackingID autom. beim Drucken der Rechnung. Deshalb soll die Art und Weise weiterhin so bleiben. Lt. Handbuch, soll das schließlich auch funktionieren.

Hi, grundsätzlich gibt es in SW keine sog. “connector”-Klassen mehr. In SW3 war es ja teilweise möglich, PHP-files außerhalb des Shopware-Stacks zu includen und dann damit zu arbeiten. Wie gesagt: Das ist nicht mehr so möglich. Dirk hat aber schon den richtigen Hinweis gegeben: Du kannst ein kleines Plugin schreiben, das im Wesentlichen einen Frontend- oder Backend-Controller registriert und dann bspw. über http://www.mein-shop.de/mein-controller aufgerufen werden kann. In dem Controller kannst du dann ja deine alte Logik über Shopware()->Api() fahren (wenn es wirklich die alte API sein muss). Damit hast du also wieder den gleichen Stand, dass es eine URL gibt, die du in deiner WaWi aufrufen kannst, die dann irgendwelche Importe fährt. Die “offizielle” Alternative ist zur Zeit eben die Rest-Schnittstelle von Shopware 4. Da kann deine WaWi theoretisch direkt mit SW sprechen und irgendwelche Flags setzen / Artikel anlegen / was auch immer. Für kompliziertere Sachen würde man sich eine eigene API-Ressource schreiben. lG Daniel