Bestelldetails für Gast

Guten Tag liebe Oxid gemeinde.
Ich hätte da eine frage,
wir wollen in unserem Shop dem Kunden der als Gast bestellt die Möglichkeit geben über einen Link , sich seine Bestellung auf einer Bestelldetailseite 30 Tage lang einzusehen.

Ich habe versucht die Detailseite die ein eingeloggter Kunde zu sehen bekommt einfach in einem neuen template inklusive dazugehörigem Controller zu kopieren und diese dann über den Link aufzurufen.
(account_bill_details.tpl kopiert und umbenannt in account_bill_details_guest.tpl)

Dies Funktioniert auch alles, über einen Link kann ich die Seite ohne Eingeloggt zu sein aufrufen mit der Meldung “The order history is empty.”
Was natürlich Logisch ist da in der getOrderList() ja vorher der getUser() abgefragt wird.

Meine Frage, wie kann ich trotzdem die Bestellung Anzeigen und somit die abfrage mit dem getUser() überspringen in der getOrderList() ?

public function getOrderList()

    {
        if ($this->_aOrderList === null) {
            $this->_aOrderList = array();

            // Load user Orderlist
            if ($oUser = $this->getUser()) {
                $iNrofCatArticles = (int) $this->getConfig()->getConfigParam('iNrofCatArticles');
                $iNrofCatArticles = $iNrofCatArticles ? $iNrofCatArticles : 1;
                $this->_iAllArtCnt = $oUser->getOrderCount();
                if ($this->_iAllArtCnt && $this->_iAllArtCnt > 0) {
                    $this->_aOrderList = $oUser->getOrders($iNrofCatArticles, $this->getActPage());
                    $this->_iCntPages = round($this->_iAllArtCnt / $iNrofCatArticles + 0.49);
                }
            }
        }

        return $this->_aOrderList;
    }

Hätte da jemand einen kleinen Denkanstoß für mich?

Ich bin im Moment noch Azubi und absolviere hier mein Praktikum. Ich arbeite mich daher in kleineren schritte voran, habt daher bitte etwas nachsehen mit mir :slight_smile:

Vorschlag: Verwende eine eigene Funktion, um direkt auf die Bestellung zuzugreifen und nicht über eine Order-Liste.
Erweitere deinen Controller um eine Funktion, die die Bestellung lädt und an das Template weitergibt.

public function getOrder() {
$sOrderId = ... // Hier Order-Id aus Url auslesen
$oOrder = oxNew('oxOrder');
$oOrder->load($sOrderId);
$this->_aViewData['oOrder'] = $oOrder;
}

Auf jeden Fall hast du dann im Template ein oxOrder-Objekt verfügbar, aus dem du die gewünschten Infos auslesen kannst. Und in der Funktion kannst du auch prüfen, ob die Bestellung bereits älter als 30 Tage ist.
Das solltest du natürlich noch ein wenig absichern (durch einen zusätzlichen Hash oder sowas, der aus der Id generiert wird), damit nicht irgendwelche Leute die Bestellungen abrufen können.

Nach vielem hin und her hat es dann doch so geklappt, vielen dank für die Hilfe

1 Like

Ich bin wohl doch nicht ganz Fertig, ich versuche nun über die Url noch das alles zu verschleiern. Mein Chef meinte ich soll es mit der .htaccess versuchen.

leider bisher ohne erfolg. wie bekomme ich aus

localshop. de:7443/index.php?cl=shop_account_extend_bill_details_guest&oxid=c6749a47e28f3a784e2c8a1eb00afcf9

localshop. de:7443/youOrder=c6749a47e28f3a784e2c8a1eb00afcf9

in der .htaccess habe ich folgendes geschrieben:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{QUERY_STRING} ^cl=shop\_account\_extend\_bill\_details\_guest&oxid=c6749a47e28f3a784e2c8a1eb00afcf9$
RewriteCond %{REQUEST_URI} ^\/index\.php$
RewriteRule .* https://localshop.de:7443/youOrder=c6749a47e28f3a784e2c8a1eb00afcf9? [R=301,L]
</IfModule>

ich bekomme dabei den Error 404

Hi Jaba :slight_smile:

Ja, das ist zu erwarten weil youOrder=c6749a47e28f3a784e2c8a1eb00afcf9 ist in der Tabelle oxseo nicht bekannt und kann nicht aufgelöst werden.

Du müsstest im Prinzip für jede Gast-Bestellung einen Eintrag in der oxseo Tabelle anlegen.

Viele liebe Grüße aus dem Harz,
Tim

ps. Ist Prüfungsphase bereits rum?

1 Like

