Benachrichtigungen für eigene Zwecke nutzen

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Antworten
dieter99
Mitglied
Beiträge: 430
Registriert: 07.04.2005 20:09

Benachrichtigungen für eigene Zwecke nutzen

Beitrag von dieter99 »

Hallo,
ich möchte gerne aus einem eigenen PHP-Script heraus Benachrichtigungen erzeugen. Welche Klassen muss ich einbinden, und was gibt es zu beachten?
Vielen Dank für die Unterstützung.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von gn#36 »

Hierzu musst du eine Erweiterung erstellen, die "notification.types" zur Verfügung stellt. Das sind im Prinzip Klassen, die genau definieren, was den Benutzern angezeigt wird, welchen Inhalt die E-Mails haben und wer die Konfigurationsoption im Persönlichen Bereich dazu sehen können soll, wie diese bezeichnet wird und wie sie einsortiert wird. Außerdem stellt sie eine Funktion zur Verfügung, mit der die Empfänger ausgewählt werden.

Du kannst dir das ganze einfach mal bei bestehenden Erweiterungen ansehen. Zusätzlich gibt es auch eine Anleitung auf Englisch.

Der Einfachheit halber verweise ich da mal auf meine Versionsprüfungserweiterung, da die im Grunde auch nicht viel mehr macht als Benachrichtigungen zuzustellen. Die Benachrichtigungsklassen findest du unter notification (die base Klasse macht die ganze Arbeit), in der config/services.yml werden die Benachrichtigungen phpBB bekannt gegeben, in der ext.php werden sie bei der Installation der Erweiterung installiert und bei der deinstallation auch wieder entfernt. Der event listener sorgt dafür, dass auch neue Benutzer standardmäßig E-Mail Benachrichtigungen bekommen, für bestehende Nutzer wird dies in der ext.php miterledigt.

Verschickt werden sie vom Cronjob.

Außerdem hilfreich: viewtopic.php?f=140&t=235138
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
dieter99
Mitglied
Beiträge: 430
Registriert: 07.04.2005 20:09

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von dieter99 »

Kann mir bitte jemand verraten, was in der Tabelle "phpbb_notifications" die Spalte "item_id" und "item_parent_id" zu bedeuten hat?

Und in welcher Datei finde ich die Klasse, die für die Methode $phpbb_container->get('notification_manager') zuständig ist? In der Datei "includes/functions.php" habe ich beispielsweise nichts gefunden.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von gn#36 »

Wenn du nach neueren Klassen suchst findest du die fast immer im Unterordner phpbb sinnvoll einsortiert (Ausnahme: Modulklassen des ACP, UCP und MCP, sowie einige wenige von phpBB 3.0.x übernommene Klassen sind im includes Ordner). Funktionen hingegen liegen unter includes. Den notification_manager beispielsweise unter phpbb/notification/manager.php Im Zweifel kannst du in den Konfigurationsdateien im config/ Verzeichnis nachsehen, wo ein bestimmter service abgelegt ist. Ansonsten hilft eigentlich eine Dateisuche, die auf die Ordner phpbb und includes beschränkt wird fast immer, wenn ich irgendwas suche. Alles was gegenüber phpBB 3.0.x neu ist findest du normalerweise unter phpbb, alles was vorher schon da war unter includes. Wenn du ein Beispiel hast kannst du auch nach dem namespace gehen: Dinge im namespace \phpbb\... liegen unter phpbb/..., wobei der Unterordner dem Namespace entspricht, Dinge im namespace \ liegen im includes Ordner, Dinge im namespace \symfony\... liegen unter vendor/symfony/....

item_id und item_parent_id dienen zur Zuordnung einer Benachrichtigung. Wenn du z.B. aufgrund eines posts benachrichtigt wirst, dann wird als item_id die post_id verwendet. Die parent_id wird mit der topic_id gefüllt, so dass man anhanddessen sehr schnell alle Benachrichtigungen zu Posts eines Themas finden kann. Die item_id kann z.B. verwendet werden, um Duplikate zu vermeiden (also beispielsweise zwei Benachrichtigungen zum selben Post).

