Die Liste der Bestellungen im OXID eShop Backend zeigt standardmäßig viele nützliche Informationen, vom Kunden aber leider nur Vorname und Name, keine Kundennummer. Leider findet man die Kundennummer dann auch nicht in den Bestell-Details (auf den Tabs unter der Liste).

Für manche Anwendungsfälle kann es sinnvoll sein, die Kundennummer auf einen Blick zu sehen, und manchmal ist es hilfreich, danach suchen zu können. Das ist mit wenigen Handgriffen gemacht. Wie, zeige ich in diesem Tutorial.

Sie benötigen für dieses Tutorial einfache PHP und HTML Kenntnisse.

Hinweis: Diese Vorgehensweise ist keine saubere, updatesichere Erweiterung des Oxid Shops. Bei einer Aktualisierung wird diese Funktion wieder von der Standard-Einstellung überschrieben. Wie Sie Ihren Oxid-Shop sauber erweitern, ist nicht Inhalt dieses Tutorials. Bei Interesse gehe ich darauf gern in einem separaten Beitrag ein.

Kundennummer als Spalte in der Liste

Wir benötigen also eine zusätzliche Spalte in unserer Bestell-Liste. Am günstigsten ist es, wenn die Kundennummer vor der Bestellnummer eingefügt wird, aufgrund der Spalten-Reihenfolge in der Suchzeile im Kopf.

Öffnen Sie die Datei  /application/views/admin/tpl/order_list.tpl (in älteren Shops bis 4.6 /out/admin/tpl/order_list.tpl).

Diese Datei ist ein Smarty-Template und enthält den HTML-Code der Bestell-Liste mit Platzhaltern für Variablen. Wir müssen hier eine Spalte im Spaltenkopf sowie eine im Tabelleninhalt hinzufügen.

Die Dateien unterscheiden sich im Aufbau je nach OXID-Version. Suchen Sie nach dem String „GENERAL_ORDERNUM“, das ist in allen Fällen der Spalten-Bezeichner für die Spalte mit der Bestellnummer. Die Bezeichner in Großbuchstaben sind Platzhalter für die eigentlichen Texte, die dann aus Sprachdateien geladen werden.

Auf die Mehrsprachigkeit verzichten wir jetzt, um es nicht unnötig kompliziert zu machen. Fügen Sie daher nun vor der oben genannten Spalte den Code für unsere Spalte ein. Das ist unser Spaltenkopf:

<td height="15">Kundennr.</td>

Alles, was in den anderen Spalten noch „drumherum“ ist und den Code so unübersichtlich macht, dient der Sortierung der Bestell-Liste nach der jeweiligen Spalte. Auch darauf verzichten wir, zumal wir ja später noch eine Suchfunktion erstellen.

Bis hierhin war es noch recht einfach, jetzt wird es etwas schwieriger. An derselben Stelle wie der Spaltenkopf muss nun eine Etage tiefer (innerhalb der [{foreach from=$mylist item=listitem}] … [{/foreach}] Schleife) die Spalte mit dem Wert eingefügt werden.

<td valign="top" class="[{ $listclass}]" height="15">
[{assign var=user value=$listitem->getOrderUser()}][{$user->oxuser__oxcustnr->value}]
</td>

Wir machen es uns einfach, indem wir mittels getOrderUser() die Kundendaten direkt aus dem jeweiligen Bestell-Objekt holen. Das erspart uns die mühevolle Anpassung der order_list-Klasse, die für das Laden der Bestell-Liste zuständig ist.

Wenn Sie bis hierhin alles richtig gemacht haben (Datei hochladen und tmp-Verzeichnis leeren, dann Bestell-Liste aufrufen), sehen Sie schon die Spalte Kundennr. mit dem jeweiligen Wert. Nur oben und unten sieht unsere Ansicht noch etwas verschoben aus. Das liegt daran, dass wir eine Spalte hinzugefügt haben und die Breite (Anzahl Spalten) der restlichen Zeilen nicht mehr hinhaut.

