Fehlermeldung in Zusammenhang mit Includes und Plugins

Hast du Probleme oder Fragen bei der Einrichtung bestimmter Plugins ? Diese kannst du hier loswerden.
Antworten
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Hallo zusammen,

Ich bin daran, ein Plugin zu entwickeln und das funktioniert soweit so gut. Ein Teil des Plugins wird im Modern Theme in der Sidebar angezeigt, von dort gibt es einen Link um die Seite komplett anzuzeigen, wie es zum Beispiel das Plugin Mitgliedsbeitrag macht. Mit dem Unterschied, dass bei letzterem die Sidebar dann nicht mehr angezeigt wird, bei mir aber schon.

Wie gesagt läuft alles wie geschmiert, bis ich einen ungültigen Wert in der URL übergebe. Dieser wird mit der Funktion admFuncVariableIsValid aufgefangen.

Dies hat irgendwie zur Folge, dass die Variablen, die ich aus der Plugin-config.php lese, irgendwie gelöscht werden, und wenn ich dann die Sidebar lade, mein Plugin, wegen Fehlen dieser Werten, dann auf einen SQL-Fehler stösst. Logisch, denn die SQL sieht dann so aus (die dat_cat_id sollt in der Variable gespeichert sein):

Code: Alles auswählen

(...)
AND dat_cat_id = 
AND dat_begin >= '2011-11-30' 
(...)
Nun, was mache ich falsch? Oder gibt es da etwas, das tatsächlich im Core noch korrigiert werden müsste, damit es ein schönes Zusammenspiel mit meinem Plugin gibt?
Benutzeravatar
fasse
Administrator
Beiträge: 6165
Registriert: 12. Nov 2005, 16:06

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von fasse »

Wie hast du denn den Aufruf des includes für deine config.php eingebaut?

Hast du auch die Fehlerausgabe für PHP hoch eingestellt, so wie hier in der Doku beschrieben http://www.admidio.org/dokuwiki/doku.ph ... stellungen ?

Gruß
Fasse
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Hallo Fasse,

Selbstverständlich habe ich die erweiterten Logs eingeschaltet, allerdings bringt uns das in diesem Fall nicht weiter. Folgendermassen kannst du das Problem nachvollziehen:

1) Kopiere die Datei adm_program\modules\dates\dates.php nach adm_plugins\login_form
2) Ersetze in der neuen dates.php alle "../../system" durch "../../adm_program/system" (6 Stück)
3) Füge require_once('config.php'); nach den 5 ersten include_once und vor der Zeile
unset($_SESSION['dates_request']); in der neuen dates.php ein
4) Stelle sicher, dass die Variable $plg_rank Werte enthält

Nun zu den Tests:

1) Lade im Browser folgende Seite: adm_program/index.php und stelle fest, dass im login_form Plugin in der Sidebar etwas steht in der Art: "Anzahl Logins: 246 (Ehrenmitglied)"

2) Lade im Browser folgende Seite: adm_plugins/login_form/dates.php?mode=old und stelle fest, dass im login_form Plugin in der Sidebar etwas steht in der Art: "Anzahl Logins: 246 (#PLG_LOGIN_HONORARY_MEMBER#)" (liegt wahrscheinlich daran, dass ich die Sprachdatei nicht included habe - ist aber nicht so schlimm, wichtig ist, dass der Wert überhaupt initialisiert ist)

3) Nun zum eigentlichen Problem: Lade im Browser folgende Seite adm_plugins/login_form/dates.php?mode=foobar . Es ist klar, dass foobar kein erlaubter Wert ist und dass der Kalender auf der Hauptseite, im Gegensatz zu Szenario 2 _nicht_ angezeigt wird, stattdessen kommt die Meldung "Ungültiger Seitenaufruf". Alles gut soweit. Nur schau mal was in der Sidebar passiert? Neben Anzahl Login steht nicht mehr der Wert von $plg_rank. Dies bedeutet, dass die Variable $plg_rank von $getMode = admFuncVariableIsValid($_GET, 'mode', 'string', 'actual', false, array('actual', 'old')); oder besser gesagt von der Anzeige der Fehlermeldung unsetted worden ist, was ich als falsch erachte (oder eben, vielleicht gibt es einen anderen, korrekten Weg, um diese Situation zu bereinigen).

