Bestellhistorie Artikel Details

Hallo liebe Oxidgemeinde, ich bin ein Azubi(Fachinformatiker - Anwendungsentwicklung) und mache im Moment ein Praktikum seit 01.05.2019, hier im Betrieb arbeite ich am Kundenkonto was gleichzeitig mein IHK Projekt sein wird. Ich habe dafür ein eigenes Modul erstellt und bearbeite so den Punkt Bestellhistorie.

Im Moment versuche ich aus der Bestellhistorie einzelne Order in einem extra Template nochmal detaillierte aufzurufen. Mein Problem: ich schaffe es nicht die einzelnen Order nur aufzurufen und nicht die ganze Order Liste. Hat da einer einen tipp für mich wie ich nur die einzelnen Order aufrufen kann ? ich habe bis jetzt versucht die Order No. als ID zu nehmen und darüber die Bestellung aufzurufen, ohne erfolg.

Wir benutzen hier Oxid Version 4.9.11

du musst schon die oxID als ID nehmen, man kann die Felder nicht einfach so mischen.

Der beste (und vermutlich auch der einzige) Weg, OXID kennenzulernen, wäre den Quellcode zu lesen.
Die Vorgehensweise ist dabei immer gleich:

  1. Zerlege dein Ziel in kleine Schritte und erledige sie nacheinander:
    aus “einzelne Bestellungen aus der Liste in einem gesonderten Template anzeigen” wird:
    a) “einzelne Bestellung abrufen” und
    b) “in einem extra Template anzeigen”

  2. Suche eine Stelle im Shop, die möglichst das macht, was du brauchst.
    Prinzipiell ist die Bestellverwaltung im Admin genau das, was du brauchst. Da ist eine Liste mit Bestellungen und wenn du eine bestimmte auswählst, wird sie unten angezeigt. Allerdings ist Admin recht kompliziert zu verstehen, aber im order_main.php findest du auf jeden Fall den Code, wie man eine bestimmte Bestellung über die ID abrufen kann.
    In der Funktion getEditObjectId() siehst du, woher er die ID für die Bestellung nimmt. Im Endeffekt ist es nur ein Formular, das die gewünschte ID per GET Parameter schickt.
    Und jetzt musst du nur noch deinem Controller mit so einem Parameter aufrufen und schon kannst du den Code fast 1 zu 1 verwenden.

1 Like

Hi Jaba :slight_smile:

beim Aufruf Deiner geplanten Detailansicht von einzelner Order musst Du über die URL Dir als Get-Parameter am besten die OXID der Order mitgeben z.B.

/index.php?cl=dein_controller&fnc=deine_methode&oxid=...

Die OXID der einzelnen Order bekommst wie Du bereits weißt über

$order->oxorder__oxid->value

Innerhalb Deiner Methode kannst Du dann den Get-Paramter OXID aulesen

$oxid = oxRegistry::getConfig()->getRequestParameter(“oxid”);

und diese merkst Dir in Variable.

Daten einer einzelnen Order bekommst über oxNew in Kombination mit load Methode wo Du die OXID übergibst. Beispiel:

$oOrder = oxnew('oxorder');
$oOrder->load($oxid);

Die Werte der einzelnen Order kannst Du wie gewohnt auslesen z.B.

$oOrder->oxorder__oxbillemail->value

Alle Werte welche Du in Deinem Template benötigst machst über ViewData Variable in Deiner Render Methode bekannt.

Viele liebe Grüße aus Gran Canaria, grüße die Anderen
Tim

2 Likes

Eigenes Template: Kundenliste im Backoffice

Order aufrufen s. order_article.php =>

public function getEditObject()
{
$soxId = $this->getEditObjectId();
if ($this->_oEditObject === null && isset($soxId) && $soxId != “-1”) {
$this->_oEditObject = oxNew(“oxorder”);
$this->_oEditObject->load($soxId);
}

    return $this->_oEditObject;
}
1 Like

