Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1

THEMA:

Jumi 01 Mär 2013 21:08 #36213

Hallo. Ich habe folgendes Problem.
Ich habe Jumi installiert. Nun versuche ich ziemlich simpel in einem Jumi-Modul auf "Position-2" eine Variable zu setzten.
Die Variable habe ich auf global gesetzt.

Nun möchte ich auf einem Jumi-Modul auf "Position-7" auf die Variable zugreifen. Doch dort scheint die Variable nicht bekannt zu sein.
Wieso?
Webhosting Pakete vergleichen: Webhosting Vergleich
Website erstellen lassen https://www.gregorvogel.ch/website-erstellen-lassen
Willst Du dir ein neues Laptop kaufen?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 02 Mär 2013 13:03 #36218

Wird denn das Modul in dem die Variable gesetzt wird VOR demjenigen aufgerufen, das sie auslesen möchte?

Hast du das schon gecheckt? Weil andersrum bringts nicht viel...
Man soll das Kind ins Korn werfen solange es noch heiss ist, auch wenn das der eine Tropfen ist, der dem Fass die Krone ins Gesicht schlägt...

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 02 Mär 2013 15:03 #36219

hallo, danke für deine Antwort.

Natürlich habe ich das gecheckt. Auch eine Funktion ist nicht mehr vorhanden. In beide Richtungen nicht.
Webhosting Pakete vergleichen: Webhosting Vergleich
Website erstellen lassen https://www.gregorvogel.ch/website-erstellen-lassen
Willst Du dir ein neues Laptop kaufen?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 02 Mär 2013 18:26 #36220

Lokale Variablen als global zu deklarieren finde ich persönlich nur sub-optimal, und kann recht fehleranfällig sein. Je nach Namen kann/könnte sie mit einer schon vorhandenen gleichnamigen Variablen im globalen Namensraum kollidieren, oder auch 'später' durch eine gleichnamige Var in einem anderen Script überschrieben werden. Mindestens den Namen entsprechend zu prefixen wäre was, z.B $haguJumiVar1.

