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.
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: