CINXE.COM
phpBB.de - Knowledge Base - Eigene phpBB Erweiterungen erstellen
<!DOCTYPE html> <html dir="ltr" lang="de"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>phpBB.de - Knowledge Base - Eigene phpBB Erweiterungen erstellen</title> <link rel="alternate" type="application/atom+xml" title="Feed - phpBB.de" href="/feed?sid=3167bce3b099f734a70448a7dfeb51fa"> <link rel="alternate" type="application/atom+xml" title="Feed - Neuigkeiten" href="/feed/news?sid=3167bce3b099f734a70448a7dfeb51fa"> <link rel="alternate" type="application/atom+xml" title="Feed - Neue Themen" href="/feed/topics?sid=3167bce3b099f734a70448a7dfeb51fa"> <link rel="alternate" type="application/atom+xml" title="Feed - Aktive Themen" href="/feed/topics_active?sid=3167bce3b099f734a70448a7dfeb51fa"> <!-- phpBB style name: phpBBdev1 Based on style: prosilver (this is the default phpBB3 style) Original author: Tom Beddard ( http://www.subBlue.com/ ) Modified by: phpBB.de --> <link href="./../community/assets/css/font-awesome.min.css?assets_version=280" rel="stylesheet"> <link href="./../community/styles/prosilver/theme/stylesheet.css?assets_version=280" rel="stylesheet" /> <link href="./../community/styles/phpBBdev1/theme/stylesheet.css?assets_version=280" rel="stylesheet"> <link href="./../community/styles/phpBBdev1/theme/de/stylesheet.css?assets_version=280" rel="stylesheet"> <link href="./../community/styles/phpBBdev1/theme/images/favicon/mask-icon.svg?assets_version=280" rel="mask-icon" color="#3E647B" /> <!--[if lte IE 9]> <link href="./../community/styles/prosilver/theme/tweaks.css?assets_version=280" rel="stylesheet"> <![endif]--> <link href="./../community/ext/kinerity/knowledgebase/styles/prosilver/theme/knowledgebase_controller.css?assets_version=280" rel="stylesheet" media="screen"> <link href="./../community/ext/phpbbde/pastebin/styles/prosilver/theme/pastebin.css?assets_version=280" rel="stylesheet" media="screen"> <link href="./../community/ext/rmcgirr83/contactadmin/styles/prosilver/theme/imageset.css?assets_version=280" rel="stylesheet" media="screen"> </head> <body id="phpbb" class="nojs notouch section-app/kb/viewarticle ltr "> <div id="wrap" class="wrap"> <a id="top" class="top-anchor" accesskey="t"></a> <div id="page-header"> <div class="headerbar" role="banner"> <div class="inner"> <div id="site-description" class="site-description"> <a id="logo" class="logo" href="./../" title="Startseite"> <span class="site_logo"></span> </a> <h1>phpBB.de</h1> <p>phpBB.de - Die deutsche phpBB-Community</p> <p class="skiplink"><a href="#start_here">Zum Inhalt</a></p> </div> <div id="search-box" class="search-box search-header" role="search"> <form action="./../community/search.php?sid=3167bce3b099f734a70448a7dfeb51fa" method="get" id="search"> <fieldset> <input name="keywords" id="keywords" type="search" maxlength="128" title="Suche nach Wörtern" class="inputbox search tiny" size="20" value="" placeholder="Suche…" /> <button class="button button-search" type="submit" title="Suche"> <i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">Suche</span> </button> <a href="./../community/search.php?sid=3167bce3b099f734a70448a7dfeb51fa" class="button button-search-end" title="Erweiterte Suche"> <i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">Erweiterte Suche</span> </a> <input type="hidden" name="sid" value="3167bce3b099f734a70448a7dfeb51fa" /> </fieldset> </form> </div> <div id="phpbbde_navigation" class="phpbbde_navigation"> <div class="menu-button"> <a href="#" id="navi-toggle" title="Menü anzeigen">Menü</a> </div> <ul id="mainnavi" class="mainnavi"> <li class="mainnavi-title">phpBB.de - Navigation</li> <li class="navi-button but-about"> <a href="./../phpbbde/?sid=3167bce3b099f734a70448a7dfeb51fa"><span class="subnavi-toggle"></span>Über uns</a> <ul class="subnavi"> <li><a href="./../phpbbde/chronik/?sid=3167bce3b099f734a70448a7dfeb51fa">phpBB.de-Chronik <span>Die Geschichte von phpBB.de in Wort und Bild</span></a></li> <li><a href="./../phpbbde/team/?sid=3167bce3b099f734a70448a7dfeb51fa">Das Team <span>Erfahre mehr über das Team hinter phpBB.de</span></a></li> <li><a href="./../phpbbde/fragen/?sid=3167bce3b099f734a70448a7dfeb51fa">Fragen an das Team <span>Ihr habt gefragt, wir haben geantwortet</span></a></li> <li><a href="/contactadmin?sid=3167bce3b099f734a70448a7dfeb51fa">Kontaktformular <span>Formular zur Kontaktaufnahme mit dem phpBB.de-Team</span></a></li> <li><a href="./../phpbbde/impressum/?sid=3167bce3b099f734a70448a7dfeb51fa">Impressum <span>Das phpBB.de-Impressum</span></a></li> </ul> </li> <li class="navi-button but-phpbb"> <a href="./../infos/?sid=3167bce3b099f734a70448a7dfeb51fa"><span class="subnavi-toggle"></span>phpBB</a> <ul class="subnavi"> <li><a href="./../infos/?sid=3167bce3b099f734a70448a7dfeb51fa">Infos über phpBB <span>Erfahre mehr über phpBB</span></a></li> <li><a href="./../infos/tour/?sid=3167bce3b099f734a70448a7dfeb51fa">Die phpBB-Tour <span>Was ist phpBB und wo bekomme ich es?</span></a></li> <li><a href="./../infos/features/?sid=3167bce3b099f734a70448a7dfeb51fa">Feature-Vergleich <span>Lerne alle Features kennen, die dir phpBB bietet</span></a></li> <li><a href="./../infos/anpassen/?sid=3167bce3b099f734a70448a7dfeb51fa">phpBB anpassen <span>Nutze Erweiterungen und Styles, um phpBB deinen Wünschen anzupassen</span></a></li> <li><a href="./../infos/entwickler/3.3/?sid=3167bce3b099f734a70448a7dfeb51fa">Informationen für Entwickler <span>phpBB-Projektarchiv, nützliche Links, ...</span></a></li> <li><a href="./../xref/3.3/?sid=3167bce3b099f734a70448a7dfeb51fa">Cross-Referenz 3.3 <span>Cross-Referenz des phpBB-Quellcodes</span></a></li> </ul> </li> <li class="navi-button but-downloads"> <a href="./../downloads/?sid=3167bce3b099f734a70448a7dfeb51fa"><span class="subnavi-toggle"></span>Downloads</a> <ul class="subnavi"> <li><a href="./../downloads/pakete/?sid=3167bce3b099f734a70448a7dfeb51fa">phpBB-Pakete <span>Die aktuellen dt. Komplett- und Updatepakete von phpBB</span></a></li> <li><a href="./../downloads/sprachpakete/?sid=3167bce3b099f734a70448a7dfeb51fa">Sprachpakete <span>Die aktuellen deutschen Sprachdateien für phpBB</span></a></li> <li><a href="./../downloads/entwicklung/?sid=3167bce3b099f734a70448a7dfeb51fa">Entwicklung <span>Entwickler-Downloads</span></a></li> </ul> </li> <li class="navi-button but-docu"> <a href="./../support/?sid=3167bce3b099f734a70448a7dfeb51fa"><span class="subnavi-toggle"> </span>Support</a> <ul class="subnavi"> <li><a href="./../support/doku/quickstart/3.3/?sid=3167bce3b099f734a70448a7dfeb51fa">Schnelleinstieg <span>Erklärt dir die Einrichtung deines phpBB Boards</span></a></li> <li><a href="https://www.phpbb.de/help/faq">Häufig gestellte Fragen <span>Häufige Fragen im Zusammenhang mit der Nutzung von phpBB</span></a></li> <li><a href="./../kb/index?sid=3167bce3b099f734a70448a7dfeb51fa">Knowledge Base <span>Unsere Wissensdatenbank mit vielen und hilfreichen Artikeln</span></a></li> <li><a href="./../support/videos/?sid=3167bce3b099f734a70448a7dfeb51fa">Videos <span>Unsere Supportvideos erklären Funktionen von phpBB</span></a></li> <li><a href="./../support/doku/?sid=3167bce3b099f734a70448a7dfeb51fa">Dokumentation <span>Hier findest Du Dokumentationen zu phpBB</span></a></li> <li><a href="./../support/doku/perror/?sid=3167bce3b099f734a70448a7dfeb51fa">MySQL-Fehlercodes <span>Mysql Fehlercodes dokumentiert</span></a></li> <li><a href="./../support/doku/htpasswd/?sid=3167bce3b099f734a70448a7dfeb51fa">.htpasswd-Generator <span>Einfach zu bedienener Generator für .htpasswd Dateien</span></a></li> </ul> </li> <li class="navi-button but-community"> <a href="./../community/?sid=3167bce3b099f734a70448a7dfeb51fa"><span class="subnavi-toggle"> </span>Community</a> <ul class="subnavi"> <li><a href="./../community/viewforum.php?f=145&sid=3167bce3b099f734a70448a7dfeb51fa">Supportforen <span>Hilfe bei der Installation und Benutzung</span></a></li> <li><a href="./../community/viewforum.php?f=104&sid=3167bce3b099f734a70448a7dfeb51fa">Communityforen<span>Allgemeine Diskussionen und phpBB-Usergroups</span></a></li> <li><a href="./../community/viewforum.php?f=148&sid=3167bce3b099f734a70448a7dfeb51fa">Extension-Foren<span>Auf der Suche nach einer Extension? Fragen zu einer Extension?</span></a></li> <li><a href="./../community/viewforum.php?f=152&sid=3167bce3b099f734a70448a7dfeb51fa">Styleforen<span>Du suchst einen neuen Style oder hast Probleme mit einem Style?</span></a></li> <li><a href="./../kb/knigge?sid=3167bce3b099f734a70448a7dfeb51fa">Der kleine phpBB.de-Knigge <span>Eine kleine Liste von wichtigen Regeln auf phpBB.de</span></a></li> <li><a href="./../phpbbde/chat/?sid=3167bce3b099f734a70448a7dfeb51fa">Discord / Chat <span>Besuche den Discord-Server oder den Chat auf Freenode</span></a></li> </ul> </li> </ul> </div> </div> </div> <div class="navbar" role="navigation"> <div class="inner"> <ul id="nav-main" class="nav-main linklist" role="menubar"> <li id="quick-links" class="quick-links dropdown-container responsive-menu" data-skip-responsive="true"> <a href="#" class="dropdown-trigger"> <i class="icon fa-bars fa-fw" aria-hidden="true"></i><span>Schnellzugriff</span> </a> <div class="dropdown"> <div class="pointer"><div class="pointer-inner"></div></div> <ul class="dropdown-contents" role="menu"> <li class="separator"></li> <li> <a href="./../community/search.php?search_id=unanswered&sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-file-o fa-fw icon-gray" aria-hidden="true"></i><span>Unbeantwortete Themen</span> </a> </li> <li> <a href="./../community/search.php?search_id=active_topics&sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-file-o fa-fw icon-blue" aria-hidden="true"></i><span>Aktive Themen</span> </a> </li> <li class="separator"></li> <li> <a href="./../community/search.php?sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-search fa-fw" aria-hidden="true"></i><span>Suche</span> </a> </li> <li class="separator"></li> <li> <a href="./../phpbbde/team.php?sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>Das Team</span> </a> </li> <li class="separator"></li> </ul> </div> </li> <li data-skip-responsive="true"> <a href="./../help/faq?sid=3167bce3b099f734a70448a7dfeb51fa" rel="help" title="Häufig gestellte Fragen" role="menuitem"> <i class="icon fa-question-circle fa-fw" aria-hidden="true"></i><span>FAQ</span> </a> </li> <li data-last-responsive="true"><a href="/pastebin/?sid=3167bce3b099f734a70448a7dfeb51fa" title="Pastebin"><i class="icon fa-clipboard fa-fw" aria-hidden="true"></i><span>Pastebin</span></a></li> <li class="rightside" data-skip-responsive="true"> <a href="./../community/ucp.php?mode=login&redirect=..%2Fapp.php%2Fkb%2Fviewarticle%3Fa%3D19&sid=3167bce3b099f734a70448a7dfeb51fa" title="Anmelden" accesskey="x" role="menuitem"> <i class="icon fa-power-off fa-fw" aria-hidden="true"></i><span>Anmelden</span> </a> </li> <li class="rightside" data-skip-responsive="true"> <a href="./../community/ucp.php?mode=register&sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-pencil-square-o fa-fw" aria-hidden="true"></i><span>Registrieren</span> </a> </li> </ul> <ul id="nav-breadcrumbs" class="nav-breadcrumbs linklist navlinks" role="menubar"> <li class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList"> <span class="crumb" itemtype="https://schema.org/ListItem" itemprop="itemListElement" itemscope><a itemprop="item" href="./../" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span itemprop="name">Startseite</span></a><meta itemprop="position" content="1" /></span> <span class="crumb" itemtype="https://schema.org/ListItem" itemprop="itemListElement" itemscope><a itemprop="item" href="./../community/index.php?sid=3167bce3b099f734a70448a7dfeb51fa" accesskey="h" data-navbar-reference="index"><span itemprop="name">Community</span></a><meta itemprop="position" content="2" /></span> <span class="crumb" itemtype="https://schema.org/ListItem" itemprop="itemListElement" itemscope><a itemprop="item" href="/kb/index?sid=3167bce3b099f734a70448a7dfeb51fa"><span itemprop="name">Knowledge Base</span></a><meta itemprop="position" content="3" /></span> </li> <li class="rightside responsive-search"> <a href="./../community/search.php?sid=3167bce3b099f734a70448a7dfeb51fa" title="Zeigt die erweiterten Suchoptionen an" role="menuitem"> <i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">Suche</span> </a> </li> </ul> </div> </div> </div> <a id="start_here" class="anchor"></a> <div id="page-body" class="page-body" role="main"> <div id="p19" class="post bg1"> <div class="inner"> <div class="article-body"> <div class="postbody"> <div id="post_content19"> <h2 class="article-title"><a href="/kb/viewarticle?a=19&sid=3167bce3b099f734a70448a7dfeb51fa">Eigene phpBB Erweiterungen erstellen</a></h2> <p class="article-meta"><strong>Geschrieben von:</strong> <a href="./../community/memberlist.php?mode=viewprofile&u=28811&sid=3167bce3b099f734a70448a7dfeb51fa" style="color: #BA0303;" class="username-coloured">Crizzo</a><br> <strong>Veröffentlicht am:</strong> 10.02.2020 11:34<br /> <strong>zuletzt geändert:</strong> 30.12.2023 17:03<br> <strong>zuletzt geändert von:</strong> <a href="./../community/memberlist.php?mode=viewprofile&u=133591&sid=3167bce3b099f734a70448a7dfeb51fa" style="color: #2B42AF;" class="username-coloured">Scanialady</a><br> <strong>Zugriffe:</strong> 14982</p> <p class="article-description"><strong>Beschreibung:</strong> Dieser Artikel behandelt die grundlegenden Themen der Erweiterungserstellung</p> <p class="article-categories"><strong>Kategorie:</strong> <a href="/kb/index?c=4&sid=3167bce3b099f734a70448a7dfeb51fa">Extensions</a></p> <div class="content"> <div class="codebox"> <p>Link zu diesem Artikel: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p> <code>[url=https://www.phpbb.de/kb/viewarticle?a=19&sid=3167bce3b099f734a70448a7dfeb51fa]Knowledge Base - Eigene phpBB Erweiterungen erstellen[/url]</code> </div> <hr> Dieser Artikel behandelt die grundlegenden Themen der Erweiterungserstellung. Weiterführende Themen finden sich im Artikel <a href="https://www.phpbb.de/kb/viewarticle?a=18" class="postlink">Eigene phpBB Erweiterungen erstellen (Fortgeschrittene Themen)</a><br> <br> In phpBB ist es ab Version 3.1 möglich, Erweiterungen zu installieren, die das Verhalten von phpBB ändern, ohne dass es nötig ist, den vorhandenen Quellcode von phpBB selbst zu verändern. Dies hat für den Administrator diverse Vorteile, beispielsweise vereinfacht es das phpBB Update, aber auch die Installation und das Update von Erweiterungen wird sehr viel einfacher, beide bestehen normalerweise nur noch im Ersetzen der alten Dateien durch neue. Verfügbare Erweiterungen decken schon eine ganze Menge an Wünschen ab, aber oft gibt es doch noch Kleinigkeiten, die man nicht über verfügbare Erweiterungen anpassen kann. Auch in phpBB 3.1 und neuer lässt sich nach wie vor der phpBB Quellcode ändern um diese Änderungen zu erzielen - mit dem Nachteil, dass Updates wieder erheblich komplizierter werden. In vielen Fällen könnte man allerdings auch sehr einfach eine kleine Erweiterung erstellen, die genau das gleiche bewirkt und alle Vorteile von Erweiterungen in der Erweiterungsdatenbank mit sich bringt. <br> <br> Insbesondere reine Templateänderungen lassen sich häufig mit sehr wenig zusätzlichem Aufwand in einer Erweiterung unterbringen. Hierzu braucht man im Regelfall lediglich den zusätzlichen HTML Code in eine eigene Datei mit dem richtigen Namen an die richtige Stelle legen (ggf. auch mehrere Dateien, wenn z.B. vorhandener Quellcode von zwei HTML Teilen eingeschlossen werden soll) und eine zusätzliche Datei mit dem Namen <code class="inline">composer.json</code> erstellen.<br> <br> Im Folgenden ist die Erstellung solch einer Mini-Erweiterung beschrieben - der Artikel eignet sich daher ideal für Einsteiger in die Entwicklung von Erweiterungen. Zunächst wird die grobe Funktionsweise von phpBB bei der Einbindung von Erweiterungen beschrieben, um einen groben Überblick über das Erweiterungsverzeichnis zu geben. Anschließend folgen ein paar Anwendungsbeispiele, mit deren Hilfe sich die meisten kleineren Änderungen umsetzen lassen sollten. <br> <h4><a name="funktionsweise"></a>Einbindung von phpBB Erweiterungen in phpBB</h4> phpBB 3.1 und höher verwenden ein bekanntes PHP Framework um grundlegende Funktionen bereit zu stellen: <a href="https://symfony.com/" class="postlink">Symfony</a>. Dieses Framework stellt diverse Funktionen bereit, mit denen auch die Einbindung von Erweiterungen realisiert wird. Die genaue Funktionsweise dieses Frameworks ist für die Einbindung von Erweiterungen nicht weiter wichtig, allerdings lassen sich bei fortgeschrittener Entwicklung einige zusätzliche Symfony Features auch in Erweiterungen einsetzen. <br> <br> Für den Anfang wichtig ist zunächst, dass sehr viele Dinge bei der Einbindung einer Erweiterung automatisch ablaufen. phpBB sucht an speziellen Stellen nach Dateien und verwendet diese automatisch zur richtigen Zeit, sofern sie vorhanden sind. Seitens des Entwicklers ist hierfür nichts weiter zu tun, als die Datei mit dem richtigen Namen und richtigen Inhalt an die richtige Stelle zu legen, um alles weitere kümmert sich phpBB. Gerade das ist für viele Entwickler am Anfang verwirrend, die z.B. den sequentiellen Programmablauf in phpBB 3.0 gewöhnt sind. Hier musste PHP Code, der an einer bestimmten Stelle ausgeführt werden sollte auch an genau dieser Stelle in den Quellcode eingefügt werden. Mit phpBB 3.1 gilt das in der Form nicht mehr. Wenn man allerdings weiß, an welchen Stellen phpBB nach welchen Dateien sucht, kann man diese Dateien für den gleichen Zweck einsetzen.<br> <br> Zunächst daher hier eine Liste von Stellen, an denen phpBB automatisch nach Dateien mit speziellen Namen sucht, inklusive kurzer Beschreibung der jeweiligen Dateien: <br> <span style="font-size: 85%; line-height: normal">Wenn nicht anders angegeben, beziehen sich Orte immer auf den Hauptordner einer Erweiterung, also z.B. <code class="inline">ext/gn36/hookup/</code>, die Einbindung erfolgt außerdem normalerweise nur bei aktiver Erweiterung. </span> <ul><li>In allen Unter-Unterordnern des <code class="inline">ext/</code> Verzeichnisses (also z.B. <code class="inline">ext/unterordner/unterunterordner</code>) wird beim Aufruf der ACP Seite, die die Erweiterungen auflistet nach einer <code class="inline">composer.json</code> gesucht. Diese enthält die Bezeichnung der Erweiterung und einige grundlegende Informationen über die Erweiterung (z.B. Autor, Version, ggf. Abhängigkeiten etc.). <span style="text-decoration:underline">Damit eine Erweiterung installiert werden kann muss diese Datei vorhanden sein.</span></li> <li>Im Ordner <code class="inline">config/</code> wird nach der Datei <code class="inline">services.yml</code> und der Datei <code class="inline">routing.yml</code> gesucht <ul><li>Die services.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, also immer dann, wenn über Templateänderungen hinausgehende Funktionen benötigt werden.</li> <li>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.</li></ul></li> <li>Bei jeder Installation, Deaktivierung und Löschung der Erweiterung wird nach der optionalen Datei <code class="inline">ext.php</code> gesucht. Diese kann verwendet werden, um den Ablauf des Installationsprozesses zu verändern.</li> <li>Bei der Installation und jeder Aktivierung oder Löschung von Erweiterungen wird im Ordner <code class="inline">migrations/</code> nach beliebigen php Dateien gesucht. Diese können verwendet werden, um Datenbankänderungen bei der Installation der Erweiterung vorzunehmen.</li> <li>Bei aktiver Erweiterung wird im Unterverzeichnis <code class="inline">styles/[stylename]/template/event/</code> nach Styledateien mit speziellen Namen gesucht die automatisch verwendet werden. Immer, wenn in phpBB Templates ein Event mit dem gleichen Namen wie die Dateien ausgegeben werden soll werden diese Dateien eingebunden. Findet sich also beispielsweise ein <code class="inline"><!-- EVENT viewtopic_show_my_ext --></code> im phpBB Template, dann kann mit einer Datei namens <code class="inline">viewtopic_show_my_ext.hmtl</code> an genau dieser Stelle HTML Code eingefügt werden.</li> <li>Styledateien werden allgemein unter <code class="inline">styles/[stylename]/template</code> bzw. <code class="inline">styles/[stylename]/theme</code> erwartet, Sprachdateien entsprechend unter <code class="inline">language/[iso]/</code>, die automatisierten Tools suchen dort nach den Dateien, wenn entsprechende PHP Befehle verwendet werden.</li> <li>In den Sprachdateiverzeichnissen <code class="inline">language/[iso]/</code> wird nach php Dateien mit speziellen Namen gesucht (<code class="inline">permission_xxx.php</code> sowie <code class="inline">info_(u|m|a)cp_xxx.php</code>) 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)).</li></ul> Eine erste einfache Erweiterung lässt sich bereits erstellen, indem man lediglich einige dieser automatisch eingebundenen Dateien verwendet (siehe folgender Abschnitt). Alles was eine Erweiterung tut muss über die beiden Konfigurationsdateien im <code class="inline">config/</code> Ordner konfiguriert werden, oder in einer der automatisch eingebundenen Dateien stattfinden. <br> <br> Der Ablauf ist also gedanklich immer entweder <ul><li><em class="text-italics">phpBB (-> routing.yml) -> services.yml -> deine Klasse mit eigenem Code</em> oder</li> <li><em class="text-italics">phpBB -> dein Code an einer speziellen Stelle</em>.</li></ul> <div class="note note-blue">Im folgenden werden einige Dateien angelegt. Diese liegen <span style="text-decoration:underline">immer</span> im Verzeichnis der Erweiterung, <code class="inline">/ext/gn36/infobar/</code>. <br> Außerhalb dieses Verzeichnisses müssen keine Dateien angelegt werden und Pfade beziehen sich, sofern sie nicht mit <code class="inline">/ext/</code> beginnen, immer auf das Verzeichnis der Erweiterung!</div> <h4><a name="template-only"></a>Einfaches Beispiel mit ausschließlich Template Änderungen</h4> Im folgenden wollen wir nun eine minimalistische Beispielerweiterung erstellen, die einen Informationsbalken über dem Hauptinhalt jeder Seite des Boards anzeigt. Hierzu benötigen wir lediglich zwei Dateien: Eine <code class="inline">composer.json</code>, die für jede Erweiterung benötigt wird und eine Template Datei mit dem HTML Code des Informationsbalkens. Es sind keinerlei PHP Kenntnisse für diese Erweiterung erforderlich.<br> <br> Da beide Dateien an speziellen Stellen liegen müssen legen wir zunächst einen eigenen Ordner für unsere Erweiterung an: <code class="inline">ext/gn36/infobar/</code>. Hierbei solltest du <code class="inline">gn36</code> und <code class="inline">infobar</code> durch deinen eigenen Namen ersetzen. Ersteres ist normalerweise ein Benutzername, zweiteres der Kurzname der Erweiterung. Verwende dabei keine Unterstriche und am besten auch sonst keine Sonderzeichen. <br> <br> In diesen Ordner legen wir nun unsere <code class="inline">composer.json</code>: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>{ "name" : "gn36/infobar", "type" : "phpbb-extension", "description" : "Mini-Erweiterung zu Demonstrationszwecken. Der Eintrag 'name' muss dem Ordnerpfad unterhalb von ext/ entsprechen. Du kannst alle Informationen in dieser Datei auf deine Bedürfnisse anpassen.", "version" : "1.0.0", "license" : "GPL-2.0", "require" : { "php" : ">=5.3.3" }, "authors" : [{ "name" : "Martin Beckmann", "email" : "mail@example.com", "homepage" : "https://www.phpbb.de/", "role" : "Lead developer" }], "extra" : { "display-name" : "Mini-Erweiterung - dieser Titel wird im ACP angezeigt", "soft-require" : { "phpbb/phpbb" : ">=3.1.5,<3.2@dev" } } } </code></pre></div> <div class="note note-blue">Achte bei der Eingabe auf korrekte Anführungszeichen und Kommas - nach jedem Wertepaar muss ein Komma folgen, sofern auf der selben Ebene noch weitere Daten in der Liste stehen. Hinter dem letzten Eintrag auf einer Ebene darf aber kein Komma stehen.</div> Wenn du die Datei angelegt hast solltest du die Erweiterung im ACP bereits sehen und aktivieren können. Wenn nicht hast du vermutlich einen Tippfehler gemacht und Klammern oder Kommas sind falsch oder fehlen.<br> <br> Als nächstes wollen wir nun unseren Infobalken anlegen. Hierzu genügt es eine Datei mit dem Namen <code class="inline">overall_header_content_before.html</code> in den Ordner <code class="inline">ext/gn36/infobar/styles/prosilver/template/event/</code> zu legen und folgenden HTML Code in die Datei einzufügen: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><div class="rules"> <div class="inner"> <strong>Warnung:</strong> Dieses Board ist noch in der Entwicklung. Dabei können Fehler auftreten. </div> </div> </code></pre></div> Aktivierst du nun die Erweiterung (oder löscht den Cache sofern sie bereits aktiviert ist), dann sollte der Info Balken oberhalb des Seiteninhalts auf jeder Seite des Forums angezeigt werden. Auf ähnliche Weise lässt sich an vielen weiteren Stellen HTML Code in die Templates einfügen. Hierzu muss man sich lediglich im phpBB Template das richtige Event heraussuchen, bei dem man den Code einfügen möchte. Bennenst du beispielsweise die eben angelegte HTML Datei in <code class="inline">overall_footer_content_after.html</code> um, so wird der Balken unterhalb des Seiteninhalts auf jeder Boardseite angezeigt. Einen Link im Header neben dem FAQ Link kannst du beispielsweise in einer Datei namens <code class="inline">overall_header_navigation_prepend.html</code> anlegen.<br> <br> Um das für dich passende Event zu finden kannst du in die Templates schauen, einfacher geht es aber mit der Erweiterung <a href="https://www.phpbb.com/community/viewtopic.php?f=456&t=2470356" class="postlink">Show phpBB Events (for extension developers)</a>, die für alle verfügbaren Template Events eine kleine Box an der Stelle des Events ins Template einfügt, in der der Name des jeweiligen Events steht. Alternativ dazu findest du hier eine Liste mit sämtlichen Template-Events: <a href="https://area51.phpbb.com/docs/dev/master/extensions/events_list.html#template-events" class="postlink">phpBB Template Events</a>.<br> Diesen Namen musst du nun für deine HTML Datei verwenden (mit der Datei-Erweiterung <code class="inline">html</code>) und in den gleichen Ordner legen wie die HTML Dateien in obigem Beispiel um an den entsprechenden Stellen HTML Code einzufügen. Achte darauf, dass dein HTML Code zu der Stelle passt, an der er eingefügt wird. Einige Events befinden sich beispielsweise innerhalb von Listenelementen wie <code class="inline"><ul></code> oder <code class="inline"><ol></code>. Hier solltest du dementsprechend deine Einträge mit <code class="inline"><li></code> umschließen. Du kannst die HTML Dateien so behandeln als seien sie direkt an der entsprechenden Stelle im Template eingebaut. Alles was du in Template Dateien verwenden kannst darfst du auch hier verwenden.<br> <br> Sofern du ein Template einsetzt, das nicht auf prosilver Basis läuft (also auch nicht von prosilver erbt) solltest du natürlich deine Templates in einen Unterordner mit entsprechendem Namen legen damit obiges Beispiel auch in deinem Forum funktioniert. Sofern deine Änderung mit beliebigen Templates funktioniert, ohne dass spezielle Anpassungen erforderlich sind kannst du auch statt prosilver den Ordner <code class="inline">all</code> verwenden. Dieser wird z.B. in der oben erwähnten Template Events Erweiterung verwendet.<br> <br> Weitere hilfreiche Informationen zur Nutzung von Templates: KB:template_system<br> <h4><a name="eigenstaendige_Seite"></a>Eigenständige php Seiten in phpBB einbinden</h4> Um eigenen PHP Code im Kontext von phpBB auszuführen ist schon etwas mehr Aufwand nötig. Als Grundstruktur brauchen wir wieder einen Ordner für die Erweiterung und eine composer.json (siehe oben).<br> <br> Da unsere neue Seite über irgend eine URL erreichbar sein soll brauchen wir eine weitere automatisch eingebundene Datei: Die <code class="inline">config/routing.yml</code>. Diese ist dafür verantwortlich, URLs festzulegen, die in einer Erweiterung verwendet werden. phpBB liest die Datei automatisch ein und leitet Anfragen an die darin befindlichen URLs automatisch an die richtigen Stellen in der Erweiterung weiter.<br> <br> Lege daher nun eine <code class="inline">config/routing.yml</code> Datei mit folgendem Inhalt an: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code># Mit # beginnen Kommentare name_der_route_mit_beliebiger_laenge: # Nur mit leerzeichen einruecken, nie mit tabs # Der path enthaelt die gewuenschte URL vom Forum Root aus gesehen path: /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: "gn36.infobar.controller.routenhandler:methodenname", parameter_1: "standardwert" } </code></pre></div> <div class="note note-blue">Achte darauf, dass du für die Einrückung nur Leerzeichen verwendest, Tabs sind in dieser Datei verboten. Die Einrückung ist wichtig.</div> In der Datei sind nun einige unbekannte Angaben. <br> <br> Diese Datei sorgt nun dafür das eine URL in der Form <code class="inline">/gewuenschte/route/zur/datei/</code> unterhalb des Forums automatisch an die Erweiterung weitergereicht wird. Damit klar ist, wo die Verarbeitung in der Erweiterung stattfinden soll ist ein Controller mit der Bezeichnung <code class="inline">gn36.infobar.controller.routenhandler</code> angegeben. Innerhalb dieser Klasse wird dann die Methode <code class="inline">methodenname</code> aufgerufen, deren Parameter <code class="inline">parameter_1</code> mit dem Standardwert "standardwert" befüllt wird, wenn die Methode aufgerufen wird.<br> <br> An dieser Stelle ist nun unklar, was genau die Klasse <code class="inline">gn36.infobar.controller.routenhandler</code> eigentlich genau ist. Auch phpBB kann mit der Bezeichnung normalerweise erst einmal nicht viel anfangen, deshalb schaut es an einer anderen Stelle nach: In der <code class="inline">config/services.yml</code>. In dieser Datei werden alle Klassen definiert, die in irgend einer Weise Arbeit für die Erweiterung verrichten. Für Klassen mit Sonderfunktionen müssen in dieser Datei spezielle Einträge angelegt werden, woraufhin phpBB diese Klassen dann gesondert berücksichtigt, beispielsweise für PHP Events, Benachrichtigungen oder Cronjobs. Für unsere Zwecke tut es an dieser Stelle ein ganz normaler Eintrag in der Datei, der einfach nur festlegt, welche Klasse denn nun mit der Bezeichnung gn36.infobar.controller.routenhandler gemeint ist:<br> <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>gn36.infobar.controller.routenhandler: # Hier muss sich der Pfad der Klassendatei wiederspiegeln # in diesem Fall liegt die Klasse also in einer Datei mit dem Namen routenhandler.php im Ordner ext\gn36\infobar\controller\ class: gn36\infobar\controller\routenhandler # Parameter, die der Klasse im Konstruktor übergeben werden sollen. Wenn man z.B. das Template braucht kann man es hier anfordern # Hilfreich ist auch oft die Controller Helfer Klasse # Passend dazu braucht man aber auch eine Methode '__construct(\phpbb\template\template $template, \phpbb\controller\helper $helper) in der man das Template in eine globale Variable speichert. arguments: - '@template' - '@controller.helper'</code></pre></div> Mit diesen Informationen weiß phpBB nun, dass die Klasse unter <code class="inline">ext/gn36/infobar/controller/routenhandler.php</code> zu finden ist. Sie benötigt für die Initialisierung das Template Objekt und den Controller Helfer als Parameter im Konstruktor. Aus der routing.yml ist ja bereits bekannt, dass die Methode <code class="inline">methodenname</code> aufgerufen werden soll, auch der notwendige Parameter ist bekannt. Somit kann phpBB nun bei Aufruf der URL die Klasse einbinden und die entsprechende Methode aufrufen, diese Methode sollte sich dann um die Darstellung unserer zusätzlichen Seite kümmern.<br> <br> Dementsprechend brauchen wir nun eine neue Datei, die den PHP Code für unsere Klasse enthält. Diese muss dann unter <code class="inline">ext/gn36/infobar/controller/routenhandler.php</code> abgelegt werden und muss dann in etwa so aussehen: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>namespace gn36\infobar\controller; class routenhandler { // 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 services.yml ergänzen) } // Der eigentliche Arbeitssklave public function methodenname($parameter_1) { //Hier kann man dann beliebige Dinge machen die z.B. zu einer Ausgabe führen // Templatevariable weiterverwenden $template = $this->template; //... Beliebiger Code .... $template->assign_vars(array( 'CURRENT_TIME' => date('d.m.Y H:i:s'), 'THE_PARAMETER' => $parameter_1, )); $seitentitel = 'Der Seitentitel am' . date('d.m.Y H:i:s'); // 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); } }</code></pre></div> Wie man sieht tut die Methode noch nicht wirklich viel. Sie speichert die im Konstruktor übergebenen Variablen in geschützten Klassenvariablen. Dann fügt Sie in der über die URL ausgeführten Methode dem Template eine Variable mit dem aktuellen Zeitstempel hinzu und gibt den übergebenen Parameter in einer weiteren Templatevariable aus. Danach wird eine Variable für den Seitentitel mit dynamischem Inhalt befüllt. Anschließend wird die Helferklasse verwendet um eine Templatedatei mit dem namen "templatedateiname.html" und dem eben definierten Seitentitel mit Hilfe der Methode "render" an den Browser zu liefern.<br> <br> Damit das Beispiel komplett ist brauchen wir also noch eine Templatedatei mit dem Namen <code class="inline">templatedateiname.html</code>. Diese Datei wird von phpBB automatisch gefunden, wenn sie entweder im phpBB Template Verzeichnis liegt, oder aber im Templateverzeichnis der Erweiterung. An erstere Stelle sollten wir sie nicht legen, denn dann sind nicht mehr alle Templatedateien an einem Ort. Daher legen wir die Datei unter <code class="inline">ext/gn36/infobar/styles/prosilver/template/</code> mit folgendem Inhalt an: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><!-- INCLUDE overall_header.html --> <p>Das hier ist der Hauptinhalt der Datei. Zeitstempel: {CURRENT_TIME}</p> <p>Parameter: {THE_PARAMETER}</p> <!-- INCLUDE overall_footer.html --> </code></pre></div> Nun ist das Beispiel komplett. phpBB kann anhand der routing.yml feststellen, dass wir beim Aufruf der URL <code class="inline">/gewuenschte/route/zur/datei/</code> unterhalb des Forums die Methode <code class="inline">methodenname</code> der Klasse <code class="inline">gn36.infobar.controller.routenhandler</code> aufrufen möchten. Aus der services.yml kann phpBB entnehmen, dass diese Klasse unter <code class="inline">ext/gn36/infobar/controller/</code> in der Datei <code class="inline">routenhandler.php</code> zu finden ist, den Namen <code class="inline">routenhandler</code> trägt und außerdem bei der Initialisierung das Templateobjekt sowie den Controller Helfer benötigt. Wenn die URL aufgerufen wird wird der Standardparameter "standardparameter" übergeben und der PHP Code der Methode wird ausgeführt. Dieser bindet schließlich die Templatedatei ein, nachdem er einige Templatevariablen mit Inhalt gefüllt hat. <br> <br> Wenn wir nun die Erweiterung deaktivieren und wieder aktivieren können wir nun auf unsere neue Seite zugreifen. Wenn das Forum unter <code class="inline">http://localhost/forum/</code> erreichbar ist finden wir unsere Seite unter <code class="inline">http://localhost/forum/gewuenschte/route/zur/datei/</code>. Sofern mod_rewrite nicht aktiv ist müssen wir noch ein <code class="inline">app.php</code> in den Pfad einfügen: <code class="inline">http://localhost/forum/app.php/gewuenschte/route/zur/datei/</code>.<br> <br> Natürlich lässt sich in der von phpBB aufgerufenen Methode beliebiger php Code ausführen, diese ist somit ein Ersatz für die bisherigen <a href="https://www.phpbb.com/support/docs/en/3.0/kb/article/add-a-new-custom-page-to-phpbb/" class="postlink">in phpBB eingebundenen Seiten</a>. Es ist auch nicht zwingend erforderlich, vom Templatesystem Gebrauch zu machen. In der Methode lassen sich auch übliche Ausgabebefehle wie echo oder print nutzen, ggf. muss man lediglich am Ende der Methode die Ausführung mit [php:exit] oder [php:die] beenden.<br> <br> Sofern für die eigenen Zwecke noch weitere phpBB Objekte wie z.B. <code class="inline">$user</code>, <code class="inline">$db</code> oder <code class="inline">$auth</code> benötigt werden, so sollten diese ebenfalls über die services.yml und den Konstruktor angefordert und in Klassenvariablen gespeichert werden. Alle Klassen, die in irgend einer services.yml Datei aufgelistet werden können angefordert werden, also z.B. auch eigene zur Erweiterung gehörige Klassen. Eine Schwierigkeit hierbei sind die Namen, die in der services.yml verwendet werden müssen. Die zu phpBB gehörigen Klassen sind alle im Verzeichnis <code class="inline">config/</code> definiert, die zugehörigen Klassen liegen unter <code class="inline">phpbb/</code>. Der in der services.yml zu verwendende Name einer Klasse ist immer die Überschrift des betreffenden Eintrags in der yml Datei. Für die Datenbank findet sich der Eintrag beispielsweise in der <code class="inline">config/db.yml</code> und heißt <code class="inline">dbal.conn</code>, die User Klasse findet sich in der user.yml und trägt die Bezeichnung <code class="inline">user</code>, die Auth Klasse ist in der <code class="inline">auth.yml</code> mit der Bezeichnung <code class="inline">auth</code>. <br> <br> Klassen werden in der services.yml mit einem @ vor der Bezeichnung eingebunden, daneben gibt es auch noch Variablen, die von % Zeichen umgeben sind. Beide sollten in einfachen Anführungszeichen stehen wie im Beispiel angegeben. Die Parameter in der services.yml müssen in gleicher Reihenfolge gelistet werden, wie sie im Konstruktor benötigt werden. Klassen stehen unter der Überschrift <code class="inline">services:</code>, davor kann auch noch ein Bereich <code class="inline">parameters:</code> eingefügt werden, in dem Variablen definiert werden können wenn man z.B. den selben Wert für mehrere Klassen verwenden will. Auch einige Standardwerte wie z.B. der relative phpBB Pfad ($phpbb_root_path in phpBB 3.0) oder die php Dateierweiterung ($phpEx) kann als Variable übergeben werden (<code class="inline">%core.root_path%</code> bzw. <code class="inline">%core.php_ext%</code>). Am besten schaut man sich einfach ein paar Beispiele an - die yml Dateien in phpBB folgen der gleichen Syntax der auch die services.yml Datei in Erweiterungen folgen muss. Grundlage hierfür ist <a href="http://symfony.com/doc/current/components/dependency_injection.html" class="postlink">die Symfony dependency injection</a>, diese lässt sich voll verwenden, ist allerdings nicht leicht zu verstehen.<br> <br> Wenn wir möchten, können wir in der routing.yml auch weitere URLs angeben, die zum selben Ziel führen. Oder aber, wir können den Parameter, der aktuell fest eingestellt ist, als variablen Teil der URL definieren. So kann beispielsweise mit der Route <code class="inline">/gewuenschte/route/zur/datei/{parameter_1}</code> der Parameter dynamisch mit der Fortsetzung der URL gefüllt werden. Die Datei routing.yml könnte hierfür wie folgt ergänzt werden: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>name_der_zusaetzlichen_route: path: /gewuenschte/route/zur/datei/{parameter_1} defaults: { _controller: "gn36.infobar.controller.routenhandler:methodenname", parameter_1: "standardwert" } </code></pre></div> Sofern beide URLs funktionieren sollen muss die bisherige Route zusätzlich enthalten sein - parameter_1 darf in der URL nicht leer sein.<br> <div class="note note-blue">Module im Persönlichen Bereich, Moderationsbereich und Adminbereich nehmen eine Sonderstellung ein. Ihre Verwendung ist gegenüber phpBB 3.0 kaum verändert, so dass die meisten hier vorgestellten Konzepte für diese leider nicht funktionieren.</div> <h4><a name="funktionen_veraendern"></a>Das Verhalten von phpBB verändern</h4> In einigen Fällen möchte man das Verhalten von phpBB an einigen Stellen gezielt verändern. Vielleicht möchte man Themen mit einem besonderen Präfix nur Moderatoren anzeigen, Beiträge von bestimmten Benutzern besonders hervorheben oder einen Link im Header nur bestimmten Benutzergruppen anzeigen.<br> <br> In den meisten Fällen kommt man in diesem Fall mit reinen Templateänderungen nicht mehr aus sondern benötigt zusätzlich Änderungen am Verhalten in den PHP Dateien. Auch diese möchten wir natürlich ohne Änderungen an den PHP Dateien von phpBB realisieren. Hierfür sind - ähnlich den Events im Template, mit denen Templatedateien eingebunden werden - auch in den PHP Dateien Events verteilt.<br> <br> Trifft phpBB bei der Ausführung auf einen Event Trigger, so verpackt es einige nützliche Variablen in ein Event Objekt und ruft dann für alle Erweiterungen die Methoden auf, die dieses Event verarbeiten sollen. Das zuvor erstellte Event Objekt wird dabei allen Methoden der Reihe nach übergeben und kann von diesen verändert werden. Abschließend extrahiert phpBB die ggf. veränderten Variablen wieder aus dem Objekt und fährt mit der Ausführung des Skripts fort.<br> <br> Um auf so ein Event zu reagieren genügt es allerdings dieses mal nicht, einer PHP Datei einen speziellen Namen zu verpassen und diese an einen vordefinierten Ort zu legen, sondern es sind zwei Dinge nötig: <ol style="list-style-type:decimal"><li>Ein spezieller Eintrag in der <code class="inline">config/services.yml</code></li> <li>Eine PHP Klasse, die das Event verarbeitet und mindestens eine verarbeitende Methode sowie eine öffentliche, statische Methode mit dem Namen <code class="inline">getSubscribedEvents</code> besitzt.</li></ol> Der Eintrag in der services.yml teilt phpBB mit, dass es eine Klasse gibt, die Events verarbeiten soll und wo diese liegt. Hier wird lediglich festgelegt, dass die Klasse überhaupt irgendwelche Events verarbeitet, nicht aber welche Events das sind. Die statische Methode <code class="inline">getSubscribedEvents</code> teilt phpBB dann mit, welche Events genau in der Klasse verarbeitet werden sollen. <br> <br> Der Eintrag in der services.yml kann z.B. wie folgt aussehen: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code># Auch hier muss natürlich, wenn das der einzige Eintrag ist vorher die Überschrift services: angeführt werden gn36.infobar.events.global_events: class: gn36\infobar\event\global_events arguments: - '@user' - '@template' - '@config' tags: - { name: event.listener } </code></pre></div> Der einzige Unterschied zum bereits bekannten Eintrag der services.yml sind die letzten beiden Zeilen. Hiermit wird die Klasse für phpBB speziell markiert (engl. "tag"). Der Tag mit dem Namen "event.listener" teilt phpBB hierbei mit, dass diese Klasse auf Events reagiert und deshalb bei der Verarbeitung von PHP Events berücksichtigt werden muss.<br> <br> Die PHP Klasse muss nun entsprechend der Definition in der services.yml unter <code class="inline">ext/gn36/infobar/event/</code> in einer Datei namens <code class="inline">global_events.php</code> liegen.<br> <br> Sie kann z.B. wie folgt aussehen: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><?php namespace gn36\infobar\event; class global_events implements \Symfony\Component\EventDispatcher\EventSubscriberInterface { static public function getSubscribedEvents() { return array( 'core.user_setup' => 'load_global_lang', // Weitere Events ); } /** @var \phpbb\user */ protected $user; /** @var \phpbb\template\template */ protected $template; /** @var \phpbb\config\config */ protected $config; public function __construct(\phpbb\user $user, \phpbb\template\template $template, \phpbb\config\config $config) { $this->user = $user; $this->template = $template; $this->config = $config; } public function load_global_lang($event) { //Sprachdateien in beliebigen Dateien einbinden wenn sie gerade gebraucht werden //$this->user->add_lang_ext('gn36/infobar', 'global'); // Sprachdateien global einbinden $lang_ary = $event['lang_set_ext']; $lang_ary[] = array( 'ext_name' => 'gn36/infobar', 'lang_set' => 'global', //Name der Datei im Unterverzeichnis ext/gn36/infobar/language/[iso]/ ohne Dateiendung ); $event['lang_set_ext'] = $lang_ary; } } </code></pre></div> Wichtig ist hierbei die Implementierung des "eventSubscriberInterface", die die Methode <code class="inline">getSubscribedEvents</code> fordert. Diese Methode gibt lediglich ein Array zurück, welches die verarbeiteten Events als Schlüssel und die verarbeitenden Methoden als Wert des Arrayeintrags enthält. <br> <br> In der entsprechenden Methode erfolgt dann die eigentliche Verarbeitung. In diesem Beispiel wird auf das Event <code class="inline">core.user_setup</code> reagiert, welches beim Laden des Benutzerobjekts getriggert wird. Es ist speziell dafür gedacht, globale Sprachdateien zu laden, die z.B. für Menüeinträge oder ähnliches gebraucht werden, was auf allen Seiten zu finden ist. Hierfür wird das Array <code class="inline">lang_set_ext</code> aus dem Event geladen, um einen Eintrag erweitert und anschließend wieder in das Event zurückgeschrieben. Dies sorgt dafür, dass phpBB die Sprachdatei mit dem Namen "global.php" in der jeweils gültigen Sprache läd. <br> <br> Eine Besonderheit fällt beim Blick auf den Umgang mit <code class="inline">$event</code> auf. Auf den ersten Blick ist man versucht, die Konstruktion mit der lokalen Variable zu ersetzen durch eine einfache Zuweisung: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>//falsch: $event['lang_set_ext'][] = array( 'ext_name' => 'gn36/infobar', 'lang_set' => 'global', //Name der Datei im Unterverzeichnis ext/gn36/infobar/languages/[iso]/ ); </code></pre></div> Das funktioniert aber in der Form nicht, weil $event kein Array, sondern ein Objekt ist und der direkte Schreibzugriff nur auf komplette interne Variablen des Objekts möglich ist, nicht aber auf Teile eines Arrays. Man kann also das komplette Array ersetzen, aber nicht lediglich einzelne Teile verändern.<br> <br> Um das Beispiel abzuschließen brauchen wir nun noch eine Sprachdatei, die eingebunden wird und außerdem eine Templatedatei, in der eine Sprachvariable aus der Datei verwendet wird. Die Sprachdatei sollte dabei für alle Sprachen angelegt werden, die verfügbar sein sollen.<br> <br> Für ein deutschsprachiges Forum legen wir also nun die Datei <code class="inline">ext/gn36/infobar/language/de/global.php</code> mit folgendem Inhalt an: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><?php if (!defined('IN_PHPBB')) { exit; } if (empty($lang) || !is_array($lang)) { $lang = array(); } $lang = array_merge($lang, array( // Notifications 'SAMPLE_LANGVAR' => 'Generische Sprachvariable. Irgend einen Text eingeben', ));</code></pre></div> Da phpBB auch immer eine englische Sprachdatei benötigt, kopieren wir die o.g Datei in das englische Sprachen Verzeichnis: <code class="inline">ext/gn36/infobar/language/en/global.php</code><br> und passen die Übersetzung an: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><?php if (!defined('IN_PHPBB')) { exit; } if (empty($lang) || !is_array($lang)) { $lang = array(); } $lang = array_merge($lang, array( // Notifications 'SAMPLE_LANGVAR' => 'Generic language variable. Enter any text', ));</code></pre></div> Die Templatedatei <code class="inline">overall_header_content_before.html</code> die wir bereits zuvor angelegt haben könnte so aussehen: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><div class="rules"> <div class="inner"> <strong>Warnung:</strong> {L_SAMPLE_LANGVAR} </div> </div> </code></pre></div> Wird die Erweiterung nun aktiviert sollte der Infobalken oben den Inhalt aus der Sprachdatei für die Sprachvariable einsetzen.<br> <br> Natürlich ist das für das typische Forum ein nur begrenzt nützliches Beispiel, aber es verdeutlicht den Umgang mit dem Event Objekt. Das Eventobjekt enthält unterschiedliche Variablen abhängig davon, welches Event getriggert wird. Welche Variablen übergeben werden lässt sich aus der jeweiligen Beschreibung des verwendeten Events entnehmen. In vielen Fällen reichen bei geschickter Auswahl des verarbeiteten Events die übergebenen Variablen für kleinere Änderungen bereits aus, so dass man in der Erweiterung ohne komplexe Datenbankabfragen o.ä. auskommt.<br> <br> Wer mehr über das Event Objekt wissen möchte (z.B. kann man mit dessen Hilfe auch <a href="http://symfony.com/doc/current/components/event_dispatcher.html#event-dispatcher-event-propagation" class="postlink">die weitere Eventverarbeitung abbrechen</a> und so verhindern, dass weitere Erweiterungen ausgeführt werden) sollte einen Blick in die <a href="http://symfony.com/doc/current/components/event_dispatcher.html" class="postlink">Symfony Doku zum Thema</a> werfen.<br> <br> Ist man auf der Suche nach dem passenden Event für seine Zwecke, kann man einfach nach <code class="inline">@event</code> suchen. Eine andere nützliche Quelle für Events, falls man nicht weiß, in welcher Datei man schauen sollte ist die <a href="https://area51.phpbb.com/docs/dev/master/extensions/events_list.html" class="postlink">Event-Liste - phpBB Dev Docu</a>. </div> </div> </div> </div> </div> </div> </div> <div id="page-footer" class="page-footer" role="contentinfo"> <div class="navbar" role="navigation"> <div class="inner"> <ul id="nav-footer" class="nav-footer linklist" role="menubar"> <li class="breadcrumbs"> <span class="crumb"><a href="./../" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span>Startseite</span></a></span> <span class="crumb"><a href="./../community/index.php?sid=3167bce3b099f734a70448a7dfeb51fa" data-navbar-reference="index"><span>Community</span></a></span> </li> <li class="rightside">Alle Zeiten sind <span title="Europa/Berlin">UTC+01:00</span></li> <li class="rightside"> <a href="/user/delete_cookies?sid=3167bce3b099f734a70448a7dfeb51fa" data-ajax="true" data-refresh="true" role="menuitem"> <i class="icon fa-trash fa-fw" aria-hidden="true"></i><span>Alle Cookies löschen</span> </a> </li> <li class="rightside" data-last-responsive="true"> <a href="./../phpbbde/impressum/?sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-info-circle fa-fw" aria-hidden="true"></i><span>Impressum </span> </a> </li> <li class="rightside" data-last-responsive="true"> <a href="./../phpbbde/team/?sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>Das Team</span> </a> </li> <li class="rightside" data-last-responsive="true"> <a href="/contactadmin?sid=3167bce3b099f734a70448a7dfeb51fa" role="menuitem"> <i class="icon fa-envelope fa-fw" aria-hidden="true"></i><span>Kontakt</span> </a> </li> </ul> </div> </div> <div class="copyright"> <p class="footer-row"> <span class="footer-copyright">Powered by <a href="https://www.phpbb.com/">phpBB</a>® Forum Software © phpBB Limited</span> </p> <p class="footer-row"> <span class="footer-copyright">Deutsche Übersetzung durch <a href="https://www.phpbb.de/">phpBB.de</a></span> </p> <p class="footer-row" role="menu"> <a class="footer-link" href="./../community/ucp.php?mode=privacy&sid=3167bce3b099f734a70448a7dfeb51fa" title="Datenschutz" role="menuitem"> <span class="footer-link-text">Datenschutz</span> </a> | <a class="footer-link" href="./../community/ucp.php?mode=terms&sid=3167bce3b099f734a70448a7dfeb51fa" title="Nutzungsbedingungen" role="menuitem"> <span class="footer-link-text">Nutzungsbedingungen</span> </a> </p> <div class="sponsor-logo"> <a href="https://linevast.de/" rel="nofollow">hosted by Linevast.de <br> <img src="./../community/styles/phpBBdev1/theme/images/linevast.png" alt="Linevast.de" height="63" width="257"> </a> </div> </div> <div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="AJAX-Fehler" data-ajax-error-text="Bei der Verarbeitung deiner Anfrage ist ein Fehler aufgetreten." data-ajax-error-text-abort="Der Benutzer hat die Anfrage abgebrochen." data-ajax-error-text-timeout="Bei deiner Anfrage ist eine Zeitüberschreitung aufgetreten. Bitte versuche es erneut." data-ajax-error-text-parsererror="Bei deiner Anfrage ist etwas falsch gelaufen und der Server hat eine ungültige Antwort zurückgegeben."> <div id="darken" class="darken"> </div> </div> <div id="phpbb_alert" class="phpbb_alert" data-l-err="Fehler" data-l-timeout-processing-req="Bei der Anfrage ist eine Zeitüberschreitung aufgetreten."> <a href="#" class="alert_close"> <i class="icon fa-times-circle fa-fw" aria-hidden="true"></i> </a> <h3 class="alert_title"> </h3><p class="alert_text"></p> </div> <div id="phpbb_confirm" class="phpbb_alert"> <a href="#" class="alert_close"> <i class="icon fa-times-circle fa-fw" aria-hidden="true"></i> </a> <div class="alert_text"></div> </div> </div> </div> <div> <a id="bottom" class="anchor" accesskey="z"></a> </div> <script src="./../community/assets/javascript/jquery-3.7.1.min.js?assets_version=280"></script> <script src="./../community/assets/javascript/core.js?assets_version=280"></script> <script src="./../community/styles/phpBBdev1/template/forum_fn.js?assets_version=280"></script> <script src="./../community/styles/phpBBdev1/template/ajax.js?assets_version=280"></script> <script src="./../community/styles/phpBBdev1/template/phpbbde_navi.js?assets_version=280"></script> <script>(function(a){if(a.getElementsByTagName("pre").length){var c=a.getElementsByTagName("head")[0],b=a.createElement("script");a=a.createElement("link");b.type="text/javascript";b.onload=function(){hljs.initHighlighting()};b.async=!0;b.src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js";c.appendChild(b);a.type="text/css";a.rel="stylesheet";a.href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github-gist.min.css";c.appendChild(a)}})(document)</script> </body> </html>