Im oben beschriebenen Szenario gibt es keine Fehlermeldung, weil die benutzte Variable optional ist. In meinem Plugin aber ist die Variable nicht optional und es gibt keinen "Default" Wert den man bei Fehlen einsetzen könnte. Der Wert muss zwingend aus der config.php des Plugins gelesen werden, und wenn nicht, gibt es eben einen Fehler in Form eines fehlenden Wertes in einem SQL statement.

Ich hoffe, du kannst das Problem nachvollziehen, sonst melde dich einfach, wenn du Zusatzinfos benötigst.
Benutzeravatar
fasse
Administrator
Beiträge: 6165
Registriert: 12. Nov 2005, 16:06

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von fasse »

Hallo Eiseli,

Benutzt du die kopierte dates.php dann wie ein Plugin ? Also wird der dates.php-Inhalt dann nicht als Hauptseite, sondern so wie bei den anderen Plugins angezeigt.

Wenn dem so ist, dann liegt der Fehler darin, wie du die includes definierst. Wenn du einfach

Code: Alles auswählen

include("config.php");
schreibst, und die dates.php so einbindest, wie ein Plugin, dann sucht PHP die config.php an der Stelle an der die eigentliche Seite liegt, die du aufrufst.

Aus diesem Grund ermitteln wir bei unseren Plugins auch immer diesen PLUGIN_PATH und setzen den bei jedem include. Dies ist dann ein absoluter Pfad und dann ist es egal, von wo und wie dates.php aufgerufen wird.

Gruß
Fasse
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Hallo Fasse,

Danke für deinen Hinweis, allerdings war das ein Fehler von mir, habe den Pfad im Forum Post nicht mit reingenommen. Da hast du natürlich Recht, wenn die Seite nicht direkt geladen würde, dann würde auch die config-Datei nicht gefunden.

Dem ist aber nicht so, denn die Seite wird selber nicht included, sondern direkt aufgerufen, wie eine Modul-Seite.

Am besten guckst du dir den gesamten Code an, habe ihn soeben eingecheckt:

https://sourceforge.net/p/admidiocsa/co ... force=True
Benutzeravatar
fasse
Administrator
Beiträge: 6165
Registriert: 12. Nov 2005, 16:06

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von fasse »

hmm, ich glaube wir schreiben aneinander vorbei. In deinem ersten Post redest du von einem Plugin, was in der Seitenleiste ist und auch angezeigt werden soll, wenn eine Fehlermeldungsseite generiert wird. Du postest jetzt aber den Code einer Seite, die vollständig aufgerufen wird.

Zur Fehleranalyse wäre aber der Code des Seitenleistenplugins interessant.

Gruß
Fasse
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Hallo Fasse,
hmm, ich glaube wir schreiben aneinander vorbei.
Allerdings...
In deinem ersten Post redest du von einem Plugin,
Richtig, wobei hier wahrscheinlich der Anfang des Misverständnisses liegt. Für mich ist es ein Plugin, ich habe aber mittlerweile verstanden, dass bei Admidio nur dann von einem Plugin gesprochen wird, wenn es in der Sidebar angezeigt wird. Richtig?

Bei mir ist das Plugin sowohl ein include in der sidebar (wie das login_form-Plugin) als auch eine "ganz normale Seite" wie etwa die Modul-Seiten.
was in der Seitenleiste ist und auch angezeigt werden soll, wenn eine Fehlermeldungsseite generiert wird.
richtig, wie zum Beispiel der Aufruf adm_program/modules/dates/dates.php?mode=alt eine Fehlermeldung "Ungültiger Seitenaufruf" generiert, aber dennoch die Sidebar mit allen Plugins lädt.
Du postest jetzt aber den Code einer Seite, die vollständig aufgerufen wird.

Zur Fehleranalyse wäre aber der Code des Seitenleistenplugins interessant.
Nun, das Seitenleistenplugin ist http://sourceforge.net/p/admidiocsa/cod ... force=True

