Plugin-Entwicklung: Instanz hinzufügen

Plugin-Entwicklung: Instanz hinzufügen

von Frank Kammer -
Anzahl Antworten: 2

Hallo,

ich entwickle im Rahmen meines Studiums gerade ein Plugin für Moodle. Leider erhalte ich jetzt immer die Fehlermeldung "Fehler beim Schreiben der Datenbank" und ich komme einfach nicht weiter.

Bisher habe ich mittels der Moodle-Dokumentation die Plugin-DB-Tabellen spezifiziert und sie werden auch korrekt aufgesetzt und befüllt. Bisher hatte ich auch eher selten Probleme mit dem Datenbankhandling. Allerdings scheitere ich nun daran, eine Instanz des Plugins einem existierenden Kurs hinzuzufügen. Das Formular zur Bearbeitung (Name, Beschreibung, etc.) wird korrekt angezeigt. Sobald ich auf "Speichern und …" klicke bekomme ich allerdings besagten Fehler.

Um eine Lösung zu finden habe ich zum einen Debug-Ausgaben (echo) in meinen Code eingebaut. Außerdem habe ich mir das Query-Log genau angesehen (dieser eine Klick auf "Speichern" erzeugt bei mir ~400 Zeilen Query-Log). Noch dazu habe ich sogar eine zusätzliche DB-Tabelle angelegt, in die ich mittels $DB->insert_record(…) Debug-Ausgaben schreibe. Alles ohne jede Fehlermeldung. Auch habe ich mir andere Plugins angesehen und den Code verglichen. Ich bin nur einfach nicht in der Lage einen Fehler zu finden. Alle anderen Plugins, die ich zum Vergleich herangezogen habe funktionieren einwanfrei.

Für die Entwicklung habe ich mir folgende Umgebung aufgebaut:
- Moodle 3.3.2
- MySQL 5.7.20
- PHP 7.0.22
- Lighttpd 1.4.35 (ssl)

Laut dem Query-Log passiert folgendes:
1. INSERT INTO mdl_PLUGIN (name,course,intro,introformat) VALUES('Name','2','<p>Beschreibung<br></p>','1')
2. SELECT * FROM mdl_context WHERE contextlevel = '70' AND instanceid = '24' (=> NULL)
3. DELETE FROM mdl_course_modules WHERE id = '24' (Scheint zu funktionieren, weil ein SELECT NULL liefert)
4. ROLLBACK
5. ein 37-zeiliges SELECT, das ich nicht verstehe und das u.a. pagetype = 'mod-PLUGIN-mod' enthält

Ich habe auch versucht die Aufrufe nachzuvollziehen. Bei mir wird die Funktion instance(…) aus moodle/lib/accesslib.php:6910 zuerst 3x aufgerufen. Danach wird 1x meine mod_form.php aufgerufen. Anschließend wieder 3x die accesslib.php, 1x mod_form.php und schließlich noch 3x die accesslib.php. Danach ist Ruhe. Meine eigene PLUGIN_add_instance($instance) aus meiner lib.php wird gar nicht aufgerufen.

Hier auch mal eine Übersicht der Dateien, die ich für mein Plugin bereits erstellt habe:
- db
-- install.php
-- install.xml (via XMLDB-Manager)
-- services.php
-- uninstall.php
-- upgrade.php
-- upgradelib.php
- lang
-- en
--- PLUGIN.php
- externallib.php
- index.php
- lib.php
- mod_form.php
- settings.php
- version.php
- view.php

Gibt es irgendwelche Vorschläge oder Ideen, die mir helfen können den Fehler zu finden und ggf. zu beheben? Das es nicht an meiner Test-Umgebung liegt, weiß ich. Denn ich habe zusätzlich zu meiner lokalen Installation noch eine zweite auf einem Webserver installiert (ebenfalls Moodle 3.3.2, aber MariaDB 10 und PHP 5).

Freue mich über jede sinnvolle Anregung.

Beste Grüß,
Lars

Mittelwert:  -
Als Antwort auf Frank Kammer

Re: Plugin-Entwicklung: Instanz hinzufügen

von Andreas Grabs -
Nutzerbild von Besonders aktive Moodler Nutzerbild von Entwickler

Hallo Lars,

es ist schwer auf eine so allgemeine Anfrage eine Antwort zu geben.

Aktiviere bitte mal in Moodle den Debugmodus unter "Website-Administration / Entwicklung":

  • Debug-Mitteilungen: DEVELOPER
  • Debug-Mitteilungen anzeigen: Aktivieren

Du solltest dann eine etwas ausführlichere Fehlermeldung inkl. Fehlerstack bekommen.

Viele Grüße
Andreas

Als Antwort auf Andreas Grabs

Re: Plugin-Entwicklung: Instanz hinzufügen

von Frank Kammer -

Hallo Andreas,

danke für den Tipp.

Es lag tatsächlich an einem Anfänger-Fehler. Die Debug-Meldungen von Moodle haben mir zunächst auch nichts gesagt, was ich nicht schon durch nachzeichnen der Funktionsaufrufe herausgefunden hatte. Es kam die Meldung, das mein PLUGIN keine addinstance habe. Nach einigen Suchen kam dann heraus, das ich keine db/access.php angelegt hatte und dadurch die $capability mod/PLUGIN:addinstance fehlte.

Jetzt habe ich eine db/access.php mit der nötigen $capability und bin jetzt weiter gekommen.

Beste Grüße,
Lars