Vielen Dank für die schnelle Hilfe,
ich habe es jetzt soweit geschafft, dass ich die oxID über ein (get) Formulat auslesen kann und diese zu Testzwecken über ein normales Echo auf dem anderen Template anzeigen lasse ( die oxID).

<form action="[{$oViewConf->getSelfActionLink()}]cl=account_extend_bill_details" method=“get”>
<input type=“hidden” name=“cl” value=“account_extend_bill_details”>
<input type=“hidden” name=“oxid” value="[{$order->oxorder__oxid->value}]">
<button style=“color: grey;margin-left: 2px;border: none;background-color: white;” type=“submit”>
<i class=“simg simg-right-gray” style=“margin-top: 9px;”></i>
</button
>
</form*>

Was ich immer noch nicht verstehe ist, wie lasse ich mir jetzt die ganzen Daten auch auf dem neuen Template anzeigen? Ich stehe gerade etwas auf dem Schlauch :confused:

Ich habe den weg von indianer3c probiert und habe es so verstanden das ich in meinem controller die render Methode anpassen sollte, meine render function habe ich nun mit folgenden Zeilen ergänzt:

    $oxid = $this->_aViewData["oxid"] = $this->getEditObjectId();
    if ($oxid != "-1" && isset($oxid)) {
        // load object
        $oOrder = oxnew('oxorder');
        $oOrder->load($oxid);
    }

    $this->_aViewData["oxid"] = $oOrder;

    return $this->_sThisTemplate;

wenn ich dann versuche zu testen komme ich nur auf die Main Seite zurück, was übersehe ich ?

Was steht denn in der oxideshop.log Datei?

1 Like

danke für den Tipp

Function ‘getEditObjectId’ does not exist or is not accessible!

stand in der log Datei, hab das mal korrigiert , nun werde ich nicht mehr auf die Startseite geleitet , dennoch funktioniert meine Lösung leider nicht.

Ersetzte oxid mit edit und schaue Dir order_article.tpl an:

[{foreach from=$edit->getOrderArticles() item=listitem name=orderArticles}]…

1 Like

Ich glaube Jaba arbeitet im Frontend vom Benutzerkonto, daher gibt es edit nicht. Der Edit Modus ist für den Shop Admin.

Jaba Du solltest eine Entscheidung treffen ob Du für Dein Details Template vielleicht einen eigenen Controller definierst - dies für Dich als Einsteiger vielleicht einfacher, so brauchst Du keinen If-Case in der Render Methode um zu unterscheiden in welchen Template Du dich befindest.

Mein Problem: ich schaffe es nicht die einzelnen Order nur aufzurufen und nicht die ganze Order Liste. Hat da einer einen tipp für mich wie ich nur die einzelnen Order aufrufen kann ?

Vorschlag wäre, dass Du für Die Auflistung und für Details zwei Templates verwendest. Ich weiß nun nicht mehr ob Du das Auflistung Template vom Core verwendest und Dich bereits im Detail befindest.

1 Like

Achso Frontend. Wenn er es ändert, gäbe es das schon :wink:
Aber stimmt, Im Frontend wird statt edit dann “order” genutzt. und es wäre order.tpl anzuschauen.

1 Like

Ich hab es jetzt geschafft,
das war mein fehlendes Puzzleteil !!

statt edit nun auf order geändert.

$oxid = $this->_aViewData[“oxid”] = $this->getEditObjectId();

    // load object
    $oOrder = oxnew('oxorder');
    $oOrder->load($oxid);

$this->_aViewData["order"] = $oOrder;

return $this->_sThisTemplate;

ich hatte einen eigen Controller für die Details Seite angelegt in diesem hatte ich auch die Render Methode geändert gehabt, nachdem ich es nun so angepasst habe läuft es endlich.

zusammengefasst: ich übergebe über ein get Formular die OXID , über den Details Controller den ich für mein Template nutze wird die OXID der Bestellung gelesen und im neuen Template dann übergeben ?

Vielen dank an alle für die Geduld mit mir :slight_smile:

2 Likes

Klasse, sehr gut :slight_smile:

1 Like