Manuelles Erstellen einer Selectbox

Hallo zusammen,

ich benötige im Warenkorb eine Selectbox, welche ich mit einer Schleife befüllen will.
Ich habe mich am Code für die Auswahllisten in der Datei productmain.tpl orientiert.
Hier erfolgt das Befüllen der Selectbox mithilfe des Templates widget/product/selectbox.tpl unter Verwendung des Objekts oxList.

Kann mir jemand auf die Sprünge helfen, wie ich manuell ein oxList-Objekt innerhalb einer Schleife befüllen kann?
Der Plan ist, dass befüllte oxList-Objekt an die selectbox.tpl zu übergeben.
Ich konnte über die Suche leider kein passendes Code-Beispiel finden, was mich ein wenig stuzig macht.
Ist das der richtige Ansatz oder bin ich auf dem Holzweg?

Viele Grüße und besten Dank!

Sollte es sich um eine Selectbox pro Warenkorbposition handeln, wäre es auch das Einfachste eine Auswahlliste zu verwenden, da hier die Informationen ja auch in der Bestellung mit gespeichert werden. Wenn du das nicht willst musst du auf jeden Fall ein eigenes Modul erstellen und die Informationen dann z. B. an den persparams der jeweiligen Position speichern.

Bezieht sich die Auswahlliste auf den gesamten Warenkorb kannst du dir zum Einen manuell eine Liste hartkodiert im Template erstellen oder mit einem eigenem Modul oxList verwenden. Vermutlich sollte die Auswahl auch mit in die Bestellung übernommen werden, d. h. du musst dir hierfür auch noch was überlegen.

Danke für die Antwort.

Ich benötige tatsächlich eine Auswahlliste pro Warenkorbposition.
Allerdings soll diese Auswahlliste nur für Produkte einer bestimmten Kategorie erscheinen.

Hintergrund ist der Umstand, das bestimmte Produkte einer Kategorie mit anderen Produkten montiert werden können.
Diese sollen dann in einer Auswahlliste erscheinen.
Aus diesem Grunde kann ich die statischen Auswahllisten nicht verwenden, sondern muss die Auswahlliste dynamisch, in Abhängigkeit der Produkte, die der Kunde in den Warenkorb gelegt hat, erzeugen.

Die Informationen sind alle in dem Objekt basketitemlist vorhanden.
Ich weiß nur nicht, wie ich diese über eine Schleife in eine Auswahlliste überführt bekomme.

Ich habe diesen Ansatz jetzt erst einmal verworfen.
Es ist mir nicht gelungen, ein oxList-Objekt manuell zu erstellen.

Ich orientiere mich jetzt an der Umsetzung der salutation.tpl und werde morgen weiter tüfteln.

OK

Super :wink:

Kannst du ja vielleicht (ggf. stichpunktartig) hier dann zur Verfügung stellen.

Das manuelle Erstellen von Selectboxen in einer Warenkorbposition funktioniert inzwischen.
Ich habe hierzu in der Datei basketcontents_table.tpl die folgende Zeile hinzugefügt:

[{include file="form/fieldset/montage.tpl" name="aproducts[$basketindex][persparam][details]" value=$oxcmp_basket->getContents()}]

Mit einem If-Statement kann man die Anzeige der Selectbox auf bestimmte Kategorien beschränken.

Die Datei montage.tpl enthält zwei Selectboxen (eine statische und eine dynamische) und befindet sich auszugsweise im Anhang.

Ich habe jetzt noch ein Problem beim Speichern der Selectboxen mithilfe von Persparam.
Wenn ich nur eine Selectbox einsetze funktioniert die Übergabe und der ausgewählte Wert wird in der DB gespeichert.
Bei zwei Selectboxen wird nur der letzte Wert in die DB geschrieben, da der value-Parameter im option-Tag durch die zweite Selectbox wieder überschrieben wird und dem aufrufenedem name="aproducts[$basketindex][persparam][details]" übergeben wird.

Mithilfe von jQuery innerhalb der Datei montage.tpl kann ich die ausgewählten Werte aus den beiden Selectboxen in einem Array speichern.
Wie bekomme ich nun den Inhalt des Arrays an persparam übergeben?

