CMS_VALUE in Schleifen (CMS_VALUE[$i];)

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

CMS_VALUE in Schleifen (CMS_VALUE[$i];)

Beitrag von DRothmaler » Di 9. Mär 2004, 17:36

Hi,

da ich gerade an der Umsetzung unserer Firmen-Website in Contenido sitzt, bin ich an der Problem der Verwedung von CMS_VALUE in Schleifen geraten; und da das ja bisher nicht möglich war, hab ich mich hingesetzt und etwas gebastet... Also hier meine Lösung des Problems:

(Con.-Ver. 4.4.2)

Alle Änderungen betreffen die Funktion "conGenerateCode" in der Datei "functions.con.php" im Contenido "include"-Verzeichnis.
(Achtung! Vorher Backup anlegen!
Ich habe die Änderungen zwar getestet, aber man weiß ja nie...)


1.) bei Zeile 1285 wird hinter
foreach ($a_container as $key=>$value) {
folgendes eingefügt:
$CiCMS_VALUE = '';

2.) ca. 10 Zeilen weiter wird hinter
$template = $db->f("template");
folgendes eingefügt:
$a_c[$value] = preg_replace("/(&\$)/","", $a_c[$value]);

3.) noch 10 Zeilen weiter wird der Block:
foreach ($varstring as $key3=>$value3) {
$CiCMS_VALUE = "C".$key3."CMS_VALUE";

$tmp = urldecode($value3);
$tmp = str_replace("\'", "'", $tmp); // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
$output = str_replace("CMS_VALUE[$key3]", $tmp, $output);
}

$output = ereg_replace("(CMS_VALUE\[)([0-9]*)(\])", "", $output);


ersetzt durch:

$CiCMS_Var = '$C'.$value.'CMS_VALUE';

foreach ($varstring as $key3=>$value3){
$tmp = urldecode($value3);
$tmp = str_replace("\'", "'", $tmp); // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
$CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; ';
$output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output);
$output = str_replace("CMS_VALUE[$key3]", $tmp, $output);
}
$output = str_replace("CMS_VALUE", $CiCMS_Var, $output);
$output = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $output);


und 4.) noch ca. 20 Zeilen weiter ersetzt ihr
$code = str_replace("CMS_CONTAINER[$value]", $output, $code);
durch
$code = str_replace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);


Damit alles sauber funktioniert sollte noch die Tabelle "con_code" geleert werden, damit die Änderungen wirksam werden.

Man kann CMS_VALUE nun benutzen wie eine normale PHP-Variable (auch mit führendem "$"-Zeichen)
Die ganze Sache hat den Vorteil, das man sie eben nun unter anderem auch in Schleifen einsetzen kann z.B.:
"for ($i=0; $i<10; $i++) echo $CMS_VALUE[$i].'<br>';"


So, ich freue mich auf euer Feedback; wenn es ein paar Leute getestet haben und es alles glatt geht, würde ich das ganze nämlich Erweiterung auf die "reguläre" Contenido-Seite hochladen...

MfG Daniel
Zuletzt geändert von DRothmaler am Mi 10. Mär 2004, 10:48, insgesamt 3-mal geändert.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Di 9. Mär 2004, 20:44

intressante variante, respekt... (damit ich auch mal was positives sage)

ich hab mir das jetzt etwas(2h) angesehen...
die bestehenden module schlucken diese änderung so wie es aussieht ohne weiteres...
wenn ich das richtig verstanden habe werden "CMS_VALUE" ohne $ so ersetzt wie bisher und $CMS_VALUE wird als variable so belassen...

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Mi 10. Mär 2004, 10:30

Ja das stimmt, die bestehenden Module sollten weiterhin funktionieren.
Hier mal eine kurze Erklärung der Funktionsweise der einzelnen Änderungen.

Schritt 1: Ist die Initialisierung der Variable $CiCMS_VALUE, in welcher später der String für die Vorbelegung der Variable $CMS_VALUE[$i] für jeden Container gespeichert wird.

Schritt 2: Entfernt ein evtl. vorhandes "&" am Ende des Strings, in dem die CMS_VALUE's gespeichert sind (nicht zwangsläufig nötig, aber sauberer, als wenn später ein $CMS_VALUE mit einem Leeren Wert belegt würde.

Schritt 3:
In der Schleife wird in die Variable $CiCMS_VALUE die Vorbelegung der Werte von $CMS_VALUE[$i] geschrieben und anschließend werden vorhandene CMS_VALUE[1], CMS_VALUE[2], CMS_VALUE[...] Strings wo es möglich ist direkt durch den Entsprechenden Wert ersetzt (dies ist notwendig, damit man "CMS_VALUE[Zahl]" auch weiter direkt im HTML-Code verwenden kann, ohne einen Umweg über "<?php echo" gehen zu müssen, was ja sonst eine Anpassung einiger Module bedeuten würde.

ACHTUNG @emergence und alle anderen, die sich die erweiterung gestern schon eingbeut haben: bei euch fehlt in Schritt 3 noch die Zeile

$output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output);

diese ist nötig, weil einträge der Form "$CMS_VALUE[1]" (also bei denen das führende "$" verwendet wurde, und die direkt Indiziert wurden sonst nicht direkt durch den Wert ersetzt werden würden, sondern durch "$"+Wert


Hinter der Schleife werden dann alle verbleibenden CMS_VALUE's (also die die nicht direkt durch einen Wert ersetzt wurden) in eine Variable umgewandelt.

Und in Schritt 4 wird dann vor dem eingentlichen Modul-(PHP)-Code noch die Vorbelegung der Variablen mit ausgegeben.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 13. Mär 2004, 14:30

soweit ich gesehen habe ist das erste posting ad schritt 3 ergänzt worden...
muss mich noch ein wenig mit der modifikation auseinander setzen...

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Sa 13. Mär 2004, 21:15

soweit ich gesehen habe ist das erste posting ad schritt 3 ergänzt worden...
Stimmt, ich hatte dir in meinem 2 Posting einen Hinweis diesbezüglich hinterlassen. :)

Außerdem habe ich gestern Nachmittg noch festgestellt, das ich noch ein paar andere Sachen vergessen habe. :oops:
Im Moment funktionieren zwar alle alten Module weiterhin ohne Einschränkung aber die Benutzung von CMS_VALUE als Variable bzw. mit variablem Index funktioniert nur im reglären Output, NICHT jedoch im INPUT und im EDITOR! Dazu müssen noch 3 weitere Dateien von Contenido in ähnlicher weise erweitert werden.
Leider kann ich jetzt nicht mehr aus dem Hut sagen, welche Dateien es waren; und nachsehen kann ich auch nicht, da ich Contenido nur auf meinem Firmen-PC installiert habe. Ich werde am Montag die Details posten.
Wer es auf eigene Faust versuchen möchte, der kann einfach alle php-Dateien von Contenido nach "CMS_VALUE" durchsuchen, und meine Erweiterungen aus Posting 1 an die Entprechende Stelle anpassen.

Aber wie gesagt: keien Panik an alle die die Erweiterung in der Aktuellen Version eingebaut haben; alle vorhandenen Module müssten ohne Probleme funktionieren - jedenfalls tun sie das bei mir.

Schönen Abend noch...

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 17. Mär 2004, 12:17

ähm postet du noch die anderen änderungen ?
denn nur im output bereich würde diese änderung nichts nützen...

sag mal hast du auch versucht ein CMS_HTML[$i] umzusetzen ?

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Mi 17. Mär 2004, 16:45

Sorry, das es länger gedauert hat; aber hier nun die Änderungen noch mal komplett (alle zu ändernden Dateien befinden sich im Include-Verzeichnis):
für den Output und den Editor müssen die Dateien
functions.con.php (Zeile 1296) & include.con_editcontent.php (Zeile 490)
folgendermaßen geändert werden:
1.) vor der Zeile

Code: Alles auswählen

$tmp1 = preg_split("/&/", $a_c[$value]);
folgendes einfügen:

Code: Alles auswählen

$a_c[$value] = preg_replace("/(&\$)/","", $a_c[$value]);
2.) 10 Zeilen weiter unten den Block

Code: Alles auswählen

foreach ($varstring as $key3=>$value3) {
  $CiCMS_VALUE = "C".$key3."CMS_VALUE";
  $tmp = urldecode($value3);
  $tmp = str_replace("\'", "'", $tmp);    // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
  $output  = str_ireplace("CMS_VALUE[$key3]", $tmp, $output);
}
$output = eregi_replace("(CMS_VALUE\[)([0-9]*)(\])", "", $output);
ersetzen durch:

Code: Alles auswählen

$CiCMS_Var = '$C'.$value.'CMS_VALUE';
$CiCMS_VALUE = '';

foreach ($varstring as $key3=>$value3){
  $tmp = urldecode($value3);
  $tmp = str_replace("\'", "'", $tmp);    // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
  $CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; ';
  $output = str_replace("\$CMS_VALUE[$key3]", $tmp, $output);
  $output = str_replace("CMS_VALUE[$key3]", $tmp, $output);
}
$output = str_replace("CMS_VALUE", $CiCMS_Var, $output);
$output = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $output);
3.) die Zeile

Code: Alles auswählen

$code  = str_ireplace("CMS_CONTAINER[$value]", $output, $code);
ersetzen durch:

Code: Alles auswählen

$code  = str_replace("CMS_CONTAINER[$value]", "<?php $CiCMS_VALUE ?>\r\n".$output, $code);

