CINXE.COM
phpBB.de - Knowledge Base - Eigene phpBB Erweiterungen erstellen (Fortgeschrittene Themen)
<!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 (Fortgeschrittene Themen)</title> <link rel="alternate" type="application/atom+xml" title="Feed - phpBB.de" href="/feed?sid=1ea620e66ab1810f53a18b38081a5c9d"> <link rel="alternate" type="application/atom+xml" title="Feed - Neuigkeiten" href="/feed/news?sid=1ea620e66ab1810f53a18b38081a5c9d"> <link rel="alternate" type="application/atom+xml" title="Feed - Neue Themen" href="/feed/topics?sid=1ea620e66ab1810f53a18b38081a5c9d"> <link rel="alternate" type="application/atom+xml" title="Feed - Aktive Themen" href="/feed/topics_active?sid=1ea620e66ab1810f53a18b38081a5c9d"> <!-- 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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="1ea620e66ab1810f53a18b38081a5c9d" /> </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=1ea620e66ab1810f53a18b38081a5c9d"><span class="subnavi-toggle"></span>Über uns</a> <ul class="subnavi"> <li><a href="./../phpbbde/chronik/?sid=1ea620e66ab1810f53a18b38081a5c9d">phpBB.de-Chronik <span>Die Geschichte von phpBB.de in Wort und Bild</span></a></li> <li><a href="./../phpbbde/team/?sid=1ea620e66ab1810f53a18b38081a5c9d">Das Team <span>Erfahre mehr über das Team hinter phpBB.de</span></a></li> <li><a href="./../phpbbde/fragen/?sid=1ea620e66ab1810f53a18b38081a5c9d">Fragen an das Team <span>Ihr habt gefragt, wir haben geantwortet</span></a></li> <li><a href="/contactadmin?sid=1ea620e66ab1810f53a18b38081a5c9d">Kontaktformular <span>Formular zur Kontaktaufnahme mit dem phpBB.de-Team</span></a></li> <li><a href="./../phpbbde/impressum/?sid=1ea620e66ab1810f53a18b38081a5c9d">Impressum <span>Das phpBB.de-Impressum</span></a></li> </ul> </li> <li class="navi-button but-phpbb"> <a href="./../infos/?sid=1ea620e66ab1810f53a18b38081a5c9d"><span class="subnavi-toggle"></span>phpBB</a> <ul class="subnavi"> <li><a href="./../infos/?sid=1ea620e66ab1810f53a18b38081a5c9d">Infos über phpBB <span>Erfahre mehr über phpBB</span></a></li> <li><a href="./../infos/tour/?sid=1ea620e66ab1810f53a18b38081a5c9d">Die phpBB-Tour <span>Was ist phpBB und wo bekomme ich es?</span></a></li> <li><a href="./../infos/features/?sid=1ea620e66ab1810f53a18b38081a5c9d">Feature-Vergleich <span>Lerne alle Features kennen, die dir phpBB bietet</span></a></li> <li><a href="./../infos/anpassen/?sid=1ea620e66ab1810f53a18b38081a5c9d">phpBB anpassen <span>Nutze Erweiterungen und Styles, um phpBB deinen Wünschen anzupassen</span></a></li> <li><a href="./../infos/entwickler/3.3/?sid=1ea620e66ab1810f53a18b38081a5c9d">Informationen für Entwickler <span>phpBB-Projektarchiv, nützliche Links, ...</span></a></li> <li><a href="./../xref/3.3/?sid=1ea620e66ab1810f53a18b38081a5c9d">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=1ea620e66ab1810f53a18b38081a5c9d"><span class="subnavi-toggle"></span>Downloads</a> <ul class="subnavi"> <li><a href="./../downloads/pakete/?sid=1ea620e66ab1810f53a18b38081a5c9d">phpBB-Pakete <span>Die aktuellen dt. Komplett- und Updatepakete von phpBB</span></a></li> <li><a href="./../downloads/sprachpakete/?sid=1ea620e66ab1810f53a18b38081a5c9d">Sprachpakete <span>Die aktuellen deutschen Sprachdateien für phpBB</span></a></li> <li><a href="./../downloads/entwicklung/?sid=1ea620e66ab1810f53a18b38081a5c9d">Entwicklung <span>Entwickler-Downloads</span></a></li> </ul> </li> <li class="navi-button but-docu"> <a href="./../support/?sid=1ea620e66ab1810f53a18b38081a5c9d"><span class="subnavi-toggle"> </span>Support</a> <ul class="subnavi"> <li><a href="./../support/doku/quickstart/3.3/?sid=1ea620e66ab1810f53a18b38081a5c9d">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=1ea620e66ab1810f53a18b38081a5c9d">Knowledge Base <span>Unsere Wissensdatenbank mit vielen und hilfreichen Artikeln</span></a></li> <li><a href="./../support/videos/?sid=1ea620e66ab1810f53a18b38081a5c9d">Videos <span>Unsere Supportvideos erklären Funktionen von phpBB</span></a></li> <li><a href="./../support/doku/?sid=1ea620e66ab1810f53a18b38081a5c9d">Dokumentation <span>Hier findest Du Dokumentationen zu phpBB</span></a></li> <li><a href="./../support/doku/perror/?sid=1ea620e66ab1810f53a18b38081a5c9d">MySQL-Fehlercodes <span>Mysql Fehlercodes dokumentiert</span></a></li> <li><a href="./../support/doku/htpasswd/?sid=1ea620e66ab1810f53a18b38081a5c9d">.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=1ea620e66ab1810f53a18b38081a5c9d"><span class="subnavi-toggle"> </span>Community</a> <ul class="subnavi"> <li><a href="./../community/viewforum.php?f=145&sid=1ea620e66ab1810f53a18b38081a5c9d">Supportforen <span>Hilfe bei der Installation und Benutzung</span></a></li> <li><a href="./../community/viewforum.php?f=104&sid=1ea620e66ab1810f53a18b38081a5c9d">Communityforen<span>Allgemeine Diskussionen und phpBB-Usergroups</span></a></li> <li><a href="./../community/viewforum.php?f=148&sid=1ea620e66ab1810f53a18b38081a5c9d">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=1ea620e66ab1810f53a18b38081a5c9d">Styleforen<span>Du suchst einen neuen Style oder hast Probleme mit einem Style?</span></a></li> <li><a href="./../kb/knigge?sid=1ea620e66ab1810f53a18b38081a5c9d">Der kleine phpBB.de-Knigge <span>Eine kleine Liste von wichtigen Regeln auf phpBB.de</span></a></li> <li><a href="./../phpbbde/chat/?sid=1ea620e66ab1810f53a18b38081a5c9d">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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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%3D18&sid=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d"><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=1ea620e66ab1810f53a18b38081a5c9d" 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="p18" class="post bg1"> <div class="inner"> <div class="article-body"> <div class="postbody"> <div id="post_content18"> <h2 class="article-title"><a href="/kb/viewarticle?a=18&sid=1ea620e66ab1810f53a18b38081a5c9d">Eigene phpBB Erweiterungen erstellen (Fortgeschrittene Themen)</a></h2> <p class="article-meta"><strong>Geschrieben von:</strong> <a href="./../community/memberlist.php?mode=viewprofile&u=28811&sid=1ea620e66ab1810f53a18b38081a5c9d" 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> 07.04.2020 16:28<br> <strong>Zugriffe:</strong> 9010</p> <p class="article-description"><strong>Beschreibung:</strong> In diesem Artikel werden einige fortgeschrittene Themen bei der Erstellung einer Erweiterung vorgestellt.</p> <p class="article-categories"><strong>Kategorie:</strong> <a href="/kb/index?c=4&sid=1ea620e66ab1810f53a18b38081a5c9d">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=18&sid=1ea620e66ab1810f53a18b38081a5c9d]Knowledge Base - Eigene phpBB Erweiterungen erstellen (Fortgeschrittene Themen)[/url]</code> </div> <hr> In diesem Artikel werden einige fortgeschrittene Themen bei der Erstellung einer Erweiterung vorgestellt. Für eine grundlegende Einführung und grundlegende Themen siehe <a href="https://www.phpbb.de/kb/viewarticle?a=19" class="postlink">Eigene phpBB Erweiterungen erstellen</a><br> <h4><a name="installationsroutinen"></a>Datenbankänderungen bei der Installation</h4> Sehr viele auch komplexe Änderungen lassen sich ohne Datenbankänderungen realisieren. In einigen Fällen werden aber neben einfachen Verhaltensänderungen auch zusätzlich Änderungen an der Datenbank benötigt. Neben Strukturänderungen, also z.B. komplett neuen Tabellen, neuen Tabellenspalten oder ähnlichem können das auch einfach zusätzliche Konfigurationsdaten, geänderte Konfigurationsdaten, neue Berechtigungen oder etwas ähnliches sein. <br> <br> Neben solchen üblichen Installationsschritten könnte man vielleicht auch speziellen Code lediglich bei der Installation ausführen wollen, also z.B. neue Benutzer anlegen, ganze Foren erstellen, benutzerdefinierte Profilfelder anlegen oder seine Erweiterung abhängig von der bestehenden Forumkonfiguration einstellen. <br> <br> Für alle diese Zwecke sind die so genannten <span style="text-decoration:underline">Migrations</span> gedacht. Diese php Dateien liegen alle im <code class="inline">migrations/</code> Unterordner der Erweiterung (oder einem beliebigen Unterordner dieses Ordners). Mit einer Reihe spezieller Funktionen, die jeweils ein Array mit Anweisungen zurückliefern führt phpBB dann die gewünschten Anpassungen durch und kann diese zu großen Teilen auch wieder Rückgängig machen um die Erweiterung beispielsweise wieder zu deinstallieren. Auch phpBB selbst setzt bei Versionsupdates auf Migrations um Datenänderungen jeder Art durchzuführen.<br> <br> Um den Aufbau zu verdeutlichen schauen wir uns mal eine einfache Migration an, die gekürzt und leicht modifiziert aus der <a href="https://github.com/gn36/phpbb-ext-hookup" class="postlink">Hookup Erweiterung</a> kopiert ist: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code>// Namensraumangabe. Muss dem korrekten Pfad der Migration entsprechen namespace gn36\hookup\migrations; // Name der Klasse = Name der Datei // Abgesehen von der Standarderweiterung kann man auch von einigen speziellen anderen Erweiterungen erben, um z.B. benutzerdefinierte Profilfelder anzulegen class v_1_0_0_compat30x extends \phpbb\db\migration\migration { // Mit dieser Funktion wird phpBB mitgeteilt, welche anderen Migrationen vorher installiert werden müssen, damit diese funktioniert // Das können beliebige andere Migrationen sein, in diesem Fall sind es phpBB eigene Migrationen // Hierdurch wird z.B. bei einer automatischen Installation verhindert, dass die Migration installiert wird bevor phpBB selbst zumindest auf dem Niveau von phpBB 3.1.1 installiert ist. static public function depends_on() { return array( '\phpbb\db\migration\data\v30x\release_3_0_0', '\phpbb\db\migration\data\v31x\v311', '\phpbb\db\migration\data\v310\dev' ); } // Diese Funktion kann verwendet werden um die Installation der Migration komplett zu überspringen und diese als installiert zu markieren // das ist z.B. nützlich, wenn man einen alten Mod für phpBB 3.0 portiert und die Daten übernehmen will. public function effectively_installed() { return isset($this->config['hookup_last_run']); } // Diese Funktion wird für Änderungen an dem Datenbankschema verwendet, also z.B. für das hinzufügen von Tabellen oder Spalten public function update_schema() { return array( 'add_tables' => array( $this->table_prefix . 'hookup_available' => array( 'COLUMNS' => array( 'date_id' => array('UINT:11', 0), 'topic_id' => array('UINT:11', 0), 'user_id' => array('UINT:11', 0), 'available' => array('UINT:6', 1), ), 'PRIMARY_KEY' => array('date_id', 'user_id'), 'KEYS' => array( 'date_id' => array('INDEX', 'date_id'), 'topic_id' => array('INDEX', 'topic_id'), 'tu_id' => array('INDEX', array('topic_id', 'user_id')), ), ), ), 'add_columns' => array( $this->table_prefix . 'topics' => array( 'hookup_enabled' => array('UINT:1', 0), 'hookup_active_date' => array('UINT:11', null), 'hookup_self_invite' => array('UINT:1', 0), 'hookup_autoreset' => array('UINT:1', 0), ), ), ); } // Mit dieser Funktion werden Datenbankänderungen bei der Deinstallation wieder rückgängig gemacht public function revert_schema() { return array( 'drop_tables' => array( $this->table_prefix . 'hookup_available', ), 'drop_columns' => array( $this->table_prefix. 'topics' => array( 'hookup_enabled', 'hookup_active_date', 'hookup_self_invite', 'hookup_autoreset', ), ), ); } // Mit dieser Funktion können Daten in der DB geändert werden. // Für einige häufig benötigte Dinge existieren Standardfunktionen, z.B. Konfigurationsvariablen oder Berechtigungen public function update_data() { return array( array('permission.add', array('f_hookup', false, 'f_read')), array('config.add', array('hookup_last_run', '0')), array('config.add', array('hookup_interval', '86400')), ); } } </code></pre></div> Der Aufbau dieser Dateien ist eigentlich weitgehend selbsterklärend, man muss für die meisten häufig benötigten Dinge lediglich die entsprechenden Bezeichnungen kennen, die in die Arrays eingetragen werden müssen und die Reihenfolge der Parameter. Das Beispiel oben hängt ab von Migrationen, die bei der Installation von phpBB selbst installiert werden. Es fügt eine Tabelle "hookup_available" sowie vier Tabellenspalten in der User Tabelle in die Datenbank ein und macht diese Änderungen bei der deinstallation wieder rückgängig. In der Konfiguration werden eine lokale Foren-Berechtigung "f_hookup" sowie zwei Variablen mit Standardwerten angelegt. Die Rechteeinstellungen für "f_hookup" werden dabei von "f_read" kopiert. Diese Änderungen können automatisch rückgängig gemacht werden, deshalb existiert keine Deinstallationsroutine für die Daten. Diese lässt sich jedoch auch anlegen - die betreffende Methode muss in diesem Fall <code class="inline">revert_data</code> heißen.<br> <br> Für die meisten Erweiterungen dürfte das schon die wichtigsten Beispiele abdecken, die benötigt werden. Daneben gibt es noch diverse weitere Möglichkeiten mit Migrationen Änderungen an der DB durchzuführen. Da auch die <a href="https://area51.phpbb.com/docs/dev/31x/migrations/tools/index.html" class="postlink">englischsprachigen Beispiele</a> hier mit relativ wenig Begleittext auskommen und weitgehend selbsterklärend sind verzichte ich an dieser Stelle auf weitere Details.<br> <div class="note note-blue">Beim Erstellen von Migrationen sollte man darauf achten, dass man bei einem Update keine bestehenden Migrationsdateien verändert. Sind Migrationen ein mal veröffentlicht und im Umlauf sollten sie unverändert so bleiben wie sie sind, ansonsten hat man später möglicherweise Probleme bei Updates oder der Deinstallation, weil die Datenbankstruktur anders ist, als die neuen Migrationen das vorsehen. Stattdessen sollte man einfach mit neuen Migrationen auf der Basis der alten Migrationen neue Änderungen machen und ggf. wenn nötig eben die Änderungen anderer Migrationen in den neuen Migrationen anpassen oder sogar rückgängig machen. Diese Vorgehensweise erlaubt auch beim Update das überspringen von Zwischenversionen</div> Oft kann man viele Datenbankänderungen in eine gemeinsame Datei verpacken. Das ist aber nicht immer sinnvoll: Wird beispielsweise ein phpBB 3.0 Mod auf 3.1 und höher portiert und dabei verändert sollte man zunächst mit einer oder mehreren Migrationen die Datenbank so herrichten, dass sie dem Stand von phpBB 3.0 entspricht. Anschließend verwendet man weitere Migrationen um basierend auf diesem Stand weitere Änderungen an der Datenbank vorzunehmen. Das hat den Vorteil, dass man in den zunächst angelegten Migrationen prüfen kann, ob die Änderungen vielleicht bereits (im von phpBB 3.0 hochgerüsteten Forum) vorhanden sind und kann die Änderungen dann einfach überspringen, das Forum aber trotzdem mit den weiteren Migrationen auf den aktuellen Stand bringen.<br> <br> Auch die Deinstallation der Migrationen sollte man nicht vernachlässigen. Sie sollten jeweils die in der Migration vorgenommenen Schritte rückgängig machen, nicht mehr. Auf die Weise ermöglicht man ab phpBB 3.2 bei Problemen mit einem Update eine Rückkehr zu einem älteren Softwarestand ohne langwierig ein Backup einspielen zu müssen. Der Autor dieses Artikels hat beispielsweise bereits ein versehentliches Datenbankupdate von phpBB 3.1.x auf eine Betaversion von phpBB 3.2 komplett rückgängig gemacht.<br> <br> Zuletzt sei noch auf die Möglichkeit hingewiesen, von anderen Migrationen zu erben als der Standardmigration im obigen Beispiel. Eine weitere nützliche Basisklasse ist beispielsweise die <code class="inline">container_aware_migration</code>, welche mit Hilfe des <code class="inline">phpbb_container</code> in der Migration alle in phpBB oder in Erweiterungen verfügbaren Services bereitstellt (also alle PHP Klassen, die in irgend einer services.yml Datei definiert sind). Will man beispielsweise bei der Installation einige Benachrichtigungen in die Datenbank legen, so kann man sich über die bereitgestellte Methode <code class="inline">$this->container->get('notification_manager')</code> eine Instanz des notification_manager Objekts liefern lassen. Daneben stellt phpBB noch eine Basisklasse zum Bereitstellen von benutzerdefinierten Profilfeldern zur Verfügung: <code class="inline">profilefield_base_migration</code>. In dieser müssen weitgehend lediglich die Klassenvariablen mit Inhalt gefüllt werden sowie die <code class="inline">update_data()</code> Funktion überschrieben um ein Profilfeld anzulegen. Weitergehende Infos finden sich beispielsweise in <a href="https://www.phpbb.de/community/viewtopic.php?f=140&t=237079" class="postlink">diesem Thema</a>. Bei wiederkehrenden Aktionen können natürlich auch eigene Basisklassen angelegt werden.<br> <br> <h4><a name="spezielle_klassen"></a>Spezielle Klassen: Cronjobs, Benachrichtigungen</h4> <div class="note note-red">Dieser Abschnitt ist noch nicht ganz fertiggestellt</div> phpBB arbeitet an einigen Stellen mit dynamischen Listen von Klassen, um ähnliche Dinge zu tun. Ähnlich wie die obigen Migrationen, die verschiedenste Installationen und Updates in einer standardisierten Weise durchführen arbeitet phpBB einige Klassenlisten durch, die andere ähnliche Dinge tun. Das bekannteste Beispiel hierfür sind die Benachrichtigungen, die phpBB an die Benutzer verschickt. Jede Art von Benachrichtigung wird von einer speziellen Klasse realisiert. Es gibt beispielsweise eine speziell für Themenbenachrichtigungen und eine für PNs. Eine weitere wichtige Liste enthält alle Cronjobs, die phpBB in definierten Zeitabständen, die jede der Klassen selbst bestimmen kann automatisch ausführt. <br> <br> Diese Listen lassen sich - genau wie weitere Listen, die es noch gibt - auch in Erweiterungen problemlos erweitern. Hierzu sind zwei Dinge notwendig: Die neue Klasse, die die gewünschte Funktionalität bereitstellt und ein dazu passender Eintrag in der config/services.yml der Erweiterung, der die Klasse in die Liste einträgt. Die Klasse ist aufgebaut wie jede andere Klasse der Erweiterung, muss allerdings je nach Liste ein paar Rahmenbedingungen erfüllen (also ein paar Methoden mit definierten Parametern und Namen bereitstellen). Der Serviceeintrag ist ebenfalls aufgebaut wie jeder andere Serviceeintrag mit allen Parametern für den Konstruktor. Zusätzlich erhält er jedoch noch einen "Tag", der den Eintrag als Teil der Liste markiert. Für Benachrichtigungen, die beim Freischalten von Beiträgen verschickt werden sieht der Eintrag für phpBB 3.1 beispielsweise wie folgt aus: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code> notification.type.approve_post: class: phpbb\notification\type\approve_post shared: false arguments: - '@user_loader' - '@dbal.conn' - '@cache.driver' - '@user' - '@auth' - '@config' - '%core.root_path%' - '%core.php_ext%' - '%tables.notification_types%' - '%tables.notifications%' - '%tables.user_notifications%' tags: - { name: notification.type } </code></pre></div> Der für phpBB 3.2 hat sich geringfügig verändert, weil die Parameter des Konstruktors sich verändert haben, gemeinsam ist aber beiden, dass sie einen Tag <code class="inline">name</code> mit dem Inhalt <code class="inline">notification.type</code> verwenden. Jede Klasse, die in der services.yml mit diesem Tag versehen wird wird von phpBB als Benachrichtigungsklasse erkannt und entsprechend verwendet. Analog dazu sieht ein Eintrag für einen Cronjob beispielsweise wie folgt aus: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code> cron.task.core.prune_all_forums: class: phpbb\cron\task\core\prune_all_forums arguments: - '%core.root_path%' - '%core.php_ext%' - '@config' - '@dbal.conn' calls: - [set_name, [cron.task.core.prune_all_forums]] tags: - { name: cron.task } </code></pre></div> In diesem Fall ist der verwendete Name <code class="inline">cron.task</code>. <br> <br> Beim genaueren Betrachten beider Serviceeinträge fallen an den Einträgen noch weitere Besonderheiten auf: Die Benachrichtigungen enthalten einen Eintrag <code class="inline">shared: false</code>, Cronjobs haben einen zusätzlichen Eintrag <code class="inline">calls:</code> in dem ein Unterpunkt <code class="inline">- [set_name, ...</code> enthalten ist. Ersteres sorgt dafür, dass für jede Benachrichtigung eine neue Instanz der Klasse verwendet wird (das genauer auszuführen würden den Rahmen hier sprengen), zweiteres legt den Namen des Cronjobs bei der Bedienung von der Konsole aus fest.<br> <br> Die Argumente, die deine Klasse verwendet sind natürlich nicht auf die obigen Beispiele beschränkt - wenn deine Klassen andere Parameter benötigen, beispielsweise weil dein Cronjob die Berechtigungen von Benutzern prüfen muss oder einige eigene Objekte verwendet, dann können sie selbstverständlich auch andere Parameter erhalten.<br> <br> Die Klassen selbst kannst du anhand von Beispielen aus phpBB selbst erstellen. Diese implementieren das benötigte Interface bereits, in der Regel gibt es sogar eine Basisklasse, von der du deine eigene Klasse ableiten kannst. Diese stellt dir die benötigten Grundfunktionen dann bereits zur Verfügung. Für einen neuen Cronjob kannst du deine Klasse beispielsweise von der Klasse <code class="inline">phpbb/cron/task/base</code> ableiten, die du unter <code class="inline">phpbb/cron/task/base.php</code> findest. Im einfachsten Fall musst du dann in deinem abgeleiteten Objekt noch lediglich eine Methode namens <code class="inline">run</code> zur Verfügung stellen, diese wird dann bei jeder Gelegenheit, bei der ein Cronjob ausgeführt wird ebenfalls ausgeführt: <div class="codebox"><p>Code: <a href="#" onclick="selectCode(this); return false;">Alles auswählen</a></p><pre><code><?php namespace gn36\infobar\cron; class sample_cronjob extends phpbb\cron\task\base { function run() { // Do something useful here return; } } </code></pre></div> Im Normalfall wird man vermutlich die Funktion nicht bei jeder Gelegenheit ausführen wollen, um das zu prüfen gibt es zwei weitere Methoden: <code class="inline">is_runnable()</code> und <code class="inline">should_run()</code>. Wenn erstere true zurückliefert ist der Cronjob ausführbar (wurde also z.B. nicht in der Konfiguration deaktiviert), wenn die zweite Methode true zurückliefert sollte der Cronjob zum aktuellen Zeitpunkt ausgeführt werden, in der Regel weil seit dem letzten Lauf genügend Zeit verstrichen ist. Üblicherweise erstellt man hierfür mit einer Migration zwei Konfigurationsvariablen (eine für das Intervall, eine für den Zeitpunkt der letzten Ausführung) und prüft in <code class="inline">should_run()</code> die Zeitdifferenz. Nach dem Ausführen setzt man in <code class="inline">run()</code> dann einfach den Zeitstempel der letzten Ausführung neu und schon ist der Cronjob fertig.<br> <br> Fortsetzung folgt... </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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" 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=1ea620e66ab1810f53a18b38081a5c9d" title="Datenschutz" role="menuitem"> <span class="footer-link-text">Datenschutz</span> </a> | <a class="footer-link" href="./../community/ucp.php?mode=terms&sid=1ea620e66ab1810f53a18b38081a5c9d" 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>