xt:Commerce: Bestellnummer mit Datum

Das ist jetzt zur Abwechslung mal keine 1:1-Anleitung, die man einfach mittels Copy&Paste übernehmen könnte, sondern eher ein Beitrag, der einem eine Idee geben soll, wie man das Problem angehen kann. Er setzt voraus, dass man sich einigermaßen gut mit php und dem Shopsystem auskennt und in der Lage ist, Transferleistungen vorzunehmen. Wer sich das nicht zutraut sollte die Finger davon lassen oder nachher nicht rumheulen.

Die Frage kommt immer mal wieder und sie ist meiner Meinung nach auch durchaus berechtigt: Wie kann man die Bestellnummer eines xt:Commerce-Systems mit zusätzlichen Informationen anreichern, sei es ein Shopkürzel, das Datum oder auch einfach einer Zufallszahl? Die kurze Antwort ist: Geht nicht, denn xt:Commerce nimmt die inkrementell von MySQL erzeugte ID als Bestellnummer. Die lange Antwort ist: Geht schon, erfordert aber tiefe Eingriffe ins System. Updatefähigkeit ade. Aber das ist ja mit jedem xt:Commerce-‘Modul’ so.

Beginnen wir mit dem leichten Teil der Übung. Einer Funktion, die eine Bestellnummer mit Datum zurück liefert. Dazu brauchen wir neben der systemseitig generierten ID noch das Bestelldatum. Sonst haben wir morgen eine andere Bestellnummer als heute. Die Datei packen wir in das inc/-Verzeichnis und nennen sie xtc_build_order_id.php.

function xtc_build_order_id($date, $id) {
	$date = strtotime($date);
	return sprintf("%d%02d%02d-%05d", strftime("%y", $date), strftime("%m", $date), strftime("%d", $date), $id);
}

Der anstrengende Teil kommt jetzt: Überall, wo die Bestellnummer zur Ausgabe verwendet wird, muss der Funktionsaufruf ergänzt werden. Wir reden mindestens von diesen Dateien:

account_history_info.php
account_history.php
account.php
checkout_success.php
print_order.php
send_order.php

Dazu kommen alle Zahlungsmodule, sofern diese die Bestellnummer ausgeben oder benutzen (z.B. Paypal) und mindestens die orders.php im admin/-Verzeichnis. In jeder dieser Dateien muss am Anfang, nach den schon vorhanden includes, zunächst unsere Funktionsdatei inkludiert werden:

require_once(DIR_FS_INC.'xtc_build_order_id.inc.php');

und wie gesagt die Bestellnummer durch den Funktionsaufruf ersetzt werden, so wird z.B. in der send_order.php aus

$smarty->assign('oID', $insert_id);

das hier:

$smarty->assign('oID', xtc_build_order_id($order->info['date_purchased'], $insert_id));

Was daran anstrengend ist? Man muss sich in jeder Datei wieder raussuchen, in welcher Variable die Order-ID versteckt ist. In send_order.php ist es wie gesehen $insert_id, in print_order.php hingegen $_GET['oID']. Denn im $order-Objekt kommt die ID selbst nicht vor – wäre ja auch zu einfach. Und mitunter, wie in account_history.php, hat man nicht einmal ein $order-Objekt zur Verfügung.
Man muss also gewillt sein, ein bisschen zu suchen. Und man muss wissen, was man tut.

Ich bin Web Developer und arbeite als Lead Developer bei WIBROS. Ich liebe das Internet, Baseball, Softball, Bier und die Farbe orange. Ich hab früher mal zu viel Kaffee getrunken.

Comment (1) Write a comment

  1. Vielen Dank für diesen Denkansatz. Wir haben eine entsprechende Anpassungsmöglichkeit für uns gefunden und die Bestellnummern mit Datum und, sofern vorhanden, Affilliate-Informationen angereichert. So können wir schneller und besser Bestellnummern zuordnen.
    In der Account-History kann man direkt in die Datenbank gehen, und weitere Infos aus der Datenbank holen. Das ist zwar etwas Schreibarbeit, kann aber locker in andere Dateien und Funktionen ausgelagert werden.

    Reply

Leave a Reply

Required fields are marked *.