Das müssen wir an drei Stellen korrigieren:

  1. Ganz oben innerhalb der <table> finden Sie <colgroup> Angaben. Fügen Sie hier Ihre Spalte hinzu und verteilen Sie die Breitenangaben (in %) so, dass sie zusammen 100 ergeben. Fügen Sie z. B. die dritte, neue Spalte ein, ändern Sie die Breite der Spalten 1 und 2 von 25 auf 20% und die nun frei gewordenen 10% geben Sie der dritten Spalte. Sie können das aber auch anders verteilen, am besten probieren Sie es aus, wie es bei Ihnen am besten aussieht.
  2. In der ersten Zeile (<tr>) der Tabelle sind die Suchfelder eingestellt. Suchen Sie hier nach dem Suchfeld für Diverses: <select name=“addsearchfld“> Geben Sie der Spalte (<td>), die dieses Suchfeld enthält ein colspan=“2″ bzw. wenn die Spalte bereits ein colspan-Attribut enthält, erhöhen Sie dieses um 1. Aus colspan=“2″ wird also colspan=“3″.
  3. Gehen Sie nun ganz weit nach unten zur Stelle [{include file=“pagenavisnippet.tpl“… Hier finden Sie ebenfalls einen Colspan-Wert, den Sie um 1 erhöhen. Aus colspan=“6″ wird z. B. colspan=“7″.

Prüfen Sie nun nochmal die Ansicht (tmp-Ordner leeren nicht vergessen!). Alles sollte jetzt gut aussehen. Die Kundennummer wird in jeder Bestellung angezeigt. Super, der erste Schritt ist geschafft.

Nach Kundennummer suchen

Nun wollen wir aber auch Bestellungen nach einer bestimmten Kundennummer suchen können.

Auch das ist relativ einfach und mit wenigen Handgriffen umgesetzt.

Wir editieren dazu die Datei /application/controllers/admin/order_list.php (in älteren Shops bis 4.6 /admin/order_list.php).

Öffnen Sie die Datei und schauen Sie sich die render-Methode an. Etwa in Zeile 72 wird die Variable $aSearch als Array erzeugt:

$aSearch = array( 'oxorderarticles' => 'ARTID', 'oxpayments' => 'PAYMENT');

Dieses Array füllt das Suchfeld über der Bestell-Liste, in dem man auswählen kann, wonach man sucht. Hier wollen wir unsere Kundennummer einfach hinzufügen. Also erweitern wir die Zeile so:

$aSearch = array( 'oxorderarticles' => 'ARTID', 'oxpayments' => 'PAYMENT', 'dwauser' => 'DWACUSTNR');

Sie haben es vielleicht gemerkt, diesmal habe ich doch die Großbuchstaben-Version verwendet, also die Konstante für die Mehrsprachigkeit. Hier geht es leider nicht anders, was bedeutet, dass wir DWACUSTNR in der Sprachdatei des Backends definieren müssen, um Fehlermeldungen zu vermeiden. Wie wir das machen, beschreibe ich gleich, ein klein wenig Geduld.

Erstmal machen wir hier weiter. Meine Suche bekommt die Kennung dwauser. Diese Kennung ist beliebig, muss aber in der Methode _buildSelectString() definiert werden.

Dazu wird die dort enthaltene switch case Anweisung um einen neuen case erweitert:

case 'dwauser':
    $sQ = "oxorder left join oxuser on oxuser.oxid=oxorder.oxuserid where oxuser.oxcustnr like ".$oDb->quote( "%{$sSearch}%" ) ." and ";
    break;

Wichtig: Fügen Sie diese Anweisung vor der default-Anweisung und nach einem break; ein. Der fertige Code sieht jetzt z. B. in OXID 4.9 so aus:

switch ($sSearchField) {
  case 'oxorderarticles':
    $sQ = "oxorder left join oxorderarticles on oxorderarticles.oxorderid=oxorder.oxid where ( oxorderarticles.oxartnum like " . $oDb->quote("%{$sSearch}%") . " or oxorderarticles.oxtitle like " . $oDb->quote("%{$sSearch}%") . " ) and ";
    break;
  case 'oxpayments':
    $sQ = "oxorder left join oxpayments on oxpayments.oxid=oxorder.oxpaymenttype where oxpayments.oxdesc like " . $oDb->quote("%{$sSearch}%") . " and ";
    break;
  case 'dwauser':
    $sQ = "oxorder left join oxuser on oxuser.oxid=oxorder.oxuserid where oxuser.oxcustnr like ".$oDb->quote( "{$sSearch}" ) ." and ";
    break;
  default:
    $sQ = "oxorder where oxorder.oxpaid like " . $oDb->quote("{$sSearch}") . " and ";
    break;
}

Dieses Code-Snippet sorgt dafür, dass die Query, mit der die Bestellungen aus der Datenbank abgerufen werden, um unsere Bedingung (bestimmte Kundennummer) erweitert wird.

Und das war’s schon! Halt, ja, noch nicht ganz. Wir brauchen ja noch unsere Angabe in der Sprachdatei.

Öffnen Sie dazu die Datei /application/views/admin/de/cust_lang.php (in älteren Shops bis 4.6 /out/admin/de/cust_lang.php) .

Fügen Sie unten vor der schließenden Klammer eine neue Zeile ein:

'DWACUSTNR' => 'Kundennr.',

Achten Sie darauf, dass die Zeile darüber ebenfalls mit einem Komma abgeschlossen wurde.

Leeren Sie abermals nach dem Hochladen das tmp-Verzeichnis.

Nun können Sie Ihr Werk in Ihrem OXID Shop begutachten. In der zweiten Spalte der Suchzeile ganz oben, im Dropdown (Bezahlt) steht nun auch Kundennr. als Option. Wenn Sie diese auswählen und dann in das Feld daneben die gesuchte Kundennummer eingeben, werden nur noch die Bestellungen dieses Kunden angezeigt.

Auf Screenshots habe ich hier bewusst verzichtet. Fragen dazu können gern unten im Kommentarfeld gestellt werden (bitte nicht per E-Mail) und werden von mir beantwortet, sobald ich dazu Zeit finde und wenn sie nicht bereits hier im Tutorial beantwortet wurden. Lesen lohnt :)

Dieses Tutorial ist ursprünglich am 20. Mai 2013 erschienen und wurde am 17. Juli 2015 überarbeitet. Ich habe einige kleinere optische Verbesserungen vorgenommen (Einfärbung der Zeilen + des Headers) und einmal geprüft, ob alle Anweisungen in OXID 4.9 funktionieren (und das tun sie). Bei der Gelegenheit habe ich auch das Such-Query etwas angepasst. Die bisher verwendete Suchanweisung führte dazu, dass z. B. bei Suche nach 201 auch die Kundennummer 2011 und 1201 gefunden wurden (die also nicht identisch waren, sondern nur einen Teilstring enthielten).

Die drei angepassten Dateien (für die Shop-Version 4.9) können Sie hier als zip-Datei herunterladen.

Mehr davon?

Wünschen Sie sich mehr Tutorials für OXID eShop? Ich freue mich über Themenvorschläge und Feedback.

Thema: Zeit, Geld & Nerven | Stichworte: , , ,