|  | <?php | 
        
          |  |  | 
        
          |  | namespace Vendor\Extension\Hook; | 
        
          |  |  | 
        
          |  | use TYPO3\CMS\Backend\Template\Components\ButtonBar; | 
        
          |  | use TYPO3\CMS\Backend\Template\Components\Buttons\InputButton; | 
        
          |  | use TYPO3\CMS\Backend\Template\Components\Buttons\LinkButton; | 
        
          |  | use TYPO3\CMS\Core\Http\ServerRequest; | 
        
          |  | use TYPO3\CMS\Core\Imaging\Icon; | 
        
          |  | use TYPO3\CMS\Core\Imaging\IconFactory; | 
        
          |  | use TYPO3\CMS\Core\Utility\GeneralUtility; | 
        
          |  |  | 
        
          |  | /** | 
        
          |  | * This class contains a hook to add a "Save & Close" action to the toolbar. | 
        
          |  | */ | 
        
          |  | class ContentButtonBarHook | 
        
          |  | { | 
        
          |  | /** @var ServerRequest */ | 
        
          |  | protected $request; | 
        
          |  |  | 
        
          |  | /** | 
        
          |  | * Creates an instance of this class. | 
        
          |  | * | 
        
          |  | * @param ServerRequest $request | 
        
          |  | */ | 
        
          |  | public function __construct(?ServerRequest $request = null) | 
        
          |  | { | 
        
          |  | $this->request = $request ?? $GLOBALS['TYPO3_REQUEST']; | 
        
          |  | } | 
        
          |  |  | 
        
          |  | /** | 
        
          |  | * Changes the button bar | 
        
          |  | * | 
        
          |  | * @param  array $parameters | 
        
          |  | * @param ButtonBar $buttonBar | 
        
          |  | * @return array | 
        
          |  | */ | 
        
          |  | public function getButtons(array $parameters, ButtonBar $buttonBar): array | 
        
          |  | { | 
        
          |  | if ($this->getTableName() === 'tt_content') { | 
        
          |  | $this->updateButtons($parameters['buttons'], $buttonBar); | 
        
          |  | } | 
        
          |  |  | 
        
          |  | return $parameters['buttons']; | 
        
          |  | } | 
        
          |  |  | 
        
          |  | /** | 
        
          |  | * Updates buttons. | 
        
          |  | * | 
        
          |  | * @param array $buttonGroups | 
        
          |  | * @param ButtonBar $buttonBar | 
        
          |  | */ | 
        
          |  | protected function updateButtons(array &$buttonGroups, ButtonBar $buttonBar) | 
        
          |  | { | 
        
          |  | foreach ($buttonGroups as $sideName => $buttonGroupSide) { | 
        
          |  | foreach ($buttonGroupSide as $posiition => $buttonGroup) { | 
        
          |  | foreach ($buttonGroup as $key => $button) { | 
        
          |  | $type = $button->getType(); | 
        
          |  | switch ($type) { | 
        
          |  | // Uncomment below if you want to have "icon-only" close & delete buttons like in v8 | 
        
          |  | //                        case LinkButton::class: | 
        
          |  | //                            switch ($button->getClasses()) { | 
        
          |  | //                                case 't3js-editform-close': | 
        
          |  | //                                case 't3js-editform-delete-record': | 
        
          |  | //                                    $button->setShowLabelText(false); | 
        
          |  | //                                    break; | 
        
          |  | //                            } | 
        
          |  | //                            break; | 
        
          |  | case InputButton::class: | 
        
          |  | if ($button->getName() === '_savedok') { | 
        
          |  | $iconFactory = GeneralUtility::makeInstance(IconFactory::class); | 
        
          |  | $splitSaveButton = $buttonBar->makeSplitButton(); | 
        
          |  | $splitSaveButton->addItem($button, true); | 
        
          |  | $splitSaveButton->addItem( | 
        
          |  | $buttonBar->makeInputButton() | 
        
          |  | ->setName('_savedoknew') | 
        
          |  | ->setValue('1') | 
        
          |  | ->setForm($button->getForm()) | 
        
          |  | ->setTitle($GLOBALS['LANG']->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:rm.saveNewDoc')) | 
        
          |  | ->setIcon( | 
        
          |  | $iconFactory->getIcon( | 
        
          |  | 'actions-document-save-new', | 
        
          |  | Icon::SIZE_SMALL | 
        
          |  | ) | 
        
          |  | ) | 
        
          |  | ); | 
        
          |  | $splitSaveButton->addItem( | 
        
          |  | $buttonBar->makeInputButton() | 
        
          |  | ->setName('_savedokview') | 
        
          |  | ->setValue('1') | 
        
          |  | ->setForm($button->getForm()) | 
        
          |  | ->setTitle($GLOBALS['LANG']->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:saveAndViewPage')) | 
        
          |  | ->setIcon( | 
        
          |  | $iconFactory->getIcon( | 
        
          |  | 'actions-document-save-close', | 
        
          |  | Icon::SIZE_SMALL | 
        
          |  | ) | 
        
          |  | ) | 
        
          |  | ); | 
        
          |  | $splitSaveButton->addItem( | 
        
          |  | $buttonBar->makeInputButton() | 
        
          |  | ->setName('_saveandclosedok') | 
        
          |  | ->setValue('1') | 
        
          |  | ->setForm($button->getForm()) | 
        
          |  | ->setTitle($GLOBALS['LANG']->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:saveAndClose')) | 
        
          |  | ->setIcon( | 
        
          |  | $iconFactory->getIcon( | 
        
          |  | 'actions-document-save-close', | 
        
          |  | Icon::SIZE_SMALL | 
        
          |  | ) | 
        
          |  | ) | 
        
          |  | ); | 
        
          |  | $buttonGroups[$sideName][$posiition][$key] = $splitSaveButton; | 
        
          |  | } | 
        
          |  | break; | 
        
          |  | } | 
        
          |  | } | 
        
          |  | } | 
        
          |  | } | 
        
          |  | } | 
        
          |  |  | 
        
          |  | /** | 
        
          |  | * Fetches table name from the request. | 
        
          |  | * | 
        
          |  | * @return string|null | 
        
          |  | */ | 
        
          |  | protected function getTableName(): ?string | 
        
          |  | { | 
        
          |  | $table = array_key_first($this->request->getQueryParams()['edit'] ?? []); | 
        
          |  | if (!is_string($table) || empty($table)) { | 
        
          |  | return null; | 
        
          |  | } | 
        
          |  |  | 
        
          |  | return $table; | 
        
          |  | } | 
        
          |  | } |