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);    }}