Mehrere Checkboxen implode/explode

#1

Hallo zusammen,

ich würde gerne mittels mehreren Checkboxen über Sprachidents Werte in eine DB-Spalte schreiben.
… value="[{oxmultilang ident=‘MYFIELDTOP’}]" …

Mit PHP funktioniert dass über implode, aber wie bewerkstellige ich es in Oxid? PHP im Template ist ja keine Lösung bzw. keine gute oder?

Im Zuge dessen, ich bekomme einen Fehler bei der Abfrage ob der Wert in der Spalte steht, wenn ich folgenden Code verwende:

[{if $edit->oxuser__myfieldtop->value == “[{oxmultilang ident=‘MYFIELDTOP’}]”}]checked[{/if}]

Gibt es da noch einen anderen Weg?

Vielen Dank schon mal!

#2

Ho!

der weg über Templates ist im Moment noch der Einzige. Du könntest höchstens die Checkboxen vorrendern was aber etwas umständlich wäre. Die Checkboxen können grundsätzlich sonst auch mit [{foreach}] erzeugt werden. Was die ganze Sache etwas weniger unangenehm aussehen lässt.

Nur ein Hinweis von mir: Sprachindents würde ich nur empfehlen, wenn es nicht anders geht. In der Datenbank sollten die Daten so roh wie möglich stehen und bei der Verwertung können die dann übersetzt werden.

#3

Was genau?

[{if $edit->oxuser__myfieldtop->value == "MYFIELDTOP"|oxmultilangassign}]checked[{/if}]
#4

Mehrere Checkboxen (ca 10-15) in eine DB-Spalte unter oxuser kommagetrennt zu speichern.

#5

Du kannst die Checkboxen als array übergeben und im Controller die save-Methode überschreiben und den array in kommasepariert wandeln.

#6

Genau da liegt das Problem… vielleicht denk ich auch zu kompliziert…

Mit PHP ist es kein Problem:

$ checks = implode(’,’, $_POST[‘usercheck’]);
$ statement = $pdo->prepare(“REPLACE INTO table (spalte) VALUES (?)”);
$ statement->execute(array($checks));

… type=“checkbox” name=“usercheck[]” value=“mein1Wert” …
… type=“checkbox” name=“usercheck[]” value=“mein2Wert” …

Wie ich dass nun korrekt in die save Function von Oxid bekomme ist mir noch ein Rätsel.

#7

Weißt du wie man Module erstellt?

#8

Grundsätzlich sag ich jetzt mal ja :slight_smile:

#9

OK dann schau dir im Controller, ich nehme mal an UserMain, die save-Methode an. Da werden zuerst aus dem POST-Request die Daten geholt:

$aParams = \OxidEsales\Eshop\Core\Registry::getConfig()->getRequestParameter("editval");

Dann werden diese dem Objekt zugeordnet:

$oUser->assign($aParams);

Und dann wird das Objekt gespeichert:

$oUser->save();

und die ID gesetzt:

$this->setEditObjectId($oUser->getId());

Wenn du da eigene Daten drinhaben willst, die aber erst bearbeitet werden müssen (implode), dann könntest du genau diese Schritte in deinem Modul auch machen. Also erst werden deine Änderungen gespeichert (aus den Checkboxen), danach wird die parent-Methode aufgerufen und das Objekt wird nochmal gespeichert, mit den Standard-Daten.

Eine andere Möglichkeit wäre, in deinem Modul direkt den POST-Array zu manipulieren und dann die parent-Methode aufzurufen. Oder ein eigenes Tab für deine Änderungen zu machen mit einem eigenen Controller.

#10

Hallo leofonic,

habe jetzt jede Menge Möglichkeiten ausprobiert, bekomme aktuell allerdings nur “Array” übergeben.
Habe mir ein eigenen RequestParameter erstellt.
$blMyVariable = \OxidEsales\Eshop\Core\Registry::getConfig()->getRequestParameter("editmyreq");

$oUser->assign($blMyVariable);

Mit print_r werden mir alle Werte im Array ausgegeben. In der Datenbank steht allerdings nur das Wort Array.

#11

https://www.php.net/manual/de/function.explode.php

#12

Hi rubbercut,

du meinst wohl eher implode. Wenn ich $blMyVariable mit implode in Komma unterteilen will, bekomme ich mit print_r auch nur Array angezeigt.

#13

Implode liefert einen String, keinen Array.

#14

Jo mit implode und var_dump bei mir string(5) "Array"
und ohne implode array(1) {["oxuser__interessen"]=> array(21) {[0]=> string(0) "" [1]=> string.... usw

#15

Nö, das war schon so geplant :sweat_smile: Ja, falschen Link kopiert :wink:

#16

Zeig mal den Code und wie die Checkboxen aussehen.

#17

Ist ein wenig durcheinander wegen ständigem testen… hab ein wenig aufgeräumt:

<input type="hidden" name="editmyreq[oxuser__interessen][]" value=''>
<input class="edittext" type="checkbox" name="editmyreq[oxuser__interessen][]" value="$interesse"|oxmultilangassign|lower>

Die Checkboxen sind innerhalb eines foreach.

if ($this->_allowAdminEdit($soxId)) {
	$blMyVariable = \OxidEsales\Eshop\Core\Registry::getConfig()->getRequestParameter("editmyreq");
	$oUser = oxNew(\OxidEsales\Eshop\Application\Model\User::class);

    //$checked = implode(',', $blMyVariable);
    
	$oUser->assign($blMyVariable);
    
	//print_r($checked);
	print_r($blMyVariable);

    try {
        $oUser->save();
		$this->setEditObjectId($oUser->getId());
    } catch (Exception $oExcp) {
        $this->_sSaveError = $oExcp->getMessage();
    }
}
#18

Änder mal

$checked = implode(’,’, $blMyVariable[‘oxuser__interessen’]);

#19

$xxx = implode(",", $editmyreq[‘oxuser__interessen’] );
echo $xxx;

#20

Die Ausgabe sieht jetzt schon besser aus:

,,,interesse1,,,,,,,interesse2,interesse3,,,,,,,,,,,,,,,,,,,,,,

Allerdings mit $oUser->assign($checked); hab ich weiterhin nur Array in der DB stehen.