für den INPUT müssen nun noch die Dateien include.pretplcfg_edit_form.php (Zeile 119) und include.tplcfg_edit_form.php (Zeile 378) geändert werden:

Hier gibt es nur einen Schritt; der Block

Code: Alles auswählen

foreach ($varstring as $key3=>$value3) {
	$CiCMS_VALUE = "C".$key3."CMS_VALUE";
	$CiCMS_VAR = "C".$key3."CMS_VAR";
	$tmp = urldecode($value3);
	$tmp = str_replace("\'","'",$tmp);    // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
	$input  = str_replace("CMS_VALUE[$key3]", $tmp, $input);
}

$input  = str_replace("CMS_VAR", "C".$cnumber."CMS_VAR" , $input);
$input = ereg_replace("(CMS_VALUE\[)([0-9]*)(\])", "", $input);

ob_start();
eval($input);
wird ersetzt durch

Code: Alles auswählen

$CiCMS_Var = '$C'.$cnumber.'CMS_VALUE';
$CiCMS_VALUE = '';

foreach ($varstring as $key3=>$value3){
	$tmp = urldecode($value3);
	$tmp = str_replace("\'", "'", $tmp);    // ' war das einzige Sonderzeichen was mit \ maskiert wurde. !?
	$CiCMS_VALUE .= $CiCMS_Var.'['.$key3.']="'.$tmp.'"; ';
	$input = str_replace("\$CMS_VALUE[$key3]", $tmp, $input);
	$input = str_replace("CMS_VALUE[$key3]", $tmp, $input);
}
$input = str_replace("CMS_VALUE", $CiCMS_Var, $input);
$input = str_replace("\$".$CiCMS_Var, $CiCMS_Var, $input);
$input  = str_replace("CMS_VAR", "C".$cnumber."CMS_VAR" , $input);

ob_start();
eval($CiCMS_VALUE." \r\n ".$input);
und das war's auch schon...

das ganze mit CMS_HTML zu machen habe ich noch nicht versucht, werde aber gleich mal reinschauen, ob das machbar ist.

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Mi 17. Mär 2004, 17:48

Also, ich habe mir die Sache mit dem CMS_HTML[$i] gerade mal angesehen und das gestaltet sich etwas schwieriger, als der Einbau von CMS_VALUE[$i], weil:
bei CMS_VALUE sind alle möglich Werte bereits in der DB abgelegt, da diese ja über die INPUT-Felder mit CMS_VAR eingegeben werden.
Damit man CMS_VALUE nun wie eine Variable benutzen kann, habe ich einfach einen String zusammengebastelt, der ein PHP-Array mit diesen Werten belegt; und alle anschließenden Vorkommen von "CMS_VALUE" mit dem Namen dieses Arrays ersetzt.

Da die Werte-Belegung von CMS_HTML aber nicht in dieser Weise im Vorfeld erfolgt, kann ich die Werte auch nicht so ohne Weiteres in ein Array schreiben.
Der einzige halbwegs brauchbare Weg um das Problem zu lösen wäre, wenn es möglich wäre den Quelltext für den Output-Bereich "Vorzuevaluieren" - also mit eval($code) - und dabei alles was normalerweise per echo an den Browser weitergegeben wird irgendwie abzufangen und nach "CMS_HTML" zu durchsuchen...

Da ich aber kein PHP-Spezie bin, weiß ich nicht, ob und wie eine soche Umleitung der Ausgabe machbar ist.
Wäre nett, wenn mir irgendjemand anders diesbezüglich einen Tip geben könnte.

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Do 18. Mär 2004, 15:23

So, also ich habe mich mal im I-Net umgesehen, und eine Möglichkeit gefunden die echo's mittels Output Buffering und der Funktionen ob_start, ob_get_contents und ob_end_clean abzufangen, also müsste auch ein CMS_HTML[$i] realisierbar sein.
Ich werde mich im Laufer der nächsten Tage mal daran versuchen.

Außerdem könnte man versuchen den letztendlich ausgegebenen HTML-Code (für ein einzelnes Modul oder sogar für die komplette Seite) ebenfalls mittels dieser Funktionen abzufangen und somit nicht nur den Code zu cachen - wie es ja in der Tabelle con_code schon gemacht wird - sonderen gleich das "Endprodukt"; wobei man bspw. Counter-Module von sowas natürlich ausnehmen müsste.
Werde mich in den nächten Tagen auch mal etwas mit diesem Punkt beschäftigen, hab da schon so'n paar Ideen wie man das realisieren könnte...

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Do 13. Mai 2004, 15:46

Hallo Daniel,

ich habe soeben deine Patches im CVS eingebaut, vielen Dank! Du wirst auch lobend im Impressum erwähnt ;)

cheers,
Timo

wewo
Beiträge: 45
Registriert: So 8. Aug 2004, 19:08
Wohnort: Graz
Kontaktdaten:

