Mitteilungsfeld in der Bestellung - getorderRemark

Nabend,

in der Bestellung ist es ja möglich, ein Mitteilungsfeld auszufüllen.
Da es im B2B-Bereich teilweise notwendig ist, dass der Kunde eine eigene Bestellnummer mit auf der Rechnung haben will, möchte ich diese Eingabe über ein extra Feld erreichen.

Durch meinen anderen Thread konnte ich nun mein Feld oxcustordnum einwandfrei in die Bestellübersicht im Backend und in der “Meine Bestellungen”-Seite unterbringen.

Jedoch das füllen macht mir sorge.
In form/fieldset/order_remark.tpl steckt der code, in der das Mitteilungsfeld gefüllt wird.

[{if $blOrderRemark}]
    [{oxscript include="js/widgets/oxinnerlabel.js" priority=10 }]
    [{oxscript add="$( '#orderRemark' ).oxInnerLabel();"}]
    <li>
        <label>[{ oxmultilang ident="FORM_FIELDSET_USER_YOURMESSAGE" }]</label>
        <label for="orderRemark" class="innerLabel textArea">[{ oxmultilang ident="FORM_FIELDSET_USER_MESSAGEHERE" }]</label>
        <textarea id="orderRemark" cols="60" rows="7" name="order_remark" class="areabox" >[{$oView->getOrderRemark()}]</textarea>
    </li>

[{/if}]

Ich komm mit dem getOrderRemark noch nicht ganz klar.
Anscheinend wird hiermit der Wert in den View zurückgeschrieben (oder so ähnlich).

Ich bräuchte also ein getCustordNum. Hab das ganze mal so probiert, es funktioniert aber nicht.

Kann mir jemand entsprechende Stelle mal erläutern?

Gruß und Danke!

PS: Wir planen gewisse Teile, die wir anpassen um eine B2B-Funktionalität zu ermöglichen (z.B. angepasste Rechnungen) auch hier zur Verfügung zu stellen. Wie stellen wir das am besten an?

[QUOTE=timh;114123]…auch hier zur Verfügung zu stellen. Wie stellen wir das am besten an?[/QUOTE]

