CMS_VAR[x] - Ich will keine Konflikte mehr!

Gesperrt
Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

CMS_VAR[x] - Ich will keine Konflikte mehr!

Beitrag von Luigi » Di 9. Aug 2005, 16:44

Hallo zusammen,

Ich ärgere mich ständig darüber, dass die Variablen CMS_VAR[...] eindeutig sein müssen, wenn Module mehrere Male verwendet werden. :evil:

Es müsste doch nicht so schwer sein, in Contenido eine globale Variable einzuführen, welche eine große Zahl darstellt.
Diese Zahl könnte man bspw. aus dem Modulnamen und seiner Versionsnummer,... automatisch erzeugen lassen (als Hashwert sozusagen).
Sie muss natürlich so "stabil" sein, dass sie sich nicht gleich bei einer Quellcodeänderungen des Moduls ändert, sonst gibt es Chaos...
Anhand dieser Zahl könnte man weiter durchnummerieren und hätte das lästige Problem des mehrmaligen Einsatzes eines Moduls nicht.

Bsp.:
Contenido generiert folgende Variable vor jedem Modul:

Code: Alles auswählen

$ModuleID = <Zahl>
Dann lautet meine erste Variable:

Code: Alles auswählen

CMS_VAR[$ModuleID + 1]

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Di 9. Aug 2005, 17:19

das problem ist, das in der 4.4er bis jetzt eine ersetzung erfolgt

Im INPUT

Code: Alles auswählen

"CMS_VAR[5000]" ==> "C<ModulNrImTemplate>CMS_VAR[5000]" ( C1CMS_VAR[5000] ) 
Bei den Values im Output wird ähnlich verwahren ..

Es gibt ein Thread dazu mit änderungen am code, um dies ein Wenig zu verbessern.

in der 4.5.x er Branch wird dies ein wenig anderst gehandhabt

um im Input ein CMS_VAR[$modid+$valid] zum laufen zu bringen, brauchst du ungefähr sowas:

Code: Alles auswählen

function sn_get_cms_var ( $vid )
{
  // ausführung über eval, damit contenido core richtig ersetzt
  eval("\$sRes = \"CMS_VAR[$vid]\";");
  return $sRes;

} // end function sn_get_cms_var
für values im INPUT geht das ganze unter 4.5.x einfacher. Hier werden eigentlich alle CMS_VALUES als array zur verfügung gestellt ( $CMS_VALUE[] ). Wenn im Modul INPUT Code ein "CMS_VALUE[x]" auftaucht, wird dies durch den Contenido Core durch $CMS_VALUE[x] ersetzt.

In dem du direkt $CMS_VALUE[] verwendest, aknnst du mit Variabeln arbeiten

Code: Alles auswählen


  $wert = $CMS_VALUE[$modulid + $valid ];

im output bereich der 4.5.x er Zwieg gilt zum Thema CMS_Value das selbe wie im Input bereich.

Wichtig ist, das dies bei der 4.4er ohne CORE-Änderungen nicht möglich ist.

Ich suche nach wie vor eine Möglichkeit, die MODUL-ID innerhalb eines Templates im INPUT Bereich eines Modules auslesen zu können ... damit würde mein multinav modul 100% mehfach nutzungsfähig werden und nur eine $start_id einstellbar ... so hab ich atm noch ein paar probs damit ..

Eine MODULID wird vergeben für ein Modul innerhalb eines Templates, weiß nur nicht ob dies zur verfügung gestellt wird. Eine eindeutige Modulid gibt es ja auch in der DB, die frage ist nur wie man das als SICHER innerhalb eines Modules auslesen/verwenden kann ... da bin ich noch auf der suche bzw. am testen.


Hoffe dies konnte dir ein wenig weiterhelfen.

So long

Stefan
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Di 9. Aug 2005, 22:08

Vielleicht habe ich im falschen Forum gepostet.
Ich benutze Version 4.5.2 Alpha

So wie ich das verstanden habe, geht hier

Code: Alles auswählen

$wert = $CMS_VALUE[$modulid + $valid ]; 
im Input und Output, richtig?

