Zum Verwalten der Objekte im TYPO3-Backend werden normalerweise häufig die beiden Module "Liste" und "Seite" verwendet. Man wählt über das List-Modul im Page-Browser den Ordner mit den Objekten aus, und hat anschließend die gewünschte Darstellung. Um den Redakteuren dies zu erleichtern bzw. die Verwaltung übersichtlicher und einfacher zu gestalten, erstellen wir bei TYPO3-Web-Projekten, zusätzliche Backend-Module.
Hier ein Screenshot wie ein TYPO3-Backend mit verschiedenen erstellen Backend-Modulen aussieht:
TYPO3-Backend-Module registrieren
Über die TYPO3-API muss zuerst das neue Backend-Module TYPO3 bekannt gemacht werden. In diesem Beispiel werden zwei Module registriert:
- Zuerst das Hauptmodul "Verwaltung" -> Dies dient zur besseren Gliederung
- Anschließend das Modul "Gegenstände" mit der List-View aller verfügbaren Gegenständen
Die geschieht in der Datei ext_tables.php.
// Verwaltungs MODULE
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
'VaSite',
'main',
'',
'',
[],
[
'access' => 'user,group',
'icon' => 'EXT:va_site/Resources/Public/Icons/Module/main.svg',
'labels' => 'LLL:EXT:va_site/Resources/Private/Language/locallang_mod_main.xlf',
]
);
// Subjects MODULE
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
'VaSite',
'main',
'tx_vasite_subjects',
'',
[
\Various\VaSite\Controller\BackendController::class => 'subjects',
],
[
'access' => 'user,group',
'icon' => 'EXT:va_site/Resources/Public/Icons/Module/subject.svg',
'labels' => 'LLL:EXT:va_site/Resources/Private/Language/locallang_mod_subjects.xlf',
]
);
TYPO3 Backend-Controller
Im nächsten Schritt müssen wir für das Gegenstände-Modul noch die Funktionalität hinzufügen, damit das List-Module mit den richtigen Datensätzen im Backend erscheint. Dazu haben wir TYPO3 mitgeteilt (Zeile 22) dass bei einem Klick auf das Module die "subjects"-Action im BackendController aufgerufen wird. Im nächsten Snippet zeigen wir nun die Methode im Backend Controller:
<?php
namespace Various\VaSite\Controller;
use Various\VrsBase\Utility\BackendModuleUtility;
class BackendController extends ActionController
{
protected $siteConfig;
public function __construct()
{
$this->siteConfig = SiteConfiguration::get()->getConfiguration();
}
public function subjectsAction()
{
return BackendModuleUtility::getBackendModule($this->request, 'tx_vasite_domain_model_subject',
intval($this->siteConfig['vasite_books_subjectspid']));
}
}
TYPO3 Backend List-View
Wie im obigen Code-Snippet bereits erahnt werden kann, versteckt sich die eigentliche Funktionalität in der Klasse BackendModuleUtility, an welche wir die gewünschte Tabelle und die PID des gewünschten Ordners übergeben. Wir lesen die PID aus den Seiteneigenschaften, kann aber natürlich auch statisch hinterlegt werden.
<?php
namespace Various\VrsBase\Utility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Request;
use TYPO3\CMS\Recordlist\Controller\RecordListController;
class BackendModuleUtility
{
public static function getBackendModule($request, $table, $id, $searchLevels = false)
{
$recordListController = GeneralUtility::makeInstance(RecordListController::class);
//reflect Record List Controller to modify query params
$backendModuleRequest = new \ReflectionObject($request);
$requestProperty = $backendModuleRequest->getProperty('request');
$requestProperty->setAccessible(true);
$request = $requestProperty->getValue($request);
$serverRequest = new \ReflectionObject($request);
$queryParamsProperty = $serverRequest->getProperty('queryParams');
$queryParamsProperty->setAccessible(true);
$queryParams = $queryParamsProperty->getValue($request);
//set table and id
$queryParams['table'] = $table;
$queryParams['id'] = $id;
if ($searchLevels) {
//set search level
$queryParams['search_levels'] = $searchLevels;
}
$queryParamsProperty->setValue($request, $queryParams);
$newRequest = GeneralUtility::makeInstance(Request::class, $request);
return $recordListController->mainAction($newRequest);
}
}
An dieser Stelle sei erwähnt, dass wir mittels Reflection zwei Eigenschaften auf "public" setzen, da diese sonst nicht gelesen bzw. geschrieben werden können:
- $request
- $queryParams
Der Request wird benötigt, um an die Query-Params (den Query Parameter) zu kommen. In den Query-Parametern setzen wir nun die gewünschte Tabelle und die ID des Ordners. Aktuell gibt es leider im List-View-Module von TYPO3 keine andere Möglichkeit, um diese Werte zu überschreiben oder zu setzen, deshalb haben wir uns für diesen Weg entschieden.
Der Ablauf funktioniert in TYPO3 11 - für die Verwendung in TYPO3 10 oder früher (9, 8 und 7) empfiehlt sich dieser Blog-Beitrag.
Zusammenfassung
Bei der Webentwicklung mit TYPO3 kann man den Redakteuren für die einfachere Verwendung und Verwaltung des TYPO3-Backends zusätzliche Module zur Verfügung stellen. Dazu muss zuerst das Module registriert werden und die Funktionalität im Controller implementiert werden. Dabei wird das List-Module als Basis verwendet und die Parameter Tabelle und die ID des gewünschten Ordners mit den Extbase-Objekten übergeben.
Hier findet man die TYPO3-Dokumentation zu den Backend Modulen.
Weitere Beiträge aus der Reihe TYPO3 Tipps und Tricks
-
UriBuilder im Backend-Context - Links im Backend-Context erstellen
-
Seite programmatisch erstellen / Create Page Programmatically
-
Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
-
Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.
Wir entwickeln digitale Lösungen mit Leidenschaft
Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.
Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da: