-
-
Save vanilla-thunder/2ae7bb67d93c5aa82cc0860292c57281 to your computer and use it in GitHub Desktop.
OXID eShop Bestellungen als XML exportieren
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/opt/php-5.6.30/bin/php | |
<?php | |
/** Aufruf: | |
* ./export.php [einstellung] | |
* Einstellungen: "neu", heute", "gestern" und "alle" | |
*/ | |
/* ********** configuration ********** */ | |
$sShopRoot = "../dev/"; // Pfad zum Shop | |
$sExportDir = dirname(__FILE__); // Zielverzeichnis für XML Dateien | |
/* *********************************** */ | |
require_once $sShopRoot . "/bootstrap.php"; | |
// Aufrufparameter | |
$config = ($argv[1]) ? $argv[1] : "neu"; | |
if ($config == "neu") export(getLastExportDate(), date("Y-m-d"), true, false); // nur unexportierte Bestellungen seit dem letzten Export | |
elseif ($config == "heute") export(date("Y-m-d"), date("Y-m-d"), false, true); | |
elseif ($config == "gestern") export(date("Y-m-d", time() - 86400), date("Y-m-d", time() - 86400), false, true); | |
elseif ($config == "alle") export("0000-00-00", date("Y-m-d"), false, true); // für Initialexport oder sowas | |
echo "\nXML Export ist durchgelaufen\n\n"; | |
/** | |
* Damit exportierte Bestellungen markiert werden können, wird ein neues Feld in der Tabelle oxorder benötigt: | |
* ALTER TABLE `oxorder` ADD `EXPORTED` TINYINT(1) NOT NULL DEFAULT '0' | |
* | |
* $von - datum | |
* $bis - datum | |
* $markexported - true | false - sollen exportierte Bestellungen markiert werden? | |
* reexport muss true sein um bereits exportierte Bestellungen nochmal zu exportieren | |
*/ | |
function export($von, $bis, $markexported = false, $reexport = false) | |
{ | |
/* check for valid Y-m-d dates */ | |
if (!(preg_match("/^[0-9]{4}-(0[0-9]|1[0-2])-(0[0-9]|[1-2][0-9]|3[0-1])$/", $von) && preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $bis))) | |
{ | |
echo "\nDatum ist ungültig: $von - $bis \n\n"; | |
exit(1); | |
} | |
// bei Reexport nie etwas an Exportmakrierung ändern | |
//if ($reexport) $markexported = false; | |
// OXID Liste mit Bestellungen | |
/** @var oxList _bestellungen */ | |
$_bestellungen = oxNew('oxlist'); | |
$_bestellungen->init("oxorder"); | |
$_bestellungen->selectString("SELECT * FROM oxorder WHERE oxorderdate BETWEEN '$von 00:00:00' AND '$bis 23:59:59' " . ($reexport ? "" : "AND EXPORTED != 1") . " ORDER BY oxorderdate ASC"); | |
// Wenn es keine Bestellungen gab generiere keine DOMDocuments damit auch keine leeren XML-Dateien generiert werden | |
if ($_bestellungen->count() == 0) | |
{ | |
echo "\nes gab nichts zu exportieren\n\n"; | |
exit(1); | |
} | |
// XML-Dokumente vorbereiten | |
$xml = (object)[ | |
"AufDOM" => new DOMDocument, | |
"AdrDOM" => new DOMDocument | |
]; | |
$xml->AufDOM->loadXML('<?xml version="1.0" encoding="UTF-8"?><AUFTRAEGE/>'); | |
$xml->AdrDOM->loadXML('<?xml version="1.0" encoding="UTF-8"?><ADRESSEN/>'); | |
$xml->AufDOM->formatOutput = true; | |
$xml->AdrDOM->formatOutput = true; | |
$auftraege = $xml->AufDOM->getElementsByTagName('AUFTRAEGE')->item(0); | |
$adressen = $xml->AdrDOM->getElementsByTagName('ADRESSEN')->item(0); | |
// alle gefundene Bestellungen durchgehen | |
foreach ($_bestellungen as $oOrder) | |
{ | |
$oUser = $oOrder->getOrderUser(); | |
$pos = $xml->AdrDOM->createElement('Rechnungsadresse'); | |
$pos->setAttribute('ID', $oUser->oxuser__oxcustnr->value); | |
appendElement($xml->AdrDOM, $pos, 'kundennr', $oUser->oxuser__oxcustnr->value); | |
appendElement($xml->AdrDOM, $pos, "email", $oOrder->oxorder__oxbillemail->value); | |
appendElement($xml->AdrDOM, $pos, 'anrede', $oOrder->oxorder__oxbillsal->value); | |
appendElement($xml->AdrDOM, $pos, 'vorname', $oOrder->oxorder__oxbillfname->value); | |
appendElement($xml->AdrDOM, $pos, 'nachname', $oOrder->oxorder__oxbilllname->value); | |
appendElement($xml->AdrDOM, $pos, 'strasse', $oOrder->oxorder__oxbillstreet->value . " " . $oOrder->oxorder__oxbillstreetnr->value); | |
appendElement($xml->AdrDOM, $pos, 'plz', $oOrder->oxorder__oxbillzip->value); | |
appendElement($xml->AdrDOM, $pos, 'ort', $oOrder->oxorder__oxbillcity->value); | |
appendElement($xml->AdrDOM, $pos, 'geburt', ($oUser->oxuser__oxbirthdate == "0000-00-00" ? "" : $oUser->oxuser__oxbirthdate->value)); | |
appendElement($xml->AdrDOM, $pos, 'telefon', $oOrder->oxorder__oxbillfon->value); | |
appendElement($xml->AdrDOM, $pos, 'fax', $oOrder->oxorder__oxbillfax->value); | |
$adressen->appendChild($pos); | |
// alternative Lieferanschrift | |
if ($oOrder->oxorder__oxdelstreet->value !== "" && $oOrder->oxorder__oxdelstreet->value !== $oOrder->oxorder__oxbillstreet->value && $oOrder->oxorder__oxdelzip->value !== $oOrder->oxorder__oxbillzip->value) | |
{ | |
$pos = $xml->AdrDOM->createElement('Lieferadresse'); | |
$pos->setAttribute('ID', $oUser->oxuser__oxcustnr->value); | |
appendElement($xml->AdrDOM, $pos, 'kundennr', $oUser->oxuser__oxcustnr->value); | |
appendElement($xml->AdrDOM, $pos, 'anrede', $oOrder->oxorder__oxbillsal->value); | |
appendElement($xml->AdrDOM, $pos, "vorname", $oOrder->oxorder__oxdelfname->value); | |
appendElement($xml->AdrDOM, $pos, "nachname", $oOrder->oxorder__oxdellname->value); | |
appendElement($xml->AdrDOM, $pos, "firma", $oOrder->oxorder__oxdelcompany->value); | |
appendElement($xml->AdrDOM, $pos, "strasse", $oOrder->oxorder__oxdelstreet->value . " " . $oOrder->oxorder__oxdelstreetnr->value); | |
appendElement($xml->AdrDOM, $pos, "plz", $oOrder->oxorder__oxdelzip->value); | |
appendElement($xml->AdrDOM, $pos, "ort", $oOrder->oxorder__oxdelcity->value); | |
appendElement($xml->AdrDOM, $pos, 'telefon', $oOrder->oxorder__oxdelfon->value); | |
appendElement($xml->AdrDOM, $pos, 'fax', $oOrder->oxorder__oxdelfax->value); | |
$adressen->appendChild($pos); | |
} | |
// Export der Bestelldaten. | |
$auftrag = $xml->AufDOM->createElement("AUFTRAG"); | |
appendElement($xml->AufDOM, $auftrag, "kundennr", $oUser->oxuser__oxcustnr->value); | |
appendElement($xml->AufDOM, $auftrag, "bestellnr", $oOrder->oxorder__oxordernr->value); | |
// Datum der Bestellung | |
appendElement($xml->AufDOM, $auftrag, "best_am", date_format(date_create($oOrder->oxorder__oxorderdate->value), "Ymd")); | |
appendElement($xml->AufDOM, $auftrag, "best_zeit", date_format(date_create($oOrder->oxorder__oxorderdate->value), "H:i:s")); | |
// Zahlungsart | |
if ($oOrder->oxorder__oxpaymenttype->value) | |
{ | |
$oPayment = oxNew("oxPayment"); | |
if ($oPayment->load($oOrder->oxorder__oxpaymenttype->value)) appendElement($xml->AufDOM, $auftrag, "zahlart", $oPayment->oxpayments__oxdesc->value); | |
else appendElement($xml->AufDOM, $auftrag, "zahlart", $oPayment->oxorder__oxpaymenttype->value); // Zahlart existiert wohl nicht mehr | |
} | |
else appendElement($xml->AufDOM, $auftrag, "zahlart", "unbekannt"); // Feld ist leer? warum nur? | |
// Transaktions-ID der externen Bezahldienstanbieter als Referenztext mit übergeben | |
if ($oOrder->oxorder__oxtransid->value) appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__oxtransid->value); | |
// Amazon Payments hat keine Transaktions-ID, aber eine Amazonbestellid | |
elseif ($oOrder->oxorder__oxpaymenttype->value == "psamazonpayment") appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__psamazonorderid->value); | |
// Bezahlen mit Amazon hat eine Amazon Order Reference ID | |
elseif ($oOrder->oxorder__oxpaymenttype->value == "jagamazon") appendElement($xml->AufDOM, $auftrag, "ref_text", $oOrder->oxorder__jagamazonorderreferenceid->value); | |
appendElement($xml->AufDOM, $auftrag, "vsk", $oOrder->oxorder__oxdelcost->value); | |
appendElement($xml->AufDOM, $auftrag, "rabatt", $oOrder->oxorder__oxdiscount->value); | |
appendElement($xml->AufDOM, $auftrag, "gutschein", $oOrder->oxorder__oxvoucherdiscount->value); | |
// Artikelexport ==> Positionen im Auftrag | |
/** @var oxArticle $oArticle */ | |
$oArticles = $oOrder->getOrderArticles(); | |
foreach ($oArticles as $oArticle) | |
{ | |
$pos = $xml->AufDOM->createElement("POSITIONEN"); | |
appendElement($xml->AufDOM, $pos, "bestellnr", $oOrder->oxorder__oxordernr->value); | |
appendElement($xml->AufDOM, $pos, "artikelnr", $oArticle->oxorderarticles__oxartnum->value); | |
appendElement($xml->AufDOM, $pos, "bezeichng", $oArticle->oxorderarticles__oxtitle->value); | |
appendElement($xml->AufDOM, $pos, "menge", $oArticle->oxorderarticles__oxamount->value); | |
appendElement($xml->AufDOM, $pos, "preis", str_replace(".", ",", round($oArticle->oxorderarticles__oxnetprice->value, 2))); | |
appendElement($xml->AufDOM, $pos, "mwst", str_replace(".", ",", round($oArticle->oxorderarticles__oxvatprice->value, 2))); | |
appendElement($xml->AufDOM, $pos, "mwst_kz", $oArticle->oxorderarticles__oxvat->value); | |
$auftrag->appendChild($pos); | |
} | |
$auftraege->appendChild($auftrag); | |
$xml->AdrDOM->appendChild($adressen); // Adressdaten an XML DOM anhängen | |
$xml->AufDOM->appendChild($auftraege); // Auftragsdaten an XML DOM anhängen | |
// Bestellung als exportiert markieren? | |
if ($markexported) | |
{ | |
$oOrder->assign(["oxorder__exported" => 1]); | |
$oOrder->save(); | |
} | |
} | |
// XML speichern | |
if (!$xml->AdrDOM || !$xml->AufDOM) | |
{ | |
echo "XML Daten sind nicht vorhanden"; | |
exit(1); | |
} | |
global $sExportDir; | |
$cfg = oxRegistry::getConfig(); | |
$file = $sExportDir . DIRECTORY_SEPARATOR . $von . ($bis && $bis != $von ? "_" . $bis : ""); | |
$adressen = $file . "_adressen.xml"; | |
if (!$fh = fopen($adressen, 'w')) | |
{ | |
echo "Can't open file: " . $adressen; | |
exit(1); | |
} | |
$stringData = $xml->AdrDOM->saveXML(); | |
fwrite($fh, $stringData); | |
fclose($fh); | |
$auftraege = $file . "_auftraege.xml"; | |
if (!$fh = fopen($auftraege, 'w')) | |
{ | |
echo "Can't open file: " . $auftraege; | |
exit(1); | |
} | |
$stringData = $xml->AufDOM->saveXML(); | |
fwrite($fh, $stringData); | |
fclose($fh); | |
return true; | |
} | |
function appendElement(&$dom, &$ele, $name, $val) | |
{ | |
$n = $dom->createElement(strtoupper($name)); | |
// wenn es Probleme mit Sonderzeichen gibt, müssen die Werte ggf in UTF-8 konvertiert werden | |
// $val = iconv("iso-8859-1", "UTF-8", $val); | |
$t = $dom->createCDATASection($val); | |
$n->appendChild($t); | |
$ele->appendChild($n); | |
$dom->appendChild($ele); | |
} | |
/** | |
* Datum der neuesten exportierten Bestellung abfragen. | |
* | |
* @return Datum im ISO-Format der neuesten exportierten Bestellung | |
*/ | |
function getLastExportDate() | |
{ | |
return substr(oxDb::getDb()->getOne("SELECT MIN(oxorderdate) FROM oxorder WHERE exported = 1"), 0, 10); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment