TYPO3 Tipps und Tricks: Button Bar - Backend Buttons

Das TYPO3-Backend lässt sich flexibel an verschiedenen Stellen erweitern - in diesem Blogbeitrag werden wir uns nun ansehen, wie man das Backend um einen Button erweitern kann. Zusätzlich werden wir uns kurz FlashMessages ansehen, die den Benutzer über das Ergebnis des Buttons benachrichtigen.

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:

<?phpnamespace 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":

<?phpreturn [    '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.

<?phpdeclare(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);    }}

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:

Passend zu diesem Thema:

TYPO3 Tipps und Tricks: Cache für einzelne Extbase-Objekte leeren

TYPO3 Tipps und Tricks: Cache für einzelne Extbase-Objekte leeren

Kürzlich bin ich bei einem Projekt vor folgendem Problem gestanden: Per Plugin werden Extbase-Objekte auf einer Seite ausgegeben und diese auch gecach…

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (TYPO3 9)

TYPO3 Tipps und Tricks: Manueller/Programmatischer Login in Controller-Action (T…

Manchmal gibt es bei Web-Projekten die Notwendigkeit einen Login programmatisch (manuell, im PHP-Code) durchzuführen. Ein Kunde hat vor kurzem folgend…

TYPO3 Tipps und Tricks: Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container

TYPO3 Tipps und Tricks: Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-C…

In diesem Blogbeitrag zeigen wir, wie man eine Microsoft SQL-Server (MSSQL) Datenbank in einem Docker-Container mit ddev laufen lässt. Zusätzlich werd…