dynamische CMS_VARS

Beitrag von wewo » Mo 14. Feb 2005, 16:23

hallo,

spiele mich grad mit der 452 alpha herum und will/muss auch dynamische CMS_VARS erzeugen.

geht das nicht einfacher, sauberer, als so?

Code: Alles auswählen

for ($i=0; $i <= count($mediaTypes); $i++){	
	echo '<select name="CMS_VAR['.$i.']">';
		echo "<option value='0'>-- kein --</option>\n";
		foreach ($mediaTypes as $media=>$key){
			("$CMS_VALUE[$i]" == $media ) ? $sel = " selected='selected' " : $sel = "";
		echo "<option value='". $media."' $sel>$key</option>\n";
	}
	echo "</select>";
	echo "<br />";	
}
lg wenzel

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Di 29. Mär 2005, 12:51

Hi, Sorry für die späte Antwort -
hab hier schon ne Weile nicht mehr rein geschaut, da ich zur Zeit Hauptsächlich an einem anderen Projekt Arbeite... :oops:

Na egal...

Zu deiner Frage:
Evtl. steh ich ja etwas auf dem Schlauch, aber was genau willst du denn überhaupt machen?
Bzw. In welcher Hinsicht willst du das ganze sauberer/einfachen haben?

MfG Daniel

wewo
Beiträge: 45
Registriert: So 8. Aug 2004, 19:08
Wohnort: Graz
Kontaktdaten:

Beitrag von wewo » Di 29. Mär 2005, 20:07

Hi Daniel,
DRothmaler hat geschrieben: Evtl. steh ich ja etwas auf dem Schlauch, aber was genau willst du denn überhaupt machen?
Bzw. In welcher Hinsicht willst du das ganze sauberer/einfachen haben?
MfG Daniel
Mir kam der Code nicht ganz sauber vor, aber egal, inzwischen kratzt mich das auch nimmer :)

Aber weil du grad da bist:
Hast du an dem CMS_HTML[x] zufällig was weitergebastelt?

Ciao
Wenzel

DRothmaler
Beiträge: 11
Registriert: Di 9. Mär 2004, 16:33
Wohnort: Dresden
Kontaktdaten:

Beitrag von DRothmaler » Mi 30. Mär 2005, 10:05

Hi Wenzel,
wewo hat geschrieben: Aber weil du grad da bist:
Hast du an dem CMS_HTML[x] zufällig was weitergebastelt?
Nein, da bin ich leider noch nicht weiter gekommen...
Hatte die Idee mit dem Output Buffering zwar damals mal angetestet,
aber das hatte irgendwie nicht so funktioniert, wie es sollte...

Hab mir das ganze aber gerade nochmal kurz angesehen, und da kam mir der Gedanke,
das man aus den CMS_xxxxx[Zahl] Platzhaltern evtl. ja auch Funktionen basteln könnte...
Aber ich habe im Moment keine Ahnung, wann ich dazu komme das zu testen...
Mal sehen ob sich am WE etwas Zeit dafür findet...
Wenn ich da noch was hinbekomme, dann sag ich Bescheid...

MfG Daniel

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mi 30. Mär 2005, 10:51

ich hätte noch folgenden ansatz, der vielleicht weiterhelfen wird:

(1) neuen platzhaltertyp erstellen. z.b. $myVariable[X].

(2) die ganze variable $myVariable mit wddx_serialzie() serialisieren und als CMS_VAR[0] direkt in der datenbank speichern.

(3) im outputbereich steht dann mit CMS_VALUE[0] die variable, resepktive die variablen serialisiert zur verfügung und können mit wddx_deserialize() in den kontext zurück geholt werden und stehen anschliessend wieder als $myVariable[X] zur verfügung.

dafür wird bloss eine klasse benötigt, welche die daten serialisiert und an die richtige stelle im db-system speichert. alternativ könnte das script auch nur die serialisierung vornehmen und den string in ein textfeld geben. dann wäre aber jeweils zweimal zu speichern. eigentlich sollte man das allerdings vermeiden. aber dann geht es halt nicht mehr mit den bordmitteln von contenido.

auf diese weise liessen sich alle arten von konfigurationswerten speichern. also nicht ausschliesslich skalare, sonder auch komplexe werte wie objekte oder arrays. und die platzhalter müssten nicht mit einer regexprüfung extrahiert werden.

z.b. myVariable[einVariablenBezeichner][keyAssoziativ][0] lässt sich genau so speichern wie z.b. ein einfaches array myVariable[0].

innerhalb des outputscripts ist lediglich...

Code: Alles auswählen

wddx_deserialize("CMS_VALUE[0]");
auszuführen, um die variablen allesamt wieder zur verfügung zu haben.

hope this helps!

gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

Gesperrt