Orientierung in der Klassenübersicht

Guten Abend,

ich versuche mich gerade ein bischen im Shopaufbau und der zugehörigen Klassenübersicht zu orientieren.

(http://docu.oxid-esales.com/CE/sourcecodedocumentation/4.9.4/)

Soweit ist mit weit mehr unklar als klar. Vielleicht gibts da ein paar Orientierungshilfen.

Zum Beispiel werkelt in der basketcontents.tpl folgender Codeschnipsel:

 $oxcmp_basket->getPrice()

Ich verstehe das so, das von einer Instanz der Klasse [B][I]oxcmp_basket[/I][/B] die Funktion [B]“getPrice”[/B] aufgerufen wird, was ja auch funktioniert. Es wird der Artikel-Gesamtpreis inklusive Mehrwertsteuer zurückgegeben.

in der [B][I]oxcmp_basket Class Reference[/I][/B] gibt es aber keine Funktion namens [B]“getPrice”[/B]. Auch die anderen Funktionen, die real verwendet werden, gibt es in der Klassendokumentation nicht, wie zB. getNettoSum(), hasSkipedDiscount() usw.

In der oxBasket Class Reference dagegen gibt es all diese Funktionen.

Ich verstehe, das die Variable, welche eine ObjektInstanz enthält, nicht so heißen muss wie die Klasse selbst. Allerdings kommen ja die Klassennamen 1:1 in den Smarty-Templates vor, enthalten aber anscheinend objekte von anderen Klassen. Ich konnte auch soweit nicht sehen, wie mit “new …” aus den Klassen die Objektinstanzen erzeugt wurden, so fehlt mir mit meinen zugegebenerweise bescheidenen Kenntnissen, jede Orientierungsmöglichkeit.

Wie erklärt sich das? Wie finde ich heraus, was zusammengehört?

Würde mich über ein Feedback freuen.

Gruß Jürgen

Hallo,

zu Anfang (und auch nach jedem größeren Release) ist OXID in der Tat sehr verwirrend.

Es gilt zunächst weitestgehend das MVC Prinzip:
Templates sind dabei die Views,
Models erkennst du an dem Prefix “ox”, z.b. oxBasket, oxOrder, oxUser, oxConfig.
Controller haben keinen “ox”-Prefix (abgesehen von oxubase, was aber auch kein richtiger controller ist), diese erkennst du aber auch an dem Quellcode

class abc extends [b]oxView / oxUBase / oxAdminView / oxAdminDetails[/b]

Funktionen der Controller werden in Templates jeweils mit $oView->… aufgerufen

dann gibt es widgets, diese sind im Primzip kleine in sich geschloßene controller die ohne das ganze drum herum gerendert werden können und als frame eingebunden oder per ajax nachgeladen etc.
und components (“oxcmp” = “oxid component”)
diese components entsprechen bestimmten models (an dem Namen erkennt man, welchem Model) und sind sowas wie globale Objekte und können überall im Shop aufgerufen und benutzt werden.
z.b. kannst du in jedem Template (abgesehen von email Templates) sowas eingeben

[{$oxcmp_shop->oxshops__oxtitle->value}]

und bekommst den Shop-Namen, der im backend konfiguriert ist. Oder mit $oxcmp_user kannst du auf den aktuellen Benutzer zugreifen (falls nicht angemeldet, dann ist aber fast alles leer).
Im Prinzip ist also oxcmp_basket = oxBasket.

Und die letzten Tiere im OXID Zoo sind oxConfig und oxViewConfig.
zu oxConfig muss man nicht viel sagen, glaube ich, dort ist die Shop-Konfiguration drin.
oxViewConfig ist sowas wie oxConfig nur für die Views. Es ist ebenfalls überall erhalten, wie ein component also, und enthält Konfiguration für die Darstellung in Templates und diverse Funktionen die man überall braucht, aber eigentlich genau so gut in die View hätte packen können…

Der genetisch modifizierte Bruder von “new” in OXID heißt “oxNew”, wobei OXID kürzlich auf Singleton mit einer oxRegistry umgestellt hat.
Du siehst öfters mal sowas wie “oxRegistry::getConfig();” oder "oxRegistry::get(‘oxconfig’);"
in diesem Fall holt sich oxRegistry ein oxConfig Objekt aus dem Cache oder baut ein neues zusammen, falls noch keins vorhanden ist.
getConfig() ist einfach nur ein Shorthand für get(“oxconfig”);

Hoffe, du kannst dich jetzt etwas besser in diesem Dschungel orientieren

1 Like

[QUOTE=vanilla thunder;180533]

Hoffe, du kannst dich jetzt etwas besser in diesem Dschungel orientieren

[/QUOTE]

Hallo vanilla thunder,

auf jeden Fall hat mir Dein ausführlicher Post sehr geholfen! :slight_smile:

Werde mir jetzt mit meiner (dank Deinem Post) “erweiterten Sicht der Dinge” alles noch einmal anschauen und rumprobieren und bin optimistisch ein ganzes Stück weiter zu kommen.

Vielen Dank das Du Deine Zeit geopfert hast.

Viele Grüße

Jürgen

[U][/U]Hallo, das ist ja echt kniffelig:

Warum liefert das einen Wert zurück

[{oxprice price=$oxcmp_basket->getPrice() currency=$currency}]

und das nicht (gleiche Stelle in basketcontents.tpl) :

[{$oxcmp_basket->getPrice()}]

[{$oxcmp_basket->getPrice()|@var_dump}] liefert ein oxPrice objekt zurück, es ist also da
[{$oxprice()|@var_dump}] liefert einen smarty error
[{ $oxPrice()|@debug_print_var }] liefert einen smarty error

Was ist das überhaupt?:

[{oxprice price=$oxcmp_basket->getPrice() currency=$currency}]

Ein Funktionsaufruf wie ich Ihn kenne ist es nicht, der ist aber hinter price= enthalten.
Eine Zuweisung wie ich sie kenne auch nicht, auch nicht nach smarty (assign var= …)

Syntaxbeispiele oder Erklärungen konnte ich auch nicht entdecken. Ehrlich gesagt, weiß ich gar nicht wonach ich noch suchen soll. Gibts vielleicht noch einen tipp?

Ich möchte auf Mehrwersteuersatz sowie [U]Warenkorbsumme [/U] inklusive Nebenleistungen brutto oder Netto zugreifen

[B]oder[/B]

Warenkorbsumme Brutto und Netto an eine Modul beim Aufruf übergeben (das bis jetzt nur “hallo Welt” zurückgibt).

Bislang komme ich nur

a) an die Bruttosumme, [U]die läßt sich so aber nicht an meine Modulfunktion [/U]übergeben
[I][{oxprice price=$oxcmp_basket->getPrice() currency=$currency}][/I]

und b) an

$oxcmp_basket->getMostUsedVatPercent()
Das läßt sich problemlos beim Funktionsaufruf übergeben

wie komme ich an den Wert von [{oxprice price=$oxcmp_basket->getPrice()}] in einer Form, das ich ihn an ein Modul übergeben kann?

alles seltsame, was du in Templates findest, heißt “Smarty” und ist eine Template-Engine
http://www.smarty.net/ (wir haben die Version 2.8.irgendwas unter der Haube)

Smarty hat zwei interessante Dinge anzubieten:
Funktionen

[{ [b]function[/b] param="..."  }]

und Modifikatoren

[{ $variable[b]|modifier[/b] }]

desweiteren hast du natürlich ganz normal die Objekt-Funktionen:

[{ $oObjekt->[b]function()[[/b] }]

OXID hat u.a. die normalen Smarty-Klammern {{ + }} durch [{ + }] ersetzt und einige eigene Funktionen und Modifier hinzugefügt:

[{ oxprice }] ist also eine eigene Smarty Funktion


genau wie [{ oxscript }], [{ oxstyle }], [{ oxgetseourl }] oder [{ oxifcontent }].

Nun zu den Fragen.

[{$oxcmp_basket->getPrice()}]

gibt dir, wie du es schon gesagt hast, ein oxPrice Objekt
Es hat keine Ausgabe im Template, weil Objekte keine Strings sind. Smarty weiß einfach nicht, was es ausgeben soll. Du bekommst allerdings einen entsprechenden Eintrag im Fehler Log.

[{oxprice price=$oxcmp_basket->getPrice() currency=$currency}]

hat eine Ausgabe, weil es eine Funktion ist, die mit einem oxPrice Objekt umgehen kann und sich daraus einen String zum Ausgeben bastelt.

Was das hier sein soll, weiß ich nicht

[{ $oxprice() }]

das hast du dir ausgedacht, sowas gibts nicht, daher auch die Fehlermeldung.

Dein Modul ist ja in PHP geschrieben, oder?
Dann würde ich in dem Modul den aktuellen Benutzer-Warenkorb aus der Session holen und daraus alle benötigten Mehrwertsteuer und Preise ziehen.
irgendwie sowas:

$warenkorb = oxRegistry::getSesstion()->getBasket();

und dann kannst du in der Doku gucken, was du in oxbasket gebrauchen kannst, z.b.
getBruttoSum() oder getNettoSum() oder auch getDelCostVat() etc etc
http://docu.oxid-esales.com/CE/sourcecodedocumentation/4.9.9/classox_basket.html

Hallo,

vielen Dank für Deine Anwort. Du hast mir erneut wertvolle Ansatzpunkte an die Hand gegeben.

Natürlich habe ich mich schon etwas mit Smarty beschäftigt. Mit den speziellen Smarty-Funktionen allerdings noch nicht. Durch die Smarty-Kombinatorik- und verteilte Variablen-Initiliaiierung innerhalb des HTML-Quellcodes, wird das Ganze ziemlich unübersichtlich, finde ich.

>> [{ $oxprice() }] das hast du dir ausgedacht,

Ha ha, höchstens halb. Ich wollte mit var_dump ins Objekt schauen …

Vor 11 Jahren, als ich mich das letzte mal mit PHP und MySQL beschäftigt hatte (ohne Smarty), erschienen mir die Dinge einfacher. :wink: Naja, es hilft nichts, da muss ich wohl durch.

Gibt es vielleicht eine Empfehlung für einen guten Editor mit Syntaxhighlightening?

Z. Zt. benutze ich Notepad++ mal mit PHP- und mal mit einem OXID Syntaxhighlightening aus dem github. Die kommen beide nicht durchgängig mit dem Quellcode der vorhanden Templates klar. Abschnittweise geht es, aber nicht durchgängig.

Wie verhält sich das mit dem Zugriff bei gesetzter “protected” Eigenschaft? Bei mir klappt der Zugriff auf “protected” gesetzte Variablen/ Objekte mal ja mal nein.

Habe in meinem Modul, welches “oxbasket” erweitert, die Sessiondaten wie oben empfohlen geholt.

Auszug aus der Session (aus “->getBasket()”) :

    [_iProductsCnt:protected] => 2
    [_dItemsCnt:protected] => 4
    [[B]_dWeight[/B]:protected] => 0.5
        [_oPrice:protected] => oxPrice Object
        (
            [[B]_dBrutto[/B]:protected] => 36.35
            [_dNetto:protected] => 0
            [_dVat:protected] => 0
            [_aDiscounts:protected] => 
            [_blNetPriceMode:protected] => 
        )

Hier funktioniert der Zugriff

$gewicht = oxRegistry::getSession()->getBasket()->_dWeight;

Und hier nicht (fatal Error wegen “protected”)

$dpreis = oxRegistry::getSession()->getBasket()->_oPrice->_dBrutto;

Gibt es vielleicht noch einen Tipp wie ich daran kommen kann? Das _oPrice Objekt wird in der durch mein modul erweiterten oxbasket mit oxnew erzeugt.

Ich habe im PHP–Manual nachgelesen - verstehe nach der Lektüre allerdings nicht, das ich überhaupt zugreifen kann.

Das erste geht, echt? Wie auch immer, auf protected Eigenschaften sollte man gar nicht direkt zugreifen, sondern die entsprechenden Methoden verwenden.

Hallo Frank,

>> Das erste geht, echt?
Ja, und so langsam fallen bei mir auch die Groschen, hoffe ich.

Das erste gehört zur [B]Eltern[/B]klasse “oxbasket”, und ist -soweit ich das jetzt durchblicke - deshalb im Zugriff. Der zweite Fall versucht direkt an die Eigenschaft eines eingeschachtelten anderen Objektes “oxPrice” zu kommen, und klappt wohl deshalb nicht.

>> auf protected Eigenschaften sollte man gar nicht direkt zugreifen, sondern die entsprechenden Methoden verwenden.

Das ist es :-), danke. Solange es die entsprechenden Methoden gibt, wäre das wohl auch schon aus Kompatibltätsgründen der Pfad der Tugend.

Interessant fand ich, das verschiedene Klassen über Methoden des gleichen Namens verfügen, die jedoch unterschiedliche Dinge tun. So liefert die Methode “getprice” der Elternklasse “oxbasket” ein “oxPrice” Objekt zureck.

Die Methode “getprice” des oxPrice Objektes liefert dagegen die Warenkorbsumme inkl. saemtl. Nebenleistungen als Zahlzurueck, je nach eingestelltem Brutto- oder Netto-Modus als Brutto- oder Nettosumme.

Eine Gute Sache, nur etwas mühsam herauszufinden.

Gruß Jürgen