tas2580
Blog über Webentwicklung

Eigenen PHP Code mit Core Events ausführen

Für die meisten Extensions ist es nötig eigenen PHP Code auszuführen. In phpBB gibt es dazu eine ganze Reihe Events die benutzt werden können um eigenen Code an verschiedenen Stellen auszuführen. Eine vollständige Liste aller Events gibt es im phpBB Wiki. Dank der Events ist es nicht mehr nötig die Kern Dateien von phpBB zu bearbeiten. Über ein Event kann nicht nur eigener PHP Code ausgeführt werden, es können auch Variablen aus dem Kern Code darüber verändert werden.

Dependency Injection

phpBB nutzt die Symfony Dependency Injection Komponente, so können Objekte und Variablen aus dem Kern an die Extension übergeben werden ohne das man global nutzen muss um an ein Object zu kommen. Dazu legt man innerhalb seiner Extension die Datei /config/services.yml an. In dieser Datei werden alle Objekte die man verwenden möchte an den Event Listener übergeben. Eine services.yml für die Extension foo vom Autor bar die das Template Object übergibt sieht folgendermaßen aus:

services:
    foo.bar.listener:
        class: foo\bar\event\listener
        arguments:
            - @template
        tags:
            - { name: event.listener }

Hier muss man in der zweiten und dritten Zeile den Namen der Extension angeben. Unter arguments: werden dann alle Objekte die man nutzen möchte aufgelistet, jedes Object in einer eigenen Zeile. Wichtig ist das man die Einrückungen in der Datei mit Leerzeichen und nicht mit Tags macht. Eine Liste der Services gibt es hier.

Core Events

Um PHP Code im Kern von phpBB auszuführen wird eine PHP Datei benötigt die man unter event/listener.php ablegt. Der Name listener.php kann frei gewählt werden, muss aber mit der Angabe in der services.yml übereinstimmen. In dieser Datei wird eine Klasse mit dem Namen listener angelegt, darin kann nun für jedes Event das man benutzen möchte eine Methode angelegt werden die den PHP Code den man ausführen möchte enthält. Dazu muss die eigene Methode in einer Methode mit dem Namen getSubscribedEvents zugeordnet werden. Wenn man also PHP Code im Event core.page_header ausführen möchte sieht das Folgendermaßen aus:

public static function getSubscribedEvents()
{
    return array(
        'core.page_header'        => 'page_header',
    );
}

Die Methode getSubscribedEvents gibt ein Array zurück das den Namen des Events das man verwenden möchte als Schlüssel hat und den Namen der Methode die für das Event aufgerufen werden soll als Wert. Wenn man mehrere Events benutzen möchte kann man das Array einfach erweitern.

Als nächstes wird ein Konstruktor angelegt der die Objekte die man in der services.yml übergeben hat entgegen nimmt und an Variablen innerhalb der Klasse übergibt so das man sie später in seinen eigenen Methoden verwenden kann.

public function __construct(\phpbb\template\template $template)
{
    $this->template = $template;
}

Jetzt benötigt man nur noch seine Methode für das Event. Der Name kann frei gewählt werden, muss aber mit der Angabe in der Zuordnung die man in getSubscribedEvents gemacht hat übereinstimmen. In dieser Methode kann man nun seinen PHP Code den man ausführen möchte schreiben. In dem folgenden Beispiel wird eine neue Template Variable Erstellt und der Text "Beispiel Text" übergeben.

public function page_header($event)
{
    $this->template->assign_vars(array(
        'VARIABLE'    => 'Beispiel Text',
    ));
}

Die Variable $event enthält ein Array mit allen Variablen die vom phpBB Kern an das Event übergeben werden, in diesem Bespiel wird die Variable nicht genutzt. Der Komplette Code der listener.php sieht nun folgendermaßen aus:

<?php

/**
*
* @package phpBB Extension - bar
* @copyright (c) 2015 foo (https://example.com)
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace foo\bar\event;

/**
* @ignore
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
* Event listener
*/
class listener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            'core.page_header'        => 'page_header',
        );
    }

    /** @var \phpbb\template\template */
    protected $template;


    /**
    * Constructor
    *
    * @param \phpbb\template            $template        Template object
    */
    public function __construct(\phpbb\template\template $template)
    {
        $this->template = $template;
    }


    public function page_header($event)
    {
        $this->template->assign_vars(array(
            'VARIABLE'    => 'Beispiel Text',
        ));
    }
}

Variablen manipulieren

Events können nicht nur dazu genutzt werden um eigenen PHP Code auszuführen, sondern man kann darüber auch Variablen aus dem phpBB Kern manipulieren. Welche Variablen in einem Event zur Verfügung stehen kann man der Liste im Wiki entnehmen. Im folgenden Beispiel wird der Seitentitel durch "Mein neuer Titel" überschrieben.

Da man das $event Array nicht direkt überschreiben kann muss man den Wert den man ändern möchte erst einer eigenen Variable zuweißen die man nachdem man sie manipuliert hat wieder an das $event Array übergibt.