Modul beenden wenn If Bedinung erfüllt ist

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
stefkey
Beiträge: 556
Registriert: Mi 19. Okt 2005, 16:10
Wohnort: Heidelberg
Kontaktdaten:

Modul beenden wenn If Bedinung erfüllt ist

Beitrag von stefkey »

Hallo zusammen,

ich habe in einem Modul vornerweg die Abfrage ob jemand eingeloggt ist. Wie kann ich es lösen das wenn die Bedingung erfüllt ist das Modul nicht weiter ausgeführt wird. Ich möchte nicht um den ganzen Modulcode eine if-Schleife legen daher muss ich ja so vorgehen, oder?

Code: Alles auswählen

if ($auth->auth["uid"] == "nobody")
{
echo irgendwas und dann Modul abbruch
}

weiterer Modul code...
Schöne Pfingsten Euch!
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von xmurrix »

Hallo stefkey,

Der Modulcode wird im globalen Kontext ausgeführt, da kannst du auch nicht wie in einer Funktion mit der return-Anweisung den weiteren Programmablauf im Modulcode unterbrechen. Das geht nur mit einer if-Bedingung...

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Zuschauer
Beiträge: 141
Registriert: Do 5. Dez 2013, 08:57
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von Zuschauer »

Es gibt aber dennoch eine Möglichkeit, nicht den gesamten Modulcode in der if-Bedingung zu setzen: eine Funktion.

Code: Alles auswählen

function irgendwas() {
    # Modulcode
}
if ($auth->auth['uid'] != 'nobody') {
    irgendwas();
} 
Ob das so Sinn macht sei mal dahingestellt, denn der gesamte Code ist genauso im Modul und wird geparst.
Besser wäre vielleicht, die Funktion in eine externe Datei auszulagern und nur bei Bedarf (wenn User eingeloggt) einzubinden (Achtung: 4.8er Code).

Code: Alles auswählen

if ($auth->auth['uid'] != 'nobody') {
    cInclude('frontend', 'includes/meineDatei.php');
    irgendwas();
} 
Ein weiterer Vorteil hiervon ist, dass das Modul sofort mehrfach einsetzbar ist (keine doppelte Funktionsdeklaration).

Gruß
René
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von xmurrix »

Zuschauer hat geschrieben:Es gibt aber dennoch eine Möglichkeit, nicht den gesamten Modulcode in der if-Bedingung zu setzen: eine Funktion.

Code: Alles auswählen

function irgendwas() ...[/quote]
Das stimmt, man kann das auch in einer Funktion machen.

Ich persönlich rate mittlerweile davon ab, hatte schon sehr oft den Fall, dass eine Seite auf einmal nicht geht und die User nicht wissen, warum das so ist. Nicht jeder CONTENIDO User kennt sich mit Details über das CMS oder PHP aus, sie sind dann überfordert, wenn es Probleme gibt. 
Viele sich nicht nicht im klaren, dass der Modulcode im globalen Kontext ausgeführt wird. Die User verwenden Module mehrmals in einem Layout und da muss man mit Funktionen vorsichtig sein, da man sie in PHP nur einmal deklarieren kann...

Grüße
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von Faar »

xmurrix hat geschrieben:... und da muss man mit Funktionen vorsichtig sein, da man sie in PHP nur einmal deklarieren kann...
Gäbe es da nicht noch die Möglichkeit der Klasse, bei der man einfach ein neues Objekt im Modul instantiiert (solange es nicht Singleton ist)?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von xmurrix »

Faar hat geschrieben:Gäbe es da nicht noch die Möglichkeit der Klasse, bei der man einfach ein neues Objekt im Modul instantiiert (solange es nicht Singleton ist)?
Kann man auch, oder wie Zuschauer beschrieben hat, kann man die Funktion in eine Datei auslagern und diese Datei einbinden. Singleton oder statische Klasse wäre auch möglich, wenn man die Vor- und Nachteile davon weiß...

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von Faar »

xmurrix hat geschrieben:Kann man auch, oder wie Zuschauer beschrieben hat, kann man die Funktion in eine Datei auslagern und diese Datei einbinden.
Es wäre aus Sicht Vieler (und auch meiner) wahrscheinlich der einfachere und ein bewährter Weg, denn wenn die Funktionen erst einmal da sind, braucht man sie nur in eine Datei packen und diese mit include() einparken.
Der Nachteil dabei ist, man muss immer eine extra Datei mit sich herum schleppen, also Modul + include-Datei. Irgendwann passiert der Fehler bei vielen (wie ich sah), dass die Includes vergessen werden oder am falschen Ort liegen.
Daher kam ich auf die Idee der Klasse, die doch eigentlich auch zusammen mit dem Modulcode in der Modul-Datei enthalten sein könnte (if !is_object(class){class}), oder? :shock:
Singleton oder statische Klasse wäre auch möglich, wenn man die Vor- und Nachteile davon weiß...
Ja, stimmt.
Die DB-Klasse ist meistens eine Singleton, damit nur eine Instanz des DB-Zugangs läuft.
Die Vor- und Nachteile in diesem Fall kannst du uns vielleicht benennen?
Ich hab ein etwas ähnliches Problem mit den Functions in einem Modul und frag mich, ob ich sie auslagere oder eine Klasse baue.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von Oldperl »

Servus,
  1. Funktion-Includes gehören ins Modul (was bei 4.9 auch problemlos möglich ist). Mit Hilfe der cModuleHandler-Klasse kann man inzwischen auch auf den Modulpfad zugreifen und die Dateien entsprechend includieren.
  2. Um doppelte Instanzierungen zu vermeiden bietet sich die Funktion function_exists() an. Oder man nimmt ein include_once zum includieren
Ein cInclude im includes-Verzeichnis des Mandanten sollte man bei der 4.9 vermeiden, das ist eher 4.8er Vorgehen. In der 4.9er würde ich versuchen alle zum Modul gehörende Sachen auch im Modulverzeichnis zu hinterlegen, so ist ein Modularchiv leichter zu schnüren.

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
stefkey
Beiträge: 556
Registriert: Mi 19. Okt 2005, 16:10
Wohnort: Heidelberg
Kontaktdaten:

Re: Modul beenden wenn If Bedinung erfüllt ist

Beitrag von stefkey »

Danke sehr für die Infos. Ich hatte einen Denkfehler und benötige diese if-Schleife gar nicht. Sorry vielmals!
Aber trotzdem sind die Infos hier interessant. Danke und Grüße, stefkey
Antworten