als Nicht-Programmierer kann ich Dir beim Grundproblem nicht wirklich helfen - aber die Ergebnisse kannst Du dann entweder als Modul im eXchange anbieten, den Code aber auch auf [Github](http://wiki.oxidforge.org/Tutorials/de)stellen oder diverse Snippets im Wikiverewigen

[QUOTE=Hebsacker;114124]als Nicht-Programmierer kann ich Dir beim Grundproblem nicht wirklich helfen - aber die Ergebnisse kannst Du dann entweder als Modul im eXchange anbieten, den Code aber auch auf [Github](http://wiki.oxidforge.org/Tutorials/de)stellen oder diverse Snippets im Wikiverewigen[/QUOTE]

Danke Hebsacker! Hätten wir das schonmal geklärt :wink:

Nur wie ich mein Zusatzfeld aus der oxorder mit den Daten der Benutzereingabe fülle (soll an der gleichen Stelle wie das Mitteilungsfeld plaziert werden) habe ich leider noch nicht in Erfahrung gebracht.

Aheu,

ich stehe vor einem ähnlichen Problem, da ich auch ein zweites Eingabefeld benötige und zwar für eine Mitteilung, die der Kunde dem Zustellfahrer mitgeben will (z.B. “in den Hinterhof, durch die goldene Tür, dann links rum, 4 Treppen hoch, einen Regentanz aufführen und dann bei Meier klingeln”).

Die Spalte OXREMARKS habe ich in der Tabelle oxorders dupliziert und OXDELIVERYMESSAGE genannt, die Klassen User, oxorder und order erweitert und alles was in den Originalklassen mit der orderRemarks zu tun hat mit entsprechen geänderten Variablennamen in die erweiterten Klassen übernommen.

Den Block user_checkout_shipping_feedback aus ‘user_checkout_change’ per Modul überschrieben und ein weiteres Feld angezeigt. Das sieht dann so aus


<ul class="form">
    <li>
        [{include file="form/fieldset/order_newsletter.tpl" blSubscribeNews=true}]
        [{include file="form/fieldset/order_remark.tpl" blOrderRemark=true}]
    </li>
    <li>
       [{oxscript add="$( '#deliveryMessage' ).oxInnerLabel();"}]
        <label>[{ oxmultilang ident="FORM_FIELDSET_USER_DELIVERYMESSAGE" }]</label>
        <label for="deliveryMessage" class="innerLabel textArea">[{ oxmultilang ident="FORM_FIELDSET_USER_DELIVERYMESSAGEHERE" }]</label>
        <textarea id="deliveryMessage" cols="60" rows="7" name="delivery_message" class="areabox" >[{$oView->getDeliveryMessage()}]</textarea>
    </li>
</ul>

Leider scheint das was eingegeben wurde bei mir noch nicht bis zur Zusammenfassung der Bestellung durchgereicht zu werden.
Ein abgewandeltes

$oView->getOrderRemark() welches in der erweiterten order-Klasse steckt bringt mir jedenfalls keine Ausgabe.

Ich bin noch am tüfteln. Eventuell magst Du ja Deine Arbeit im Backend auch teilen. Da hab ich nämlich bisher noch nichts.

Viele Grüße,
Kalle

Du traust dem Postboten ja viel zu :smiley:
Ich vermute, dass der Fehler im Namen deiner textarea ist. Jedenfalls holst du in der php klasse den Wert über den Namen.

Hi VeganWonderland,

bei uns hat mein Kollege das Problem so gelöst (und ganz so easy ist es dann doch nicht):

Ich zitiere mal aus unserer internen Doku (Autor: F.Kröger)

"Der Kunde soll die Möglichkeit haben, seine eigene Bestellnummer nicht über das Mitteilungsfeld eingeben zu müssen, sondern es soll ein eigenes Feld geben, in welches der Kunde im Bestellvorgang seine Bestellnummer eingeben kann.

1.1 Das Feld im Frontend
In oxid/out/swd/tpl/form/fieldset liegt die Datei “order_remark.tpl”. Diese ist für die Anzeige des Mitteilungsfeldes verantwortlich. Hier wurde ein Inputfield mit dem Namen “custordnum” hinzugefügt.

1.1.1 Übergabe des eingegebenen Wertes
Zu diesem Zeitpunkt, also im Bestellprozess nach eingeben der Bestellnummer, kann diese noch nicht in der Datenbank gespeichert werden, da die restlichen Werte der Bestellung erst beim Absenden der Bestellung eingetragen werden. Die Eingabe wird per POST Formular auf die nächste Seite, “Versand & Zahlungsart”, übergeben. Damit diese bis zum letzten Schritt erhalten wird, muss diese in der Session gespeichert werden. Dafür muss die Datei “oxcmp_user.php” in oxid/views angepasst werden. Mit oxConfig::getParameter() wird die per POST übergebene Eingabe abgefragt und mit oxSession:setVar() in der Session gespeichert, ist also bis zum Abschicken der Bestellung (dort wird sie aus der Session gelöscht) verfügbar.

1.1.2 Schreiben in die Datenbank
Beim Abschicken der Bestellung muss die Bestellnummer noch in die Tabelle oxorder, in das Feld oxcustordnum, geschrieben werden. Die Datei, die dafür zuständig ist, ist “oxorder.php”, welche in oxid/core liegt. Hier muss nun der Objektreferenz die Eigenschaft oxorder__oxcustordnum hinzugefügt werden und dieser muss mit oxSession::getVar() die Bestellnummer zugewiesen werden. Das Speichern in der Datenbank wird dann am Ende per save() Funktion durchgeführt. Dabei werden alle Eigenschaften nach dem Schema tabelle__feld der Objektreferenz in die Datenbank geschrieben."

Hilft dir das vll. weiter?

Aheu,

sehr schön geschrieben und fasst meine Arbeit bzw. Versuche der letzten 6 Stunden schön zusammen :wink:
Ich habe kurz nach meinem Posting selbst schon rausgefunden, dass mir noch die Erweiterung von oxcmp_user gefehlt hat. Ich kann mir auch auf der Abschlusseite die eingegebenen Werte anzeigen lassen. Sie sind also da,
Nur werden sie bei mir bisher noch nicht in die Datenbank geschrieben.

Meine oxorder_ext.php sieht folgendermaßen aus:


<?php
class oxorder_ext extends oxorder_ext_parent
{
    
public function finalizeOrder( oxBasket $oBasket, $oUser, $lbRecalculatingOrder = false )
    {
    
    // deleting deliveryMessage only when order is finished
    oxSession::deleteVar( 'delmsg' );
        
    return parent::finalizeOrder( $oBasket, $oUser, $lbRecalculatingOrder );
  }
    
protected function _loadFromBasket( oxBasket $oBasket )
    {
        // delivery message
        if ( !isset( $this->oxorder__oxdeliverymessage ) || $this->oxorder__oxdeliverymessage->value === null ) {
            $this->oxorder__oxdeliverymessage = new oxField(oxSession::getVar( 'delmsg' ), oxField::T_RAW);
        }
        return parent::_loadFromBasket( $oBasket );
    }  
  
}
?>

So wie ich das sehe wird in der originals oxorder Klasse in der _loadBasket Funktion der OrderRemark in die Datenbank geschrieben, also habe ich mir den Teil genommen und geändert. Es klappt nur noch nicht :frowning:

Viele Grüße,
Kalle

D’oh! - Ich glaub ich seh den Fehler. Ich lösche die Variable schon bevor finalizeOrder sie speichert.
Kann ich denn den Code aus der eigentlichen finalizeOrder ausführen und danach dann noch die Session Variable löschen?

Ich hab bisher keine wirkliche Erfahrung mit dem Überladen von Funktionen. Das ist zur Zeit alles Trial and Error.

EDIT: Es geht, ich weiss nur nicht ob das den Konventionen entspricht. Hab das jetzt so gelöst:


public function finalizeOrder( oxBasket $oBasket, $oUser, $lbRecalculatingOrder = false )
    {
    
        $retVal = parent::finalizeOrder( $oBasket, $oUser, $lbRecalculatingOrder );
        // deleting deliveryMessage only when order is finished
        oxSession::deleteVar( 'delmsg' );
        return $retval;
    }

Damit habe ich meinen zweiten Kommentar in der Datenbank. Jetzt fehlt noch die Anzeige im Backend. Aber das kann bis morgen warten.

Gute Nacht,
Kalle

[QUOTE=VeganWonderland;115987]

Damit habe ich meinen zweiten Kommentar in der Datenbank. Jetzt fehlt noch die Anzeige im Backend. Aber das kann bis morgen warten.

Gute Nacht,
Kalle[/QUOTE]

Hast hinbekommen? Die Anzeige im Backend ist ja relativ easy.
Einfach den Code für ein bestehendes Feld kopieren und auf das eigene ummünzen.

Gruß TimH