Besser wäre es aber, wenn du dazu die JRegistry-Klasse oder auch die User-Session verwendest. Denn für solche Dinge sind die da. Auch JRequest könnte man dazu 'missbrauchen'. Oder halt auch ein Cookie setzten und wieder auslesen, wenn's denn sein muss. Oder wenn du eine eigene Klasse oder Funktion verwendest könntest du auch statische Variablen verwenden. Oder auch eigene Konstanten definieren
if(!defined('JUMI_VAR_1') {define('JUMI_VAR_1','wert');}
denn Konstanten sind ja bekannterweise auch global 'sichtbar'. Beinhalten aber so verwendet allerding auch wiederum ein ähnliches Gefahrenpotenzial wie globale Variablen.

Wobei ich mich dabei frage, was genau du in Modul 1 definieren und nach Modul 2 schieben willst, anstelle gleich alles in Modul 2 ablaufen zu lassen.

Bei
Roger
Man soll das Kind ins Korn werfen solange es noch heiss ist, auch wenn das der eine Tropfen ist, der dem Fass die Krone ins Gesicht schlägt...

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 03 Mär 2013 18:03 #36225

Danke für deine ausführliche Antwort.

Es ist mir klar, dass ich mich auf die Namensvergabe der Variable achten muss.
Ich möchte in einem Modul, welches ich als erstes aufrufe, eine Verbindung zu einer Datenbank herstellen.
In Modulen, welche ich später aufrufe, möchte ich die Daten aus der Datenbank ausgeben.

Das ganze soll ohne allzugrossen Aufwand entstehen. Es wird auch nur für interne Zwecke verwendet. Sicherheit steht da nicht an erster Stelle.

Joomla mit Jumi scheint mir da eine Lösung zu sein, um sowas schnell zu bewerkstelligen.

Ich finde es aber merkwürdig, dass weder eine Variable, noch eine Funktion oder eine Klasse im nächsten Modul vorhanden ist.
Webhosting Pakete vergleichen: Webhosting Vergleich
Website erstellen lassen https://www.gregorvogel.ch/website-erstellen-lassen
Willst Du dir ein neues Laptop kaufen?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 03 Mär 2013 23:52 #36226

Ich habe das gerade mit Joomla 2.5.8 getestet.
Da funktionieren globale Variablen problemlos.
Wieso aber nicht unter Joomla 3?
Webhosting Pakete vergleichen: Webhosting Vergleich
Website erstellen lassen https://www.gregorvogel.ch/website-erstellen-lassen
Willst Du dir ein neues Laptop kaufen?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 04 Mär 2013 12:43 #36228

Weil wie schon erwähnt, lokale Variablen als global setzen unzuverlässig ist. Du siehts es ja. Das hab ich bisher noch nie irgendwo verwendet, und werde das auch nie tun. Das ist noch aus der Zeit, als PHP weniger Objekt-Orientiert war, und gilt schon länger als 'bad' oder 'poor' practice.

Da gibt es seit PHP5 und insbesondere im Joomla-Framework geeignetere und weitaus bessere Möglichkeiten. Ein paar hab ich dir aufgezählt. Und eine vergessen:
Den eingebauten Caching-Mechanismus von Joomla (JCache), der z.B. von fast allen Core-Modulen genutzt wird. Ermöglicht ein Session unabhängiges Caching.

Ein Beispiel:
Die Daten in die Usersession schreiben. Ist simpel, und ein Caching (Lebensdauer der Session) ist auch gleich mit dabei:

Datengenerierung:
$sessionData = JFactory::getApplication()->getUserState('mod_meinmodul.daten', false);
if(false === $sessionData)
{
	// Noch keine Daten vorhanden: generieren und in Session schreiben
	$dbDaten = [DATEN];
        $jsonData = json_decode($dbDaten); 
        JFactory::getApplication()->setUserState('mod_meinmodul.daten', $jasonData);
}

Daten wieder auslesen:
$jsonDaten = JFactory::getApplication()->getUserState('mod_meinmodul.daten', json_decode(array());
$dbDaten = json_encode($jasonDaten);
Man soll das Kind ins Korn werfen solange es noch heiss ist, auch wenn das der eine Tropfen ist, der dem Fass die Krone ins Gesicht schlägt...

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 05 Mär 2013 19:26 #36234

Besten Dank für dein Beispiel.
Doch auch das funktioniert leider nicht.

Modul auf 'position-2'
<?php
$sessionData = JFactory::getApplication()->getUserState('mod_jumi.daten', false);
if(false === $sessionData)
{
	// Noch keine Daten vorhanden: generieren und in Session schreiben
	$dbDaten = 'Hallo Welt!';
        $jsonData = json_decode($dbDaten); 
        JFactory::getApplication()->setUserState('mod_jumi.daten', $jasonData);
}
?>

Modul auf 'position-7'
<?
$jsonDaten = JFactory::getApplication()->getUserState('mod_jumi.daten', json_decode(array());
$dbDaten = json_encode($jasonDaten);
?>

Was mache ich falsch?
Webhosting Pakete vergleichen: Webhosting Vergleich
Website erstellen lassen https://www.gregorvogel.ch/website-erstellen-lassen
Willst Du dir ein neues Laptop kaufen?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Jumi 05 Mär 2013 22:27 #36235

Du nix. Ich schon:
Es haben sich da zwei Fehler eingeschlichen. Damit müsste es gehen:
<?php
$app = JFactory::getApplication();
$sessionData = $app->getUserState('mod_jumi.daten', false);
if(false === $sessionData)
{
	// Noch keine Daten vorhanden: 
        // generieren und in Session schreiben
	$dbDaten = 'Hallo Welt!';
        $jsonData = json_encode($dbDaten); 
        $app->setUserState('mod_jumi.daten', $jsonData);
}
?>
und
<?php
$jsonDaten = JFactory::getApplication()->getUserState('mod_jumi.daten', json_encode(array()));
$dbDaten = json_decode($jsonDaten);
echo $dbDaten;
?>

Ich habe mir die Jumi-Module mal geholt und installiert. Der Code wird da mit eval() ausgeführt, jedenfalls in der Version für 2.5. Und dieses eval() hat auch so seine Besonderheiten, was den Namensraum von Variablen betrifft.
php.net/manual/de/function.eval.php

Ob das mit dem JSON-String nötig ist, und welchen default-Wert die Session-Daten haben sollten, musst du wissen, je nach Datengrösse, -Struktur und -Art, und Code für die Auswertung/Anzeige.

Mir viel noch was auf:
Die Module haben ja auch ein Caching. Würd ich ausschalten, wenn du das so wie oben mit der User-Session verwendest. Tipp zum testen: eine neue Session im Frontend gibt's immer jeweils beim Ausloggen.
Man soll das Kind ins Korn werfen solange es noch heiss ist, auch wenn das der eine Tropfen ist, der dem Fass die Krone ins Gesicht schlägt...

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

  • Seite:
  • 1