Bei deinen eigenen Benachrichtigungen kannst du den Wert dieser Felder aber frei wählen (bei der item_id bin ich mir da gerade nicht 100% sicher, die parent_id ist definitiv frei wählbar), die Bedeutung ist nicht auf post_id o.ä. festgelegt sondern hängt von der Benachrichtigung ab. Für meine Erweiterungsbenachrichtigungen habe ich z.B. eine item_id auf Basis der Extension Version und dem Extension Namen gewählt und eine parent_id auf Basis des Extension Namen. Das erlaubt mir zu einem späteren Zeitpunkt alle zu einer Erweiterung gehörigen Benachrichtigungen zu finden und zu löschen (z.B. wenn eine Erweiterung nicht mehr existiert), außerdem kann ich feststellen, ob ich über eine bestimmte Version schon mal eine Benachrichtigung erstellt habe. Wenn du die parent_id nicht brauchst, dann kannst du sie z.B. einfach immer auf 0 setzen. Ich würde die Felder aber versuchen sinnvoll zu setzen, so dass du sie ggf. später dann nutzen kannst, selbst wenn du das jetzt vielleicht noch nicht möchtest.

EDIT: Der phpbb_container wird von Symfony bereitgestellt. Du findest ihn hier: vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php. Im phpbb Ordner gibt es einen Unterordner phpbb/di der ebenfalls Klassen zur dependency Injection enthält.

Die Klasse container_builder ist beispielsweise für das erstellen des Kontainers zuständig.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
dieter99
Mitglied
Beiträge: 430
Registriert: 07.04.2005 20:09

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von dieter99 »

Zunächst einmal vielen Dank für die ausführliche Erklärung.

Um die Funktionsweise der Benachrichtigungen besser verstehen zu können, möchte ich in meinem eigenen PHP-Script einen einfachen Test machen, ohne jetzt über eine Extension gehen zu müssen.

Schritt 1:
Datei "phpbb/notification/manager.php" includen

Schritt 2:
Methode "add_notifications_for_users($notification_type_name, $data, $notify_users)" ausführen.

Als "$notification_type" nehme ich beispielsweise "notification.type.post".

Und jetzt kommen die Fragen:
a) was muss unter "$data" aufgeführt werden? In der Datenbank sehe ich ein serialisiertes Array, welches z.B. die Werte [poster_id], [topic_title], [post_subject], [post_username], [forum_id] und [forum_name] enthalten KANN. Welche Werte sind denn zwingend vorgeschrieben?

b) werden unter "$notify_users" nur die User IDs der zu benachrichtigen User in Form eines Arrays eingetragen? Beispiel: array(12,19,35,38)? Oder handelt es sich hier um ein assoc. Array?


Der nächste Schritt wäre dann, in der Datenbank einen eigenen notification_type_name festzulegen. Wo liegt die Intelligenz die besagt: "wenn notification_type_name=='meineEigeneNotification', dann zeige Benachrichtigung 'meinBenachrichtigungsTemplate' mit $data - Array Werten [wert1],[wert2],[wert3]
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von gn#36 »

Dafür musst du dir die zugehörige Klasse ansehen. Was an Daten da drin steht hängt nämlich von der jeweiligen Notification ab. Da steht im Grunde das notwendigste drin, was die notification braucht, um Mails zu generieren oder die Nachricht anzuzeigen. Schau einfach in die entsprechende Datei in phpbb/notification/type.

Normalerweise lässt man die Notification selbst bestimmen, wer benachrichtigt werden soll. Dafür gibt es add_notifications. Wenn du das nicht machen willst sondern genau weißt, für wen du die hinzufügst (ggf. auch unabhängig von deren Einstellungen zu dieser notification im UCP), dann kannst du natürlich ein Array in $notify_users schreiben. Da müssen dann user_ids rein, also genau wie dein Beispiel.

