Seite 1 von 1

CMS_VAR[x] und arrays

Verfasst: Mi 15. Jun 2005, 09:57
von stefan25376
Dieses Thema ist schon einmal unter Bugs angesprochen worden. Nichtsdestotrotz möchte ich meinen eigenen Lösungsansatz veröffentlichen:

Ich bin kürzlich über eine Einschränkung in Contenido gestolpert, die ich
mit einer Ergänzung in der Datei /contenido/includes/include.pretplcfg_edit.php
gelöst habe. Ich werde es mal möglichst abstrakt versuchen.

Für gewöhnlich kann man folgende Konstrukte in den Ein- oder Ausgabeteilen
von Modulen verwenden:

Eingabe:

<input type="text" name="CMS_VAR[0]" value="CMS_VALUE[0]" />

Ausgabe:

echo "CMS_VALUE[0]";

Nun kann es aber vorkommen, daß dynamische Verhältnisse herrschen (Beispiels-
weise wenn ich eine Mehrfachauswahl von "Kategorien" ermöglichen möchte, wie
in meinem Fall) Beispiel:

for($a=0;$a<count($foo);$a++) {
?>
<input type="checkbox" name="CMS_VAR[0][]" value="<?php echo $foo[$a]; ?>" />
<?php
}

Hierbei bekommt man eine Fehlermeldung, das die übergebene Variable die aus
CMS_VAR[0] erzeugt wird ein array ist. Dies ist ja auch gewollt.

Ich habe daraufhin im obengenannten Skript die Variable einfach "serialisiert". D.h.
ein beliebiges Array-Konstrukt kann nun auf einen String abgebildet und anschließend
wieder "deserialisiert" werden. Ganz einfach! Damit wären auch wesentlich kompliziertere
Array-Konstrukte, sogar mit assoziativen Arrays, möglich.

Der Wert kann später folgendermaßen wiederverwendet werden:

$cms_var0 = 'CMS_VALUE[0]';
if($cms_var0 != "") $cms_var0 = unserialize($cms_var0);
else $cms_var0 = array();

Wichtig sind hierbei die einfachen Anführungszeichen, da der Serialisierungsmechanismus
mit doppelten Anführungszeichen arbeitet und es so zu Fehlermeldungen kommen kann.

In der Datei /contenido/includes/include.pretplcfg_edit.php (Contenido-Version 4.4.5)
habe ich vor Zeile 66 folgende Zeile ergänzt:

if(is_array($value)) $value = serialize($value);

Hier dann nocheinmal der ganze Abschnitt im Zusammenhang (Von Zeile 65 bis 70)

foreach ($tmp as $key=>$value) {
if(is_array($value)) $value = serialize($value);
$value = urlencode($value);
if (!isset($varstring[$i])) $varstring[$i]="";
$varstring[$i] = $varstring[$i].$key."=".$value."&";
}

In der Datei /contenido/includes/include.tplcfg_edit.php muss vor Zeile 39
ebenfalls folgendes ergänzt werden:

if(is_array($value)) $value = serialize($value);

Ich hoffe dieser Beitrag war hilfreich.

Verfasst: Mi 15. Jun 2005, 10:45
von HerrB
Grundsätzlich ist der Beitrag hilfreich - es sei aber erwähnt, dass dieser Vorschlag bereits gemacht wurde (aber evtl. ohne finalen Code). Abgesehen davon kann man mit ein wenig JS im Input (und da muss JS aktiv sein!) auch vorher schön serialisieren... :wink:

Gruß
HerrB

Verfasst: Mi 15. Jun 2005, 10:50
von timo
Ich habe beides mal in den Bugtracker eingetragen und werde mir demnächst beides mal ansehen.

Verfasst: Mi 15. Jun 2005, 11:49
von stefan25376
Hallo HerrB,

Der Unterschied ist nur, daß die JavaScript-Engine meist nicht die Verläßlichste ist. Ich arbeite hier sehr viel mit Linux und MacOSX...... Ich
kenne da sehr hübsche Seiten, die überhaupt nicht funktionieren.

Die PHP-Funktion serialize arbeitet dafür immer gleich gut. Ich verfolge im Allgemeinen immer folgenden Grundsatz: "Was ich serverseitig machen kann und daher besser kontrollieren kann, mache ich serverseitig. Den Rest mache ich clientseitig, ohne dabei die noscript-Tags zu vergessen."

Ich bin der Meinung, daß die Bemühungen des W3C ein einheitliches DOM zu schaffen mittlerweile schon deutliche Früchte getragen haben. Die Integration in die Browser ist meist noch nicht wirklich ausgereift. Wenn man sich einmal moderne DHTML-Skripte ansieht, so wimmelt es von Browser-Detektoren und Workarounds..... Ist den gerade das nicht der Sinn eines Standards, daß er ohne Detektor verwendet werden kann?

Ich habe bei JavaScript immer gemischte Gefühle. Letztendlich entscheiden die Contenido-Entwickler...... ;-)

Verfasst: Mi 15. Jun 2005, 11:55
von HerrB
Ja, sehe ich ja auch so - war nur als Hinweis an andere Nutzer gedacht; man muss nicht gleich in den Contenido-Dateien Änderungen durchführen.

Das JS, was man braucht, ist übrigens so Basic, dass es auch mit Netscape anno Tobak funktionieren würde...

Gruß
HerrB

Verfasst: Mi 15. Jun 2005, 12:00
von stefan25376
Hallo HerrB und Alle,

Ich muss ja zugeben, daß ich ein Paranoiiker bin! Ich habe eine eigene
Agentur und mache sehr viel Aufträge für größere Unternehmen. Da
benutzen die eventuell Uralt-Browser oder der sysadmin hat JavaScript
abgestellt oder gefiltert.........

Wenn man dann nicht einmal das Template richtig konfigurieren kann,
brennt der Baum! ;-)

Bis dann, Stefan

Verfasst: Mi 15. Jun 2005, 12:34
von HerrB
Da benutzen die eventuell Uralt-Browser oder der sysadmin hat JavaScript abgestellt oder gefiltert.........
Das können wir noch Stunden weiterführen... :wink:

Nein, kann er nicht. Denn es ist das Backend - ohne JS und einen halbwegs aktuellen Browser würde er Contenido gar nicht nutzen können. Das ist ja das Schöne - das JS funktioniert deswegen auf jeden Fall...

Aber Du hast schon recht, die Möglichkeit, es einfach so speichern zu können (ohne Tricks) ist natürlich schön. Ich werde nochmal versuchen, die erste Diskussion zu finden - irgendwo gab es einen Haken, wenn ich mich recht erinnere.

Gruß
HerrB

Verfasst: Mi 15. Jun 2005, 12:45
von HerrB
Habe noch mal nachgesehen, nein Haken gab es zunächst nicht, der gegebene Vorschlag wurde nur nicht weiter verfolgt:

http://www.contenido.org/forum/viewtopi ... 4811#44811

Gruß
HerrB