Feature: #97231 - PSR-14 events for modifying inline element controls

See forge#97231

Description

The new PSR-14 events \TYPO3\CMS\Backend\Form\Event\ModifyInlineElementEnabledControlsEvent and \TYPO3\CMS\Backend\Form\Event\ModifyInlineElementControlsEvent have been introduced, which serve as a more powerful and flexible replacement for the now removed hook $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tceforms_inline.php']['tceformsInlineHook'].

The \TYPO3\CMS\Backend\Form\Event\ModifyInlineElementEnabledControlsEvent is called before any control markup is generated. It can be used to enable or disable each control. With this event it's therefore possible to e.g. enable a control, which is disabled in TCA, only for some use case.

The \TYPO3\CMS\Backend\Form\Event\ModifyInlineElementControlsEvent is called after the markup for all enabled controls has been generated. It can be used to either change the markup of a control, to add a new control or to completely remove a control.

Note

Previously the deprecated hook interface InlineElementHookInterface required hook implementations to implement both methods renderForeignRecordHeaderControl_preProcess() and renderForeignRecordHeaderControl_postProcess(), even if only one was used. This is now resolved since listeners can be registered only for the needed PSR-14 event.

Example

Registration of the event in your extension's Services.yaml:

MyVendor\MyPackage\Frontend\MyEventListener:
  tags:
    - name: event.listener
      identifier: 'my-package/backend/modify-enabled-controls'
      method: 'modifyEnabledControls'
    - name: event.listener
      identifier: 'my-package/backend/modify-controls'
      method: 'modifyControls'

The corresponding event listener class:

use TYPO3\CMS\Backend\Form\Event\ModifyInlineElementEnabledControlsEvent;
use TYPO3\CMS\Backend\Form\Event\ModifyInlineElementControlsEvent;
use TYPO3\CMS\Core\Imaging\Icon;
use TYPO3\CMS\Core\Imaging\IconFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class MyEventListener
{

    public function modifyEnabledControls(
        ModifyInlineElementEnabledControlsEvent $event
    ): void {
        // Enable a control depending on the foreign table
        if ($event->getForeignTable() === 'sys_file_reference'
            && $event->isControlEnabled('sort')) {
            $event->enableControl('sort');
        }
    }

    public function modifyControls(
        ModifyInlineElementControlsEvent $event
    ): void {
        // Add a custom control depending on the parent table
        if ($event->getElementData()['inlineParentTableName'] === 'tt_content') {
            $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
            $iconCode = $iconFactory->getIcon(
                'my-icon-identifier',
                Icon::SIZE_SMALL
            )->render();
            $event->setControl(
                'tx_my_control',
                '<a href="/some/url" class="btn btn-default t3js-modal-trigger">'
                . $iconCode . '</a>'
            );
        }
    }
}

Available Methods

The list below describes all specific methods for the ModifyInlineElementEnabledControlsEvent:

Method

Parameters

Description

enableControl()

$identifier

Enable a control, if it exists. Returns whether the control could be enabled.

disableControl()

$identifier

Disable a control, if it exists. Returns whether the control could be disabled.

hasControl

$identifier

Whether a control exists for the given identifier.

isControlEnabled()

$identifier

Returns whether the control is enabled. Will also return false in case no control exists for the requested identifier.

getControlsState()

$identifier

Returns all controls with their state (enabled or disabled).

getEnabledControls()

Returns only the enabled controls.

The list below describes all specific methods for the ModifyInlineElementControlsEvent:

Method

Parameters

Description

getControls()

Returns all controls with their markup.

setControls()

$controls

Overwrite the controls.

getControl()

$identifier

Returns the markup for the requested control.

setControl()

$identifier $markup

Set a control with the given identifier and markup. Overwrites an existing control with the same identifier.

hasControl()

$identifier

Returns whether a control exists for the given identifier.

removeControl()

$identifier

Removes a control from the inline element. Returns whether the control could be disabled.

The list below describes all common methods of both events:

Method

Description

getElementData()

Returns the whole element data.

getRecord()

Returns the current record of the controls are created for.

getParentUid()

Returns the uid of the parent (embedding) record (uid or NEW...).

getForeignTable()

Returns the table (foreign_table) the controls are created for.

getFieldConfiguration()

Returns the TCA configuration of the inline record field.

isVirtual()

Returns whether the current records is only virtually shown and not physically part of the parent record.

Impact

The main advantages of the new PSR-14 events are an increased amount of available information, the object-oriented approach as well as the new built-in convenience features.

Additionally, it's no longer necessary to implement empty methods, required by the interface.