TYPO3 Backend-Header-Button
In diesem Blogbeitrag zeigen wir, wie man einen Button im TYPO3-Backend hinzufügt, beim Klicken eine Funktion ausführt, und danach das Ergebnis mittels TYPO3-Flash Messages anzeigt:

ButtonBar-Hook
Es existiert ein Hook, welchen man nutzen kann um weitere Buttons im TYPO3-Backend zu registrieren. Dazu reicht in der ext_localconf.php folgender Eintrag:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Backend\Template\Components\ButtonBar']['getButtonsHook']['va_template'] = \Varioous\VaTemplate\Hooks\ButtonBarHook::class . '->getButtons';
Hier ist die Implementierung des Hooks:
<?php
namespace Varioous\VaTemplate\Hooks;
use TYPO3\CMS\Backend\Routing\UriBuilder;
use TYPO3\CMS\Backend\Template\Components\ButtonBar;
use TYPO3\CMS\Core\Imaging\Icon;
use TYPO3\CMS\Core\Imaging\IconFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class ButtonBarHook
{
/**
* Get buttons
*
* @param array $params
* @param ButtonBar $buttonBar
*
* @return array
*/
public function getButtons(array $params, ButtonBar $buttonBar)
{
$buttons = $params['buttons'];
//check if edit record -> Show button only on edit
if (!is_null(GeneralUtility::_GET('edit'))) {
//check if book is set -> Show only on book edit
$editArray = GeneralUtility::_GET('edit');
if (isset($editArray['tx_vatemplate_domain_model_book'])) {
//register button
$iconFactory = GeneralUtility::makeInstance(IconFactory::class);
$button = $buttonBar->makeLinkButton();
$button->setIcon($iconFactory->getIcon('actions-document-export-csv',
Icon::SIZE_SMALL));
$button->setTitle('Von Moware aktualisieren');
$button->setShowLabelText(true);
$uid = array_shift(array_keys($editArray['tx_vatemplate_domain_model_book']));
//create link/route and set book uid
$uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
$uri = $uriBuilder->buildUriFromRoute('mowareupdate',
['book' => $uid]);
$button->setHref($uri);
//register button
$buttons[ButtonBar::BUTTON_POSITION_LEFT][5][] = $button;
}
}
return $buttons;
}
}
Backend Route anlegen
Nun muss noch die Backend-Route definiert werden. Im vorigen Schritt wurde der Button ja auf die Route ("mowareupdate") gelegt. Diese wird definiert über folgenden Eintrag in der Datei "Configuration/Backend/Routes.php":
<?php
return [
'mowareupdate' => [
'path' => '/mowarebookupdate',
'target' => \Varioous\VaTemplate\Controller\MowarebackendController::class . '::update',
]
];
Backend Controller action - Where the magic happens
In dieser Action "update" kann nun die gewünschte Funktionalität ausgeführt werden. Anschließend geben wir per Flash-Message das Ergebnis aus und machen wieder einen Redirect zur Bearbeiten-Ansicht des Buches.
<?php
declare(strict_types=1);
namespace Varioous\VaTemplate\Controller;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Backend\Routing\UriBuilder;
use TYPO3\CMS\Core\Http\RedirectResponse;
use TYPO3\CMS\Core\Messaging\FlashMessage;
use TYPO3\CMS\Core\Messaging\FlashMessageService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use Varioous\VaTemplate\Task\BookFullImportTask;
use Varioous\VaTemplate\Utility\ImportHelperUtility;
class MowarebackendController
{
public function update(ServerRequestInterface $request): ResponseInterface
{
//get book uid
$bookUid = intval($request->getQueryParams()['book']);
//do whatever you want
//create redirect url to edit view of book dataset
$backendUriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
$uriParameters = ['edit' => ['tx_vatemplate_domain_model_book' => [$bookUid => 'edit']]];
$editBookLink = $backendUriBuilder->buildUriFromRoute('record_edit',
$uriParameters);
//add error message
$message = GeneralUtility::makeInstance(FlashMessage::class,
'Artikel konnte nicht artualisiert werden, überprüfen Sie die Angaben und versuchen Sie es erneut!',
'Moware Update',
FlashMessage::ERROR,
true
);
//add success message
if ($updated) {
$message = GeneralUtility::makeInstance(FlashMessage::class,
'Artikel artualisiert',
'Moware Update',
FlashMessage::OK,
true
);
}
//add message to flash message queue
$flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
$messageQueue = $flashMessageService->getMessageQueueByIdentifier();
$messageQueue->addMessage($message);
//return redirect response
return new RedirectResponse($editBookLink);
}
}
Aus der Reihe TYPO3 Tipps und Tricks
-
REST API mit TYPO3 (REST Server)
-
Extbase Objekte Erweitern / Table mapping in TYPO3 10
-
Image Upload mit TYPO3
-
TYPO3 Blog Extension
- PSR-15 Middleware am Beispiel Mailchimp Webhook
- Ajax mit TYPO3 – so funktionierts!
- Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
- Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
- Cache für einzelne Extbase-Objekte leeren
- Grideditor für TYPO3 Inhaltselemente
Nützliche Links / Quellen
- Add hook to manipulate docHeader buttons when using the ModuleTemplateAPI
- Backend routing
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.