Viele Grüße!

Tipp wegen des Überschreibens:
aproducts[[{ $basketindex }]][persparam][[{ $name }]]

jQuery: D.h. die Werte sollen ohne den Button “Aktualisieren” direkt bei Auswahl in den Warenkorb geschrieben werden? Dann musst per Ajax changebasket starten.

Wo liegt denn hier der Vorteil?
Den Part name="aproducts[$basketindex][persparam][details]" habe ich aus der Datei basketcontents_table.tpl übernommen. Ich bin mir aber nicht sicher, was es mit [details] auf sich hat.

Ich habe auch nach wie vor ein Problem beim Speichern der Daten über Persparam.
Wenn ich in meiner tpl-Datei [{$basketitem->setPersParams("TEST")}] verwende, wird der String “TEST” in die DB in die richtige Warenkorbposition geschrieben. Also genau so wie ich es gerne hätte.
Jetzt will ich ja die Auswahl der beiden Selectboxen in Persparam speichern. Die Auswahl habe ich in einer jQuery-Variable gespeichert.
Um die jQuery-Variable an [{$basketitem->setPersParams(JQUERYVARIABLE)}] übergeben zu können, benötige ich wiederum Ajax, richtig?

Kann ich überhaupt eine jQuery-Variable über Ajax an eine tpl-Datei übergeben oder klappt die Übergabe nur bei php-Dateien? Die Übergabe an eine tpl-Datei wird mit einem “403 Forbidden” abgelehnt.

PHP-Code und somit auch die Auflösung der Smarty-Tags laufen auf dem Server und sind für JQuery überhaupt nicht erreichbar. Das JQuery läuft im Browser und sieht nur die fertig gerenderte HTML-Seite.

Um eine JQuery-Variable (d.h. ein DOM-Objekt) an den Server zu übertragen, kannst du ein hidden input-Feld befüllen und submitten oder einen direkten Ajax-Aufruf an den Server absetzen, sofern dieser die passende Schnittstelle zur Verfügung stellt.

Ist der Ansatz mit dem hidden Input-Field unkritisch oder ergeben sich hierdurch zusätzliche Angriffsvektoren?

Ich konnte bereits erfolgreich einen Ajax-Aufruf durchführen. Hierzu habe ich eine neue php-Datei angelegt. Hier habe ich allerdings das Problem, dass ich innerhalb der neuen PHP-Datei keinen Zugriff auf das Objekt $basketitem habe.
Wie kann ich das Objekt in der neuen php-Datei bekannt machen? Der Zugriff wird benötigt, um die Methode setPersParam anzusprechen.

So übergibst du die Werte spezifisch und kannst sie mit z.B. “$aPersParam[‘name1’]” etc. abrufen.

Wie kann ich das Objekt in der neuen php-Datei bekannt machen?

Grundsätzlich müsstest du dazu die bootstrap.php aus dem shoproot inkludieren. Ich halte das aber nicht für das optimale Vorgehen in diesem Fall.

Das hidden input-Feld übergeben sollte kein Problem sein, da OXID da ja von Haus aus sowieso macht. Du würdest nur ein weiteres Feld hinzufügen.

Ok, Danke.
Ich hatte hierzu auch folgenden Thread gefunden.
https://forum.oxid-esales.com/t/eigene-persparams-ohne-persparam-details-moglich
Ich hatte auch mal einen anderen Namen als [details] verwendet. Das hatte aber nicht funktioniert. Ich werde aber noch mal genauer testen. :slight_smile:

In der neuen php-Datei fehlt mir konkret das oxBasketItem-Objekt. Ich dachte, man kann über das Input-Field nur einen String weiterreichen. Klappt das auch mit einem Objekt?

