CMS_VAR[x] und arrays
Verfasst: Mi 15. Jun 2005, 09:57
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.
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.