Wir haben unsere Spalte, wir haben eine Benutzeroberfläche, um eine Eingabe an diese Spalte zu übergeben. Jetzt müssen wir das Speichern von Daten in dieser Spalte behandeln. Wir werden dies tun, indem wir den Forum-Controller erweitern und eine spezielle Methode erweitern, die aufgerufen wird, wenn ein Knoten und seine Daten gespeichert werden. Erstellen Sie zunächst eine "Class extension", die Sie im Admin-CP unter "Development" finden. Klicken Sie auf "Add class extension".

Hier müssen wir einen "Base class name" angeben. Dies ist der Name der Klasse, die wir erweitern, in diesem Fall XF\Admin\Controller\Forum. Und wir müssen einen "Extension class name" angeben, der die Klasse ist, die die Basisklasse erweitert. Geben Sie dies als Demo\Portal\XF\Admin\Controller\Forum ein. Wir sollten diese Klasse erstellen, bevor Sie auf Speichern klicken.

Erstellen Sie in src/addons/Demo/Portal/XF/Admin/Controller eine neue Datei mit dem Namen Forum.php. Dies scheint ein ziemlich langer Pfad zu sein, wir empfehlen jedoch einen solchen Pfad für erweiterte Klassen. Dadurch können Sie die Dateien, die erweiterte Klassen darstellen, einfacher identifizieren, indem Sie sich in einem Verzeichnis mit demselben Namen wie die erweiterte "Add-On"-ID (in diesem Fall XF) befinden. Außerdem wird klar, welche Klasse erweitert wurde, da die Verzeichnisstruktur demselben Pfad wie die Standardklasse folgt. Der Inhalt der Datei sollte zunächst so aussehen:
PHP:
<?php

namespace Demo\Portal\XF\Admin\Controller;

class Forum extends XFCP_Forum
{

}
Weitere Informationen finden Sie unter Extending classes und Type hinting.

Klicken Sie auf Speichern, um die "Class extension" zu speichern. Jetzt können wir etwas Code hinzufügen. Die spezielle Methode, die wir erweitern müssen, ist eine geschützte Funktion namens saveTypeData. Bei der Erweiterung einer vorhandenen Methode in einer beliebigen Klasse ist es wichtig, die ursprüngliche Methode aus mehreren Gründen zu überprüfen. Zunächst möchten wir sicherstellen, dass die Argumente, die wir in der erweiterten Methode verwenden, mit denen der Methode übereinstimmen, die wir erweitern. Zweitens müssen wir wissen, was diese Methode tatsächlich bewirkt. Soll die Methode beispielsweise etwas eines bestimmten Typs oder eines bestimmten Objekts zurückgeben? Dies ist sicherlich bei den meisten Controller-Aktionen der Fall, wie im Abschnitt Modifying a controller action reply (properly) beschrieben wird. Obwohl sich diese Methode innerhalb eines Controllers befindet, handelt es sich nicht um eine Controller-Aktion. Tatsächlich ist diese spezielle Methode eine "leere" Methode; Es wird nicht erwartet, dass irgendetwas zurückgegeben wird. Wir sollten jedoch immer sicherstellen, dass wir die übergeordnete Methode in unserer erweiterten Methode aufrufen, also fügen wir einfach die neue Methode selbst hinzu, ohne den neuen Code, den wir hinzufügen müssen:
PHP:
protected function saveTypeData(FormAction $form, \XF\Entity\Node $node, \XF\Entity\AbstractNode $data)
{
    parent::saveTypeData($form, $node, $data);
}
Die Argumentliste dieser bestimmten Methode setzt voraus, dass eine use-Deklaration vorhanden ist, die die vollständige \XF\Mvc\FormAction-Klasse auf einfach FormAction auslöst. Sie müssen diese Verwendungserklärung daher selbst hinzufügen. Fügen Sie use XF\Mvc\FormAction hinzu. zwischen den namespace und class Zeile.
Im Moment haben wir diese Methode erweitert, und unsere Erweiterung sollte aufgerufen werden, aber im Moment wird nichts anderes getan, als die übergeordnete Methode aufzurufen. Wir müssen nun den Wert der Eingabe von der forum_edit_page abrufen und auf die $data-Entity anwenden (die in diesem Fall die Forum-Entity ist).
PHP:
protected function saveTypeData(FormAction $form, \XF\Entity\Node $node, \XF\Entity\AbstractNode $data)
{
    parent::saveTypeData($form, $node, $data);

    $form->setup(function() use ($data)
    {
        $data->demo_portal_auto_feature = $this->filter('demo_portal_auto_feature', 'bool');
    });
}
Durch die Verwendung des FormAction-Objekts können verschiedene Erweiterungspunkte in den Prozess eingefügt werden, der im Verlauf einer typischen Formularübergabe ausgeführt wird. Es ist nicht für alle Controller-Aktionen verfügbar. Dies ist zum Beispiel in der Admin-CP viel häufiger, die häufig einem einfachen CRUD-Modell (Create, Read, Update, Delete) folgen. Viele andere Prozesse innerhalb von XF finden innerhalb eines Serviceobjekts statt, das normalerweise bestimmte Erweiterungspunkte für den ausgeführten Service hat. Diese besondere Verwendung des FormAction-Objekts unterscheidet sich etwas von dem, auf das Sie normalerweise stoßen würden. Das Speichern eines Elements ist ein etwas anderer Prozess, da Sie nicht nur mit der Element-Entity arbeiten, sondern auch mit einem zugehörigen Elementtyp, z.B. eine Forum-Entity. Wir haben jedoch Zugriff auf das form_action Objekt in dieser Methode. Daher sollten wir es verwenden. Wir haben es hier verwendet, um der "Setup"-Phase des Prozesses ein bestimmtes Verhalten hinzuzufügen. Wenn die run()-Methode des FormAction-Objekts aufgerufen wird, durchläuft es die verschiedenen Phasen in einer bestimmten Reihenfolge. Es spielt keine Rolle, in welcher Reihenfolge diese Verhalten zu dem Objekt hinzugefügt wurden. Sie werden immer noch in der Reihenfolge ausgeführt, in der sie eingerichtet, überprüft, angewendet und abgeschlossen werden (setup, validate, apply, complete).

Mit dem oben hinzugefügten Code können wir unsere demo_portal_auto_feature-Spalte in der Forum-Entity auf den Wert setzen, der für die Eingabe demo_portal_auto_feature gespeichert ist, die wir der Bearbeitungsseite des Forums hinzugefügt haben. Es sollte jetzt möglich sein zu testen, dass dies alles funktioniert. Bearbeiten Sie einfach ein Forum Ihrer Wahl und aktivieren Sie das Kontrollkästchen. Sie sollten zwei Dinge beobachten können. Wenn Sie das Forum erneut bearbeiten, sollte das Kontrollkästchen aktiviert sein. Zweitens: Wenn Sie in der Tabelle xf_forum nach dem Forum suchen, das Sie gerade bearbeitet haben, sollte das Feld demo_portal_auto_feature jetzt auf 1 gesetzt sein. Lassen Sie diesen Wert für dieses Forum aktiviert, da in diesem Forum automatisch Threads angezeigt werden.