einfacher geht es wenn man in der functions.php im Verzeichnis modules eine Abfrage nach einem übergebenen Parameter macht und entsprechend umleitet
PS: dort kannst du dann auch die 30 Tage Frist (aus Beitrag #1) programmieren

2 Likes

Hallo liebe Community, ich muss das nochmal aufgreifen das Thema. Wir wollen dem Kunden ermöglichen bei eingabe seiner e-mail und seiner Ordernr auf seine Gastbestellung einzusehen ( ist nur für 30 tage gültig) dabei stoße ich auf einige Probleme.

Mein Problem
wenn ich in das Suchfeld die gewünschte Order Nr mit entsprechender E-Mail eingebe dann bekomme ich die meldung “The order history is empty” und wenn ich das selbe beim 2. mal suche dann wird erst die Bestellung angezeigt.

image

so sieht die suche dafür aus ich muss das 2x ausfüllen wenn ich jeweil an die Bestellung will.

public function getoxtrckID()
    {
        $sEMail = oxRegistry::getConfig()->getRequestParameter('email_track', true);
        $sONumber = oxRegistry::getConfig()->getRequestParameter('ordernr_track', true);
        $sArticleId = oxDb::getDb()->getOne("SELECT OXID FROM oxorder WHERE OXORDERNR = ? AND OXBILLEMAIL = ?", [$sONumber, $sEMail]);
        return $sArticleId;
    }

meine Funktion dafür

bei der 30 Tage anzeige geschieht übrigens das selbe erst nach dem refresh der page wird die Bestellung nciht mehr angezeigt

das teste ich im template einfach nur so
[{if $smarty.now|date_format:’%Y-%m-%d’ <= $order->guestTime() || $isLoggedIn != false }]

wenn dies nicht gegeben ist oder 30 tage rum sind dann soll eine entsprechende seite angezeigt werden mit hinweis 30 tage rum . klappt erst aber nach dem refresh der page

Mein 2. Problem, ich kann auf meine Funktion nicht von überall zugreifen. Ich wollte die oxview erweitern in einem modul und dort meine obige funktion benutzen um auf jeder seite sicherzustellen das dies angezeigt wird. Aber ich habe nun vorhin hier im Forum gelesen man könnte die oxview nich erweitern ?

Hätte jemand für mich einen Lösungsansatz parat ?

Danke schonmal im vorraus :slight_smile:

Dann hast sicher ein Form-Problem.

oxviewconfig oder vorzugsweise eine Komponente (oxcmp_user) erweitern. Oder die Funktion aus dem Controller aufrufen.

1 Like

Danke für die Hilfe, leider klappt das nicht so. Hatte es versucht in der Core oxcmp_user und auch in der von uns überschriebenen, sowie in der oxviewconfig (unsere und core)

nur bei der oxview klappt es wunderbar. Auf allen seiten jetzt meine funktion einzeln zu linken kann ja auch nicht die lösung sein :confused:

im Log steht dann auch jeweils nur für jede entsprechende seite dann

oxSystemComponentException-oxException (time: 2020-05-07 14:35:21): [0]: Function ‘getoxtrckID’ does not exist or is not accessible! oxSystemComponentException-oxException (time: 2020-05-07 14:35:21): [0]: Function ‘getoxtrckID’ does not exist or is not accessible! (…)

bzw. in der oxsupercfg selbst gehts auch da die oxview ja die oxsupercfg extended, wäre diese erweiterbar ?

ich habe meine Lösung für das 2. Problem, kam durch folgenden beitrag darauf : Erweiterung von oxView schlägt mit Weiterleitung fehl

in der Form habe ich die suche mit [{$oView->getoxtrckID()}] statt mit [{$oViewConf->getoxtrckID()}] aufgerufen

:man_facepalming:

1 Like

Also wie oben geschrieben :wink: Die Erweiterung funktionert auch bei oxcmp_user, allerdings nur im eingeloggten Zustand, deshalb wäre vorher immer abzufragen [{if $oxcmp_user}] ... [{/if}]

Hallo rubbercut, Danke für die Antwort ich bin beim durchstöbern meiner alten Fragen hier im Forum nur nochmal darauf gekommen und habe meine unsinnigen letzen beitrag hierzu gelöscht ^^

Ich hatte das dann damals folgendermaßen gelößt:

Diese Funktion im Controller :

public function isLoggedin() {
    if ($this->isLoggedIn === null) {
        $this->isLoggedIn = $this->getUser() ? true : false;
    }
    return $this->isLoggedIn;
}

und dann im template einfach nur
[{assign var="isLoggedIn" value=$oView->isLoggedin()}]

  [{if  $isLoggedIn != false }]

so Funktioniert es dann,
es geht bestimmt auch einfacher aber ich baue ja meist drum herum das kommt bestimmt noch mit der Zeit und der Erfahrung ,
jedenfalls Danke :slight_smile:

Yepp: statt

[{if $isLoggedIn != false }]

[{if $oxcmp_user}]

1 Like