Wenn du meine Konfiguration nachbauen willst habe ich hier eine kleine Anleitung: http://sourceforge.net/p/admidiocsa/wik ... anleitung/
Benutzeravatar
fasse
Administrator
Beiträge: 6165
Registriert: 12. Nov 2005, 16:06

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von fasse »

Das mag ja alles sein, aber wenn du schreibst, dass etwas in der Seitenleiste bei einer Fehlermeldung nicht angezeigt wird, dann kann der Fehler nicht in deinem Hauptplugin (dates.php) liegen, sondern muss in einem Seitenleistenplugin liegen. Folglich ist dort der Fehler zu suchen oder evtl. in der Hinweisklasse. Gelten denn meine Aussagen bzw. des Aufrufs auch für alle deine integrierten Seitenleistenplugins ?

Oder willst du etwa in der Seitenleiste auf Einstellungen deines dates.php zugreifen ? Das geht nämlich dann nicht so einfach ...
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Nun, ich stelle einfach fest:
1) das Seitenleisten-Plugin funktioniert einwandfrei nämlich:
- config-Datei wird eingelesen
- Werte davon werden in SQL verwendet
- SQL wird korrekt ausgeführt
All dies sowohl wenn die Sidebar über eine normale Modul-Seite aufgerufen wird oder über meine abgeänderte dates.php
2) nur dann, wenn dates.php einen Fehler ausgibt (mit einem falschen Parameter aufgerufen wird) passiert folgendes
- config-Datei wird von dates.php eingelesen
- Parameter werden überprüft und Fehler ausgegeben
- Sidebar wird geladen
- mein Plugin in der Sidebar wird geladen, und da die config-Datei bereits von dates.php eingelesen wurde, wird sie nicht nochmals in meinem Plugin eingelesen (require_once)
- Werte von config-Datei fehlen nun
- da die Werte in einer SQL verwendet werden ist die Syntax der SQL nun falsch und stösst auf einen mysql bzw. PHP-Fehler.

Da die Konstellation abgeänderte dates.php + mein Sidebar-Plugin allgemein funktioniert aber nur mit der Fehlermeldung nicht, gehe ich davon aus, dass die Fehlermeldung Verursacher des Problems ist. Und auch wenn nicht frage ich mich, wieso Werte, die über eine eine config-Datei included werden, plötzlich nicht mehr vorhanden sind...
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Hallo,

Ich bin dem Problem nun auf die Schliche gekommen. Ist eigentlich ganz logisch.

Der overall_footer wird von message->show() aufgerufen. Solange mein config noch nicht geladen wird wird er zu dem Zeitpunkt geladen.

Wenn das config aber bereits geladen wurde, und solange nicht jede einzelne darin definierte Variable mittels global in die Methode show übergeben wird, fehlt sie dann wenn overall_footer aufgerufen wird.

Ich bediene mich aber sehr ungerne eines solchen Hacks, da die Methode ja sehr global funktionieren soll, sollte also auch in Plugins funktionieren. Und dass Plugins ihre Variablen dort eintragen müssen, macht für mich null Sinn.

Deshalb mein Vorschlag: wäre es nicht sinnvoller, die message Klasse nur fürs Anzeigen von Meldungen zu benutzen, und das Anzeigen des overall_footer an jeder Stelle zu includen wo er gewünscht wird?

Oder gibt es eine möglichkeit, alle definierten Variablen in ein Array zu packen, das Array per global überzugeben und sie in der Methode aus dem Array rauszulösen?

Naja, wirres Zeugs, ich weiss, aber mir fällt gerade echt nichts ein, was man eine gute Lösung nennen könnte.
eiseli
Beiträge: 42
Registriert: 21. Nov 2011, 11:08

Re: Fehlermeldung in Zusammenhang mit Includes und Plugins

Beitrag von eiseli »

Nachtrag: oder vielleicht einfach im Plugin das require_once durch ein require ersetzen, da nur Variablen definiert werden und diese von anderen Scripts nur gelesen und nicht geändert werden, ist dies ja keineswegs problematisch, oder?
Antworten