Ich denke, dass du erst mal verstehen musst, wie eine phpBB Erweiterung technisch funktioniert, danach ist dir auch sehr schnell klar, was wie wohin muss.
Hier gibt es vom Verständnis her eigentlich in meinen Augen zwei wichtige Dinge:
- Es gibt ein paar Stellen, an denen phpBB automatisch nach Dateien mit speziellen Namen sucht:
- In allen Unter-Unterordnern des
ext/
Verzeichnisses (also z.B. ext/unterordner/unterunterordner
) wird beim Aufruf der ACP Seite, die die Erweiterungen auflistet nach einer composer.json gesucht. Diese enthält die Bezeichnung der Erweiterung und einige grundlegende Informationen über die Erweiterung (z.B. Autor, Version, ggf. Abhängigkeiten etc.)
- Dort wird bei jeder Löschung des Caches und bei aktivierter Erweiterung im Ordner
config/
nach der Datei service.yml und routing.yml gesucht
- Die service.yml enthält alle von dir definierten php Klassen, die in der Erweiterung vorkommen und macht sie phpBB bekannt. Sie wird bei jeder Interaktion zwischen PHP Klassen der Erweiterung und phpBB gebraucht
- Die routing.yml gibt phpBB bekannt, unter welchen URLs Teile der Erweiterung innerhalb von phpBB erreichbar sein sollen und welche PHP Klassen und welche deren Methoden bei der Verwendung dieser URLs aufgerufen werden sollen. Sie wird daher bei Erweiterungen mit eigenständigen Unterseiten benötigt.
- Dort wird bei jeder Installation, Deaktivierung und Löschung der Erweiterung über das ACP nach der optionalen Datei
ext.php
gesucht. Diese kann verwendet werden, um den Ablauf des Installationsprozesses zu verändern
- Dort wird bei der Installation und jeder Aktivierung oder Löschung von Erweiterungen im Ordner
migrations/
nach beliebigen php Dateien gesucht
- Dort wird bei aktiver Erweiterung im Unterverzeichnis
styles/[stylename]/template/event/
nach Styledateien mit speziellen Namen gesucht die automatisch verwendet werden
- Styledateien werden allgemein unter
styles/[stylename]/template
bzw. styles/[stylename]/theme
erwartet, sprachdateien entsprechend unter language/[iso]/
, die automatisierten Tools suchen dort nach den Dateien.
- Dort wird in den Sprachdateiverzeichnissen
language/[iso]/
nach php Dateien mit speziellen Namen gesucht (permission_xxx.php
sowie info_(u|m|a)cp_xxx.php
) die beim Aufruf einiger spezieller phpBB Seiten automatisch eingebunden werden (z.B. die permission_xxx.php Dateien wenn man im ACP die Rechte einstellt, die info_xxx Dateien, wenn man sich im ucp, mcp oder acp befindet (gedacht für Menüeinträge)).
- Alles was eine Erweiterung tut muss über die beiden Konfigurationsdateien im
config/
Ordner konfiguriert werden, oder in einer der automatisch eingebundenen Dateien stattfinden. Der Ablauf ist also gedanklich immer phpBB (-> routing.yml) -> service.yml -> deine Klasse oder phpBB -> deine Klasse an einer speziellen Stelle.
PHP Code kann naturgemäß nur in einer der php Dateien ausgeführt werden, daher muss für praktisch alles was nicht nur bei der Installation der Erweiterung Dinge tun soll ein Eintrag in der service.yml und ggf. in der routing.yml erfolgen. Diese beiden Dateien steuern, wie phpBB auf die Dateien der Erweiterung zugreift, um die eigentliche Tätigkeit müssen sich dann die Klassen der Erweiterung kümmern, die in der service.yml angegeben sind. Wo die PHP Dateien liegen ist aber abgesehen von obiger Liste im Grunde ziemlich egal. Du kannst, abgesehen von obigen automatischen Dingen, die Dateien in beliebige Unterordner der Erweiterung legen und musst nur den Namespace und die Angaben in der config.yml Datei entsprechend anpassen. Es empfielt sich aber dennoch, sich an die allgemein verwendete Struktur zu halten (controller/
für eigenständige Seiten, event/
für Klassen, die auf Events reagieren, ...) um anderen das Verständnis deiner Erweiterung nicht unnötig zu erschweren.
Hast du zufällig
dieses Thema schon entdeckt? Dave hat ein deutschsprachiges Tutorial verfasst, das schon mal sehr viel abdeckt.
Was im Tutorial fehlt sind eigenständige Seiten, also das wonach du hauptsächlich fragst. Trotzdem rate ich dir, erst mal das Tutorial nachzuvollziehen, denn eigenständige Seiten funktionieren fast genauso wie "Eingriffe in bestehenden phpBB-Code" (um mal die Bezeichnung aus dem Tutorial zu verwenden).
Du musst allerdings kein EventSubscriberInterface implementieren und benötigst auch keine
static public function getSubscribedEvents()
. Stattdessen musst du deinen Controller lediglich in der config/service.yml bekannt machen und außerdem in der config/routing.yml die URL zu deiner Seite festlegen.
Die routing.yml kommt in dem Tutorial nicht vor, daher als Hinweis hier kurz der Aufbau der Datei:
Code: Alles auswählen
# Mit # beginnen Kommentare
name_der_route_mit_beliebiger_laenge:
# Nur mit leerzeichen einruecken, nie mit tabs
# Das pattern enthaelt die gewuenschte URL vom Forum Root aus gesehen
pattern: /gewuenschte/route/zur/datei/
# In der naechsten Variable wird definiert was fuer ein Controller aufgerufen werden soll
# In der Route können auch parameter enthalten sein. In dem Fall den parameternamen in eckigen klammern an der gewünschten Stelle angeben
# z.B. /gewuenschte/route/zur/datei/{parameter_1}
defaults: { _controller: "meine.eindeutige.bezeichnung.des.controllers.aus.der.service.yml:funktionsname", parameter_1: "standardwert" }
In der service.yml muss es dazu passend dann einen Service mit der Bezeichnung
meine.eindeutige.bezeichnung.des.controllers.aus.der.service.yml
geben.
Also z.B.
Code: Alles auswählen
meine.eindeutige.bezeichnung.des.controllers.aus.der.service.yml:
# Hier muss sich der Pfad der Klassendatei wiederspiegeln
# in diesem Fall liegt die Klasse also in einer Datei mit dem Namen meincontroller.php im Ordner ext\meinname\meineerweiterung\controller\
class: meinname\meineerweiterung\controller\meincontroller
# Parameter, die der Klasse im Konstruktor übergeben werden sollen. Wenn man z.B. das Template braucht kann man es hier anfordern
# Passend dazu braucht man aber auch eine Methode '__construct(\phpbb\template\template $template) in der man das Template in eine globale Variable speichert.
arguments:
- '@template'
- '@controller.helper'
Die Klasse dazu muss dann in etwa so aussehen:
Code: Alles auswählen
namespace meinname\meineerweiterung\controller;
class meincontroller
{
// Das folgende dient u.a. dazu, in einem vernünftigen Editor das autocomplete Feature zu befüttern
// Gleichzeitig wird mit dem protected die Variable vor dem Zugriff von außen beschützt
/** @var \phpbb\template\template */
protected $template;
/** @var \phpbb\controller\helper */
protected $helper;
// Konstruktor - wird beim Erstellen des Objekts automatisch aufgerufen
public function __construct(\phpbb\template\template $template, \phpbb\controller\helper $helper)
{
// Übergebene Templatevariable speichern
$this->template = $template;
$this->helper = $helper;
// Wenn man noch weitere globale braucht, z.B. $user o.ä. dann sollten die auch passend übergeben werden (also hier und in der service.yml ergänzen)
}
// Der eigentliche Arbeitssklave
public function funktionsname($parameter_1)
{
//Hier kann man dann beliebige Dinge machen die z.B. zu einer Ausgabe führen
// Templatevariable weiterverwenden
$template = $this->template;
//... Beliebiger Code ....
// Den Link auf die in der routing.yml definierte Route bekommt man z.B. mit Hilfe von $this->helper->route('name_der_route_in_der_routing_yml')
return $this->helper->render('templatedateiname.html', $seitentitel);
}
}