Ich komme gerade irgendwie nicht weiter.
Ich versuche daher mein bisheriges Vorgehen noch mal stichpunktartig aufzuführen. Vielleicht habe ich ja noch einen grundsätzlichen Fehler beim Vorgehen.
Ziel ist es, in einer Warenkorbposition zwei Selectboxen anzuzeigen und die Auswahl mit der Bestellung in der Warenkorbposition abzuspeichern.

  1. Einbindung einer zusätzlichen tpl-Datei in basketcontents_table.tpl --> Erledigt

  2. Definition von zwei Selectboxen in der neuen tpl-Datei --> Erledigt

  3. Da die Auswahl der Selectboxen clientseitig stattfindet, habe ich die Auswahl der beiden Selectboxen mit jQuery in einer Variablen konkateniert. --> Erledigt

  4. Die jQuery-Variable muss ich nun wieder an PHP übergeben, um diese mithilfe der Methode setPersParam der Klasse oxbasketitem in die DB zu schreiben.
    Hier gibt es zwei Möglichkeiten für die Übergabe an PHP: Ajax oder ein hidden Input-Field. --> klappt noch nicht

Ajax
Die Übergabe der jQuery-Variable an eine neue php-Datei mittels Ajax klappt prinzipiell. Ich habe hier allerdings das Problem, dass ich innerhalb der neuen php-Datei keinen Zugriff auf das oxbasketitem-Objekt habe, um den Inhalt mittels PersParam in die DB zu schreiben.

hidden Input-Field
Hier habe ich das gleiche Problem. Das hidden Input-Field befindet sich innerhalb einer Form. Bei Betätigung eines Submit-Buttons übergebe ich den Inhalt des hidden Input-Fields an eine neue php-Datei. In der neuen php-Datei habe ich ebenfalls keinen Zugriff auf das oxbasketitem-Objekt.

In der neuen php-Datei habe ich daher die bootstrap.php eingebunden. Jetzt bin ich in der Lage auf alle Oxid-Objekte zuzugreifen. Allerdings handelt es sich dann um neue Objekte, wenn ich z.B. mit oxNew einen neues oxBasketItem-Objekt erzeuge. Ich bräuchte allerdings Zugriff auf das alte oxBasketItem-Objekt, um den Inhalt abspeichern zu können.

Kann hier jemand einen Fehler im Ablauf erkennen?

Du musst das halt alles nachbauen, einfach bootstrap.php einbinden reicht da nicht, da wäre besser einen eigenen Controller zuschreiben den du mit dem Parameter “cl” aufrufen kannst (Ziel ist immer index.php), und darin eine Methode zu schreiben, die du mit dem Parameter “fnc” aufrufen kannst, darin kannst du dir den Warenkorb holen und alle Elemente durchgehen, bis du deins gefunden hast, anhand eines weiteren übergebenen Parameters.

Einfacher wäre es kein Ajax zu verwenden sondern das Formular zu verwenden was es schon gibt (Warenkorb aktualisieren), dieses bei Auswahl zu submitten (Seite wird neu geladen) und die Daten in entsprechende Persparam-Felder zu schreiben, die Verarbeitung übernimmt dann Oxid und du musst überhaupt nichts selber verarbeiten.

aproducts[$basketindex][persparam][details] hier ist “details” der Persparam-Name, du kannst aber noch andere Persparams verwenden

aproducts[$basketindex][persparam][param2]

Da kann man beliebig viele verwenden, der “details” ist allerdings notwendig, ohne den geht’s nicht.

Danke für Deine Rückmeldung Leofonic. Du hast mich mit Deinem aproducts-Hinweis auf die richtige Spur gebracht.

Es ist mir jetzt gelungen die Auswahl über Persparam zu speichern, wenn der Aktualisieren-Button im Warenkorb betätigt wird.
Die Lösung war ganz einfach. Ohne Ajax und hidden input field.

Die Selectboxen sehen jetzt wie folgt aus (siehe Anhang, das Posten von HTML-Code wird leider blockiert).
Die Auswahl der Selectboxen werden beide in das Feld PersParam geschrieben.

Beim automatisierten Aktualisieren des Warenkorbes nach erfolgter Auswahl eines Selectbox-Wertes habe ich hingegen noch ein Problem. Es müsste sich ja um den Aufruf der Funktion changebasket handeln oder?
Leider bekomme ich den Aufruf einer PHP-Funktion über jQuery nicht hin.

$('select').on('change', function () {
   //Aufruf der Funktion changebasket
})

Weiß jemand wie der Aufruf aussehen könnte?