Files
cms-core/Documentation/Changelog/14.0/Deprecation-107823-ButtonBarMakeMethods.rst

187 lines
5.7 KiB
ReStructuredText

.. include:: /Includes.rst.txt
.. _deprecation-107823-1761297638:
====================================================================================
Deprecation: #107823 - ButtonBar, Menu, and MenuRegistry make* methods deprecated
====================================================================================
See :issue:`107823`
Description
===========
The factory methods in :php:`\TYPO3\CMS\Backend\Template\Components\ButtonBar`
for creating button instances, in
:php:`\TYPO3\CMS\Backend\Template\Components\Menu` for creating menu item
instances, and in
:php:`\TYPO3\CMS\Backend\Template\Components\MenuRegistry` for creating
menu instances have been deprecated in favor of using the new
:php:`\TYPO3\CMS\Backend\Template\Components\ComponentFactory` class directly.
The following methods are now deprecated:
* :php:`ButtonBar::makeGenericButton()`
* :php:`ButtonBar::makeInputButton()`
* :php:`ButtonBar::makeSplitButton()`
* :php:`ButtonBar::makeDropDownButton()`
* :php:`ButtonBar::makeLinkButton()`
* :php:`ButtonBar::makeFullyRenderedButton()`
* :php:`ButtonBar::makeShortcutButton()`
* :php:`ButtonBar::makeButton()`
* :php:`Menu::makeMenuItem()`
* :php:`MenuRegistry::makeMenu()`
Impact
======
Calling any of the deprecated :php:`make*()` methods on
:php-short:`\TYPO3\CMS\Backend\Template\Components\ButtonBar`,
:php-short:`\TYPO3\CMS\Backend\Template\Components\Menu`, or
:php-short:`\TYPO3\CMS\Backend\Template\Components\MenuRegistry` will trigger
a PHP deprecation notice.
The methods continue to work in TYPO3 v14 but will be removed in TYPO3 v15.
Affected installations
======================
All extensions using :php:`ButtonBar::make*()` methods to create buttons,
:php:`Menu::makeMenuItem()` to create menu items, or
:php:`MenuRegistry::makeMenu()` to create menus are affected.
The extension scanner will report any usages.
Migration
=========
Inject :php:`\TYPO3\CMS\Backend\Template\Components\ComponentFactory` in your
controller and use its :php:`create*()` methods instead of
:php:`ButtonBar::make*()`.
**Before:**
.. code-block:: php
:caption: Example (before)
use Psr\Http\Message\ResponseInterface;
public function myAction(): ResponseInterface
{
$buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
$linkButton = $buttonBar->makeLinkButton()
->setHref($url)
->setTitle('My Link')
->setIcon($icon);
$buttonBar->addButton($linkButton);
// ...
}
**After:**
.. code-block:: php
:caption: Example (after)
use Psr\Http\Message\ResponseInterface;
use TYPO3\CMS\Backend\Template\Components\ComponentFactory;
public function __construct(
protected readonly ComponentFactory $componentFactory,
) {}
public function myAction(): ResponseInterface
{
$buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
$linkButton = $this->componentFactory->createLinkButton()
->setHref($url)
->setTitle('My Link')
->setIcon($icon);
$buttonBar->addButton($linkButton);
// ...
}
Additionally, consider using the preconfigured button creation methods like
:php:`createBackButton()`, :php:`createCloseButton()`,
:php:`createSaveButton()`, :php:`createReloadButton()`, and
:php:`createViewButton()` for common button patterns.
For the low-level :php:`makeButton(string $className)` method, use
:php:`GeneralUtility::makeInstance()` directly or the appropriate
:php:`ComponentFactory::create*()` method:
.. code-block:: php
:caption: Example (button instantiation)
use TYPO3\CMS\Core\Utility\GeneralUtility;
// Before:
$button = $buttonBar->makeButton(MyCustomButton::class);
// After (option 1 - direct instantiation):
$button = GeneralUtility::makeInstance(MyCustomButton::class);
// After (option 2 - via factory if it's a standard button):
$button = $this->componentFactory->createLinkButton();
For :php:`Menu::makeMenuItem()`, use :php:`ComponentFactory::createMenuItem()`:
.. code-block:: php
:caption: Example (menu items)
use TYPO3\CMS\Backend\Template\Components\ComponentFactory;
// Before:
$menu = $menuRegistry->makeMenu();
$menuItem = $menu->makeMenuItem()
->setTitle('My View')
->setHref($url);
$menu->addMenuItem($menuItem);
// After:
public function __construct(
protected readonly ComponentFactory $componentFactory,
) {}
$menu = $this->componentFactory->createMenu();
$menuItem = $this->componentFactory->createMenuItem()
->setTitle('My View')
->setHref($url);
$menu->addMenuItem($menuItem);
For :php:`MenuRegistry::makeMenu()`, use :php:`ComponentFactory::createMenu()`:
.. code-block:: php
:caption: Example (menus)
use TYPO3\CMS\Backend\Template\Components\ComponentFactory;
// Before:
$menuRegistry = $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry();
$menu = $menuRegistry->makeMenu();
$menu->setIdentifier('viewSelector')->setLabel('View');
// After:
public function __construct(
protected readonly ComponentFactory $componentFactory,
) {}
$menuRegistry = $this->moduleTemplate->getDocHeaderComponent()->getMenuRegistry();
$menu = $this->componentFactory->createMenu();
$menu->setIdentifier('viewSelector')->setLabel('View');
Additionally, note that :php:`Menu::addMenuItem()` now returns :php:`static`
to support fluent interface patterns:
.. code-block:: php
:caption: Example (fluent chaining)
// Now possible with fluent interface:
$menu->addMenuItem($menuItem1)
->addMenuItem($menuItem2)
->addMenuItem($menuItem3);
.. index:: Backend, PHP-API, FullyScanned, ext:backend