Jetzt muss ich nur an die richtige ModulId aus der Tabelle "con_mod" gelangen. Diese scheint mir "stabil" genug zu sein. Oder gibt es dafür schon etwa eine Variable $idmod ?

Danach könnte ich diesen Wert mit 100 multiplizieren und ich habe meine Variable $start_id ...

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Mi 10. Aug 2005, 01:39

ja, dei methode funzt für den CMS_VALUE teil .. für den CMS_VAR Teil den du im INPUT brauchst, mußt du dir mit dem eval ( bzw. der kleinen funktion ) helfen. [ in den 4.5.x er versionen / cvs bis zum heutigen aktuellen stand ]

WIe schon erwähnt, um auf eine eindeutige modulid zu kommen, bin ich mit meiner suche/test arbeit noch nicht weit genug gekommen ..

ich behelf mir atm damit, das ich halt nur eine variabel im input/output definiere ( $startid = "XXXX" ) und dann hatl alle drauf addiere:

Code: Alles auswählen

$var1 = $CMS_VALUE[$startid+1];
$var2 = $CMS_VALUE[$startid+2];
vermutlich wär die "idmod" aus der db-tabelle eindeutig, nur stellt sich da die frage inwiefern du die sicher innerhalb eines modules ermitteln willst ? ...

ich weiß atm nicht, in wiefern einem modul das mitgeteilt wird ... im input teil wohl am ehesten noch, aber frontend bereich könnte schon schwieriger werden ...

sobald ich das genauer weiß ( wie gesagt, ich bin da für meine eigenen Module auch dran ) wer ich es posten.

Von daher, mehr als das oben erwähnte kann ich dir leider nicht mitteilen.

Wenn du willst, pn mich an und ich kann dir mal ein modul mailen, das noch nciht freigegeben ist, wo du dir das ganze mal anschauen kannst, wie ich das atm mache.


so long

stefan
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Mi 10. Aug 2005, 21:18

hab mir mal den core ein wenig angeschaut, allerdings aus zeit gründen nur den von der 4.5.3 beta.


In der Datei contenido/includes/function.con2.php Zeile 244 und 245

Code: Alles auswählen

						$thisModule = '<?php $cCurrentModule = '.((int)$a_d[$value]).'; ?>';
						$thisContainer = '<?php $cCurrentContainer = '.((int)$value).'; ?>';
wie du hier siest werden 2 Variabeln definiert, und mit einem Wert gefüllt ...

und Zeile 248

Code: Alles auswählen

                    $output = $thisModule . $thisContainer . $db->f("output");
Hier wird in einer Variabel die 2 generierten Variabeln mit dem des Outputcodes eines Modules zusammengeführt. Ergo ist müssten die beiden im Output code zu finden sein.

Im INPUT Bereich hab ich in der kurzen Suche die Stelle nciht genau verifizieren könne, aber nachdem ich mit die Datei contenido/includes/include.tplcfg_edit.php und respektive die anderen die teplconfiguration betreffende dateien angeschaut habe (eher überlfogen ) konnte ich nur Folgende These aufstellen, die es noch zu belegen/beweisen gilt:

Im INPUT Bereich steht $cCurrentModule zur verfügung, da diese PHP-Variable mit in die TPL-Configuration einfließt, wie auch immer dies genau geschieht.

Für Die Containernummer innerhalb eines Templates gilt folgendes:

OUTPUT ----> $cCurrentContainer
INPUT ---> $cnumber ( wenn man die THese ableitet für diese Variabel ).



Naja, dies war ein wenig die Theorie, hier mal ein kleines Modul zum Testen:


Input:

Code: Alles auswählen

?><?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " .$cnumber;

?><?php
für den OUTPUT

Code: Alles auswählen

<?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " . $cCurrentContainer;

?>
setz dieses Modul in ein Layout/Template ein, und schau dir mal die Ausgabe an.

Am besten mit nem Layout in der Art:

Code: Alles auswählen

<html>
  <head><title>test</title></head>
<body>
<container id="1" name="test_con1" type="test_modules" mandatory="optional" default="test_mod1"></container>
<br><br><br>
<container id="2" name="test_con2" type="test_modules" mandatory="optional" default="test_mod2"></container>
</body>
</html>

Hinweis: Ich kann weder absehen, in wiefern die Nutzung dieser Erkenntiss für Entwicklung von Modulen als gesichert sein mögen.


Auf jedenfall werd ich versuchen, diese Erkenntniss zu vertiefen, hoffe aber das vlt evtl Timo, Emergence oder einer der anderen erfahrenen Coder hier im Forum vlt nen Gedanken/Meinung/Hinweis dazu haben.

Und natürlich versuchen dies, insofern möglich ist, geschickt einzusetzen:

so long

Stefan

P.S.: Bei sowas kommt mir in den Sinn .. was wäre wenn mann beim anlegen eines Moduls nen weiteres Feld hätte -> reserve_X_vars und diese dann als combo machen könnte:

Code: Alles auswählen

$startValueID = $cCurrentModule * 1000;
$endValuID = $startValueID + <reserver_x_vars>;
damit könnte man eine möglichkeit schaffen, module mehrfach nutzbar zu machen, ohne das unerfahrene evtl CMS_VALUES/CMS_VAR einstellungen i code direkt suche müssen.

Allerdings würde dann eine überprüfung wieder sinn machen, die sicherlich nur mit sehr viel aufwand zu realisieren ist ... leider. Auf der nderen seite, 1000er Bereiche sind ja meistens ausreichend ... allerdings komtm dann vlt wiederum evtl eine Begrenzung des Zahlendatentyps zu tragen .. vlt, aber auch nur vermutung *seufz*

An einen Mod: bitte den thread mal in ein korrekteres board schieben, das hier hat nix mit 4.4.x zu tun, eher mit 4.5.x ;) danke
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Do 11. Aug 2005, 04:42

An einen Mod: bitte den thread mal in ein korrekteres board schieben, das hier hat nix mit 4.4.x zu tun, eher mit 4.5.x danke


Done.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Do 11. Aug 2005, 15:32

SkyBlader hat geschrieben: Input:

Code: Alles auswählen

?><?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " .$cnumber;

?><?php
für den OUTPUT

Code: Alles auswählen


Leider steht die Variable $cCurrentModule im Input-Bereich der Contenido-Version 4.5.2 nicht zur Verfügung. Ansonsten wäre es genau das, was ich brauche.
In der Tabelle $cfg["tab"]["mod"] würde ich dann noch das Feld "created" auslesen. Dieses verrechne ich dann (irgendwie) mit der Modul-ID und habe eine eindeutige ID.

Jetzt muss ich nur noch in der Version 4.5.2 an $cCurrentModule im Input-Bereich gelangen...





<?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " . $cCurrentContainer;

?>
setz dieses Modul in ein Layout/Template ein, und schau dir mal die Ausgabe an.

Am besten mit nem Layout in der Art:

Code: Alles auswählen

<html>
  <head><title>test</title></head>
<body>
<container id="1" name="test_con1" type="test_modules" mandatory="optional" default="test_mod1"></container>
<br><br><br>
<container id="2" name="test_con2" type="test_modules" mandatory="optional" default="test_mod2"></container>
</body>
</html>

Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Do 11. Aug 2005, 15:33

SkyBlader hat geschrieben: Input:

Code: Alles auswählen

?><?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " .$cnumber;

?><?php
für den OUTPUT

Code: Alles auswählen


<?php

   echo "idmod: " . $cCurrentModule . "<br>containerid in tpl: " . $cCurrentContainer;

?>
setz dieses Modul in ein Layout/Template ein, und schau dir mal die Ausgabe an.

Am besten mit nem Layout in der Art:

Code: Alles auswählen

<html>
  <head><title>test</title></head>