Du wirst nicht darum herum kommen eine Erweiterung mit der entsprechenden Benachrichtigung zu realisieren.

Die "Intelligenz" liegt nämlich in der Konfigurationsdatei deiner Erweiterung. Es ist zwingend notwendig dass du eine Erweiterung dafür erstellst, damit phpBB diese Konfigurationsdatei auch einliest. Alternativ kannst du zwar auch die Core Konfigurationsdateien verändern, aber der Aufwand ist derselbe (da müssen logischerweise genau die gleichen Infos rein) und dann kannst du es auch in eine Erweiterung schreiben, ist nur eine composer.json Datei mehr zu erstellen. Die Konfigurationsdatei enthält eine service-Definition mit dem selben Namen wie der Wert, der in der Datenbank landet, außerdem ist die Definition getaggt, so dass der notification_manager sie finden kann (siehe Beispiele oben).

Für die Anzeige musst du den in der Konfigurationsdatei definierten Service dann als Klasse realisieren. Die Klasse muss zwingend das interface phpbb/notification/type/type_interface implementieren, damit der manager die Klasse für die Anzeige laden kann. Für die Anzeige greift der manager auf die passenden Methoden der Klasse zurück, die Titel, Bildchen, Text usw. liefern. Deshalb muss die Klasse zwingend existieren, damit eine Anzeige stattfinden kann. Ohne Klasse legst du mit einem Datenbankeintrag das komplette Forum lahm, sobald die notification angezeigt werden müsste (also wenn der User, an den sie geschickt wurde das Forum ansieht).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
dieter99
Mitglied
Beiträge: 430
Registriert: 07.04.2005 20:09

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von dieter99 »

Ich glaube die Sache ist mir dann doch etwas zu komplex, weshalb ich auf einen EIGENEN notification_type_name verzichten werde.
D.h. ich nehme für meine Zwecke den Typ "report_post", somit muss ich nur die Datenbank füllen und gut ist.

Jedoch hätte ich trotzdem eine kleine Änderung:

Wenn in der Spalte "item_id" oder "item_parent_id" ein bestimmter Wert steht, dann soll die verlinkte Benachrichtung nicht auf "ucp.php/....." verweisen, sondern auf "meineEigeneSeite.php".

Könnt ihr mir nochmal helfen? Wo muss ich in diesem Fall ansetzen?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Benachrichtigungen für eigene Zwecke nutzen

Beitrag von gn#36 »

Wenn deine Notification nicht das selbe tun soll wie die vorhandene (also in diesem Fall auf einen speziellen Post oder die Meldung dazu hinweisen und verlinken), dann kannst du sie nicht so ohne weiteres recyclen. Jede der notification.type Klassen hat ganz genau einen Zweck und ist so ausgelegt, dass sie genau diesen Zweck mit möglichst wenig Aufwand erfüllt. Das bedeutet aber, dass sie schwierig bis gar nicht für andere Zwecke eingesetzt werden kann.

Die Verlinkung wird von der Klasse gemacht, anhand der Daten in der DB. Genauso bestimmt die Klasse den Text, der angezeigt wird. Ohne Änderungen an der Klasse kannst du auch den nicht ändern. Und wenn du das änderst, dann funktioniert der reguläre Zweck der Klasse vermutlich nicht mehr richtig.

Das Erstellen einer eigenen Klasse ist aber nicht so schwer, wenn du dich einfach an die Anleitung auf phpbb.com hältst, die ich weiter oben verlinkt habe. Die geht Schritt für Schritt alle Dinge durch, die du machen musst. Anhanddessen kannst du im Zweifel auch rückschließen, was du an vorhandenen Klassen ändern musst, wenn du wirklich unbedingt eine vorhandene Klasse zweckendfremden willst.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Extension Bastelstube“