Zum Inhalt springen

TCA-Checkbox-Werte in Fluid ausgeben

Erstellt am 4. Mai 2015 · 4 Antworten · letzte Antwort am 9. Juni 2015

Tags: Fluid, TCA, Frage

maggo ·

Hallo,

ich habe in einer Extension im TCA eine Checkbox mit 12 Boxen.
Wie kann ich die in der Datenbank gespeicherten Daten in Fluid ausgeben? Muss ich den in der DB gespeicherten Wert immer durch die einzelnen Werte nacheinander abziehen (wenn möglich)?
Z.B. 2552 - 2048 (passt also 12 = 1) ... 504 - 1024 (passt nicht also 11 = 0) und so weiter?

Oder gibt es da eine schönere Lösung?

harald1972 ·

Du musst die einzelnen Werte nicht "abziehen".
Du kannst das logisch verUNDen.

// so als Beispiel...
$one_of_your_constants = 0010; // ich finde oktal liest sich hier besser als dezimal.
if (($allboxes & $one_of_your_constants) == $one_of_your_constants)
{
    // Treffer!
}

Bitshift und Vergleich des ersten Bit (wie in aemkas Beispiel) geht natürlich auch.

maggo ·

@aemka - das ist nicht so ganz was ich brauche. Die Werte aller Checkboxen werden in der DB als ein zusammengerechnet und als ein Wert abgespeichert.
@harald - nach vorgegebenen werten abzufragen wäre auch eine Möglichkeit aber bei 12 hoch was weiß ich wie vielen Möglichkeiten, eher nicht so praktikabel

Daher werde ich wohl um eine modulo-Rechnung nicht herum kommen.

harald1972 ·

2 hoch 12 - nicht 12 hoch 2

Du musst aber nicht 2^12 = 4096 Abfragen machen, sondern nur ganz genau 12.
Ich sagte "logisch ver-UNDen" und meinte sowas in der Art:

$checkboxes = array(01, 02, 04, 010, 020, 040, 0100, 0200, 0400, 01000, 02000, 04000);
foreach($checkboxes as $cb){
    if (($yourboxes & $cb) == $cb){
       // die entsprechende Checkbox ist 'wahr'
    }
}

Die Zahlen im Array stellen die einzelnen Checkboxen dar, also ganze 2 hoch irgendwas, 1 bis 2048 - in Oktalschreibweise.
Der einfache &-Operator ver-UNDet bitweise.
$yourboxes sei dein Wert aller gesetzten (und nicht gesetzten) Checkboxen.
Wenn in $yourboxes das Flag $cb gesetzt ist, wird die Bedingung wahr.

Du kannst dem Array auch ($key => $value)-Paare geben.

Der Link von aemka macht quasi das gleiche (nur andersrum)

for ($i=0; $i<10; $i++) {
	if (($datenbank_feld >> $i) & 1) {
		$catsarray[] .= $cats[$i];
	}
}

Hierbei wird das $datenbank_feld (hab ich oben $yourboxes genannt) um 1,2,3,... Stellen nach rechts geschoben und das dann rechteste Bit (Wert 1) betrachtet.

Also wenn das nicht genau das ist, was du willst, hast du dich schlecht ausgedrückt.

.

Edit:
Hab nochmal nachgelesen. Du schreibst:

Wie kann ich die in der Datenbank gespeicherten Daten in Fluid ausgeben?

Wir haben dir Lösungen oder zumindest Ansätze in PHP angeboten, fluid spricht ja nicht direkt mit der DB.
Oder willst du etwa die Logik mit fluid-for-Viewhelper durchlaufen? Machbar wäre das auch.
Anders gefragt: Was hast du für einen Ansatz und an welcher Stelle liegt das Problem?