<body>
<container id="1" name="test_con1" type="test_modules" mandatory="optional" default="test_mod1"></container>
<br><br><br>
<container id="2" name="test_con2" type="test_modules" mandatory="optional" default="test_mod2"></container>
</body>
</html>
Leider steht die Variable $cCurrentModule im Input-Bereich der Contenido-Version 4.5.2 nicht zur Verfügung. Ansonsten wäre es genau das, was ich brauche.
In der Tabelle $cfg["tab"]["mod"] würde ich dann noch das Feld "created" auslesen. Dieses verrechne ich dann (irgendwie) mit der Modul-ID und habe eine eindeutige ID.

Jetzt muss ich nur noch in der Version 4.5.2 an $cCurrentModule im Input-Bereich gelangen...

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Do 11. Aug 2005, 15:52

mhh ... bin grad mal meine liste der eigenen beiträge durchgegangen ...

schau dir den thread hier mal an -> http://www.contenido.org/forum/viewtopi ... highlight=

andere baustelle, aber im prinzip gehts ums gleiche *g*

das funz bei dir in der 4.5.2 nicht, da es da noch nicht drin war, ergo dürfte bei dir die Moduzlübersetzung aber auch Probleme bereiten.

so long

Stefan

P.S.: hätt ich glöeich drauf kommen können, hätt ich mir bissle sucharbeit erspart ;)
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

Luigi
Beiträge: 34
Registriert: Do 18. Nov 2004, 20:50
Kontaktdaten:

Beitrag von Luigi » Do 11. Aug 2005, 21:31

SkyBlader hat geschrieben:mhh ... bin grad mal meine liste der eigenen beiträge durchgegangen ...

schau dir den thread hier mal an -> http://www.contenido.org/forum/viewtopi ... highlight=

andere baustelle, aber im prinzip gehts ums gleiche *g*

das funz bei dir in der 4.5.2 nicht, da es da noch nicht drin war, ergo dürfte bei dir die Moduzlübersetzung aber auch Probleme bereiten.

so long

Stefan

P.S.: hätt ich glöeich drauf kommen können, hätt ich mir bissle sucharbeit erspart ;)

Also ich habe die Änderungen in include.tplcfg_edit_form.php und include.pretplcfg_edit_form.php aufgenommen.

Jetzt habe ich immer die Module-ID. Diese ist ja immer eindeutig.
Wenn ich also Module entferne und neue hinzufüge, könnte es ja passieren, das ein neues Modul eine alte ID erhält, aber keinesfalls haben zwei Module die gleiche ID. Das reicht mir aus!

SkyBlader
Beiträge: 303
Registriert: Do 18. Mär 2004, 16:23
Wohnort: Ratingen / NRW
Kontaktdaten:

Beitrag von SkyBlader » Do 11. Aug 2005, 23:28

das mit der ModulID ist klar .... aber mal angenommen, du genierst dir die wertw f+r die cms_values in der art:

Code: Alles auswählen

$var_1 = $CMS_VALUE[$cCurrentModule    ];
$var_2 = $CMS_VALUE[$cCurrentModule+1];
$var_3 = $CMS_VALUE[$cCurrentModule+2];
$var_4 = $CMS_VALUE[$cCurrentModule+3];
für Modul 1 wären das dann

1;2;3;4

für Modul 2

2;3;4;5

somit würden sich 2;3;4 überschneiden.

Die Frage ist also, wieviel securityplatz ist nötig ?

Mal übertrieben dargestellt folgende formel zur id generierung:

Code: Alles auswählen


$var_1 = $CMS_VALUE[ ( $cCurrentModuleID * 100000 )       ];
$var_2 = $CMS_VALUE[ ( $cCurrentModuleID * 100000 ) + 1 ];
$var_3 = $CMS_VALUE[ ( $cCurrentModuleID * 100000 ) + 3 ];

Modul 1:

100000 ; 100001 ; 100002

Modul 2:

200000 ; 200001 ; 200002


okay , 100000er abstände dürfte für die masse an modulen ausreichen.


mhh aber, wenn nur ein modul ohne dieses dynamischa arbeitet, kann es nach wie vor passieren, das sich 2 module ins gehege kommen.

so long

Stefan
Contenido 4.4.4/4.4.5 - Contenido 4.5.x

Module:sn_multinav für 4.5.x

Gesperrt