Translations
Info
All page names need to be in English.
en da  de  fr  it  ja  km  nl  ru  zh

TYPO3.CMS/Releases/7.6/Feature

From TYPO3Wiki
Jump to: navigation, search

Contents

Feature: #20875 - Make hardcoded indexed_search parameters configurable via TS

Description

The following TS properties can now be configured for indexed search

[plugin.tx_indexedsearch.results. || plugin.tx_indexedsearch.settings.results.]
titleCropAfter = 50
titleCropSignifier = ...
summaryCropAfter = 180
summaryCropSignifier =
hrefInSummaryCropAfter = 60
hrefInSummaryCropSignifier = ...
markupSW_summaryMax = 300
markupSW_postPreLgd = 60
markupSW_postPreLgd_offset = 5
markupSW_divider = ...

Every TS property has the stdWrap property, too.

Impact

Default settings do not change old behaviour.

Feature: #23156 - Indexed search: Make path separator of search result configurable

Description

A new TypoScript configuration option `breadcrumbWrap` has been added. It allows to configure the page path separator used in breadcrumbs in Indexed Search results. This option supports TypoScript option split syntax.

Impact

By default Indexed Search is configured to use "/" as a path separator, so it's backward compatible. Use following configuration for Indexed Search Extbase plugin:

plugin.tx_indexedsearch.settings.breadcrumbWrap = / || /

For plugin based on AbstractPlugin use:

plugin.tx_indexedsearch.breadcrumbWrap = / || /

Feature: #27057 - Relations to the same table in Extbase

Description

It is now possible to use a domain model where an object is connected to another object of the same class directly

namespace \Vendor\Extension\Domain\Model;
class A {
    /**
    * @var \Vendor\Extension\Domain\Model\A
    */
    protected $parent;

as well as using a domain model where an object has multiple relations to objects of the same class

namespace \Vendor\Extension\Domain\Model;
class A {
    /**
    * @var \Vendor\Extension\Domain\Model\B
    */
    protected $x;

    /**
    * @var \Vendor\Extension\Domain\Model\B
    */
    protected $y;

as well as indirectly

namespace \Vendor\Extension\Domain\Model;
class A {
    /**
    * @var \Vendor\Extension\Domain\Model\B
    */
    protected $b;

    /**
    * @var \Vendor\Extension\Domain\Model\C
    */
    protected $c;

namespace \Vendor\Extension\Domain\Model;
class B {
    /**
    * @var \Vendor\Extension\Domain\Model\C
    */
    protected $c;

Using this kind of relations before was only possible by overriding the Extbase query builder and doing manual queries because the Extbase query builder created wrong SQL statements. Now Extbase properly supports these cases.

Impact

Extbase now correctly handles relations to objects of the same class.

Feature: #35245 - Rework workspace notification settings

Description

The current notification settings have some drawbacks and are not easy to understand if it comes the the expected behavior in the workspace module. The settings are defined in each sys_workspace and sys_workspace_stage record and are evaluated in the workspace module if sending a particular element to be reviewed to the previous or next stage.

Currently there are the following notification settings:

  • on stages
    • "edit stage": takes recipients from "adminusers" field (workspace owners)
    • "ready to publish" stage: takes recipients from "members" field (workspace members)
  • on preselection of recipients
    • "all (non-strict)": if users from workspace setting (field "adminusers" or "members") are also in the specific "default_users" setting for the stage, the checkbox is enabled by default and cannot be changed, otherwise it's not checked
    • "all (strict)": all users from workspace setting (field "adminusers" or "members") are checked and cannot be changed
    • **; "some (strict)": all users from workspace setting (field "adminusers"
      or "members") are checked, but still can be changed
  • behavior
    • sending to "edit" stage: members are notified per default
    • sending to "ready to publish" stage: owners are notified per default

The changes extends the possibilities to define notification settings:

  • on stages
    • add settings for "publish-execute" stage (actual publishing process)
  • on preselection of recipients
    • remove modes
    • replace settings for showing the dialog and whether modifying the preselection is allowed at all (getting rid of the "strict" modes)
    • add possibilities to defined notification recipients
      • owner & members as defined in the accordant fields
      • editors that have been working on a particular element
      • responsible persons (on custom stages only)

Impact

The meaning and behavior of the workspaces notification settings concerning preselected recipients and the possibility to modify the selection on moving an element to a particular change is different now. However, an upgrade wizard helps to upgrade the settings to the new definitions.

Feature: #44127 - Introduced two new Hooks for OpenID

Description

Two hooks were added to the OpenIdService. They make it possible to modify the request sent to the OpenID Server, or to modify/create backend users on the fly during OpenID login.

Hooks

The following hooks were introduced:

  • *; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['openid']['getUserRecord']
    Modifies the userRecord after it has been fetched (or none was found). Can be used to e.g. create a new record if none was found or update an existing one. The following parameters are passed to the hook: record, response, authInfo.
  • *; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['openid']['authRequest']
    Modifies the Authentication Request, before it's sent. Can be used to e.g. request additional attributes like a nickname from the OpenID Server. The following parameters are passed to the hook: authRequest, authInfo.

Feature: #47613 - Indexed Search: make no_cache parameter for forwardSearchWordsInResultLink configurable

Description

A new TypoScript configuration option forwardSearchWordsInResultLink.no_cache has been added. It controls whether the no_cache parameter should be added to page links together with search words.

Use following configuration for Indexed Search Extbase plugin:

plugin.tx_indexedsearch.settings.forwardSearchWordsInResultLink.no_cache = 1

For plugin based on AbstractPlugin use:

plugin.tx_indexedsearch.forwardSearchWordsInResultLink.no_cache = 1

Impact

The default value is set to 1, so it's backward compatible.

Feature: #56633 - Form protection API for frontend usage

Description

As of now frontend plugins needed to implement CSRF protection on their own. This change introduces a new class to allow usage of the FormProtection (CSRF protection) API in the frontend.

Usage is the same as in backend context:

$formToken = \TYPO3\CMS\Core\FormProtection\FormProtectionFactory::get()
    ->getFormProtection()->generateToken('news', 'edit', $uid);


if ($dataHasBeenSubmitted
    && \TYPO3\CMS\Core\FormProtection\FormProtectionFactory::get()->validateToken(
        \TYPO3\CMS\Core\Utility\GeneralUtility::_POST('formToken'),
        'User setup',
        'edit'
    )
) {
    // Processes the data.
} else {
    // Create a flash message for the invalid token or just discard this request.
}

Impact

FormProtection API can now also be used in frontend context.

Feature: #64286 - Added absolute url option to uri.image and image viewHelper

Description

The ImageViewhelper and Uri/ImageViewHelper got a new option absolute. With this option you are able to force the ViewHelpers to output an absolute url.

Examples:

<code title="ImageViewHelper">
    <f:image image="{file}" width="400" height="375" absolute="1" />
</code>
<output>
    <img alt="alt set in image record" src="http://www.mydomain.com/fileadmin/_processed_/323223424.png" width="400" height="375" />
</output>

<code title="Uri/ImageViewHelper">
    <f:uri.image image="{file}" width="400" height="375" absolute="1" />
</code>
<output>
    http://www.mydomain.com/fileadmin/_processed_/323223424.png
</output>

Feature: #66369 - Added LinkBrowser APIs

Description

This new feature allows to extend the link browser with new tabs, which allow to implement custom link functionality in a generic way in a so called LinkHandler. Since the LinkBrowser is used by FormEngine and RTE, the new API ensures that your custom LinkHandler works with those two, and possible future, usages flawlessly.

Each tab rendered in the link browser has an associated link handler, responsible for rendering the tab and for creating and editing of links belonging to this tab.

Tab registration

Link browser tabs are registered in page TSconfig like this:

TCEMAIN.linkHandler.<tabIdentifier> {
    handler = TYPO3\CMS\Recordlist\LinkHandler\FileLinkHandler
    label = LLL:EXT:lang/locallang_browse_links.xlf:file
    displayAfter = page
    scanAfter = page
    configuration {
        customConfig = passed to the handler
    }
}

The options displayBefore and displayAfter define the order how the various tabs are displayed in the link browser.

The options scanBefore and scanAfter define the order in which handlers are queried when determining the responsible tab for an existing link. Most likely your links will start with a specific prefix to identify them. Therefore you should register your tab at least before the 'url' handler, so your handler can advertise itself as responsible for the given link. The 'url' handler should be treated as last resort as it will work with any link.

Handler implementation

A link handler has to implement the \TYPO3\CMS\Recordlist\LinkHandler\LinkHandlerInterface interface, which defines all necessary methods for communication with the link browser.

Additionally, each link handler should also provide a Javascript module (requireJS), which takes care of passing a link to the link browser. A minimal implementation of such a module looks like this:

define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {

    var myModule = {};

    myModule.createMyLink = function() {
        var val = $('.myElmeent').val();

        // optional: If your link points to some external resource you should set this attribute
        LinkBrowser.setAdditionalLinkAttribute('data-htmlarea-external', '1');

        LinkBrowser.finalizeFunction('mylink:' + val);
    };

    myModule.initialize = function() {
        // todo add necessary event handlers, which will propably call myModule.createMyLink
    };

    $(myModule.initialize);

    return myModule;
}

Notice the call to LinkBrowser.finalizeFunction, which is the point where the link is handed over to the link browser for further processing and storage.

Hooks

You may have the need to modify the list of available link handlers based on some dynamic value. For this purpose you can register hooks.

The registration of a link browser hook generally happens in your ext_tables.php and looks like:

if (TYPO3_MODE === 'BE') {
    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['LinkBrowser']['hooks'][1444048118] = [
        'handler' => \Vendor\Ext\MyClass::class,
        'before' => [], // optional
        'after' => [] // optional
    ];
}

The before and after elements allow to control the execution order of all registered hooks.

Currently the following list of hooks is implemented:

* modifyLinkHandlers(linkHandlers, currentLinkParts): May modify the list of available link handlers and has to return the final list.
  • modifyAllowedItems(allowedTabs, currentLinkParts): May modify the list of available tabs and has to return the final list.

Feature: #66369 - Added new element browser API

Description

The former code monster class ElementBrowser has been split into dedicated parts of functionality. Specifically the functionality of selecting elements for the FormEngine and the code parts for creating links, used in FormEngine and RTE, have been moved into separate APIs.

Each type of element, which can be selected in FormEngine, has its own element browser class. You may add your own special type by registering your own element browser in your ext_tables.php as follows:

if (TYPO3_MODE === 'BE') {
    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ElementBrowsers'][&lt;identifier&gt;] = \Vendor\Ext\TheClass::class;
}

The registered class is expected to implement the \TYPO3\CMS\Recordlist\Browser\ElementBrowserInterface interface.

Feature: #68771 - Add contentObject functionality to form MailPostProcessor and introduce replyToEmail

Description

If the form configuration is defined by TypoScript the following items for the MailPostProcessor in ext:form have contentObject functionality now: - subject - senderEmail - senderName - recipientEmail - ccEmail - replyToEmail (newly introduced, replyToEmailField as fallback) - priority - organization

This feature is not available when building the form with the help of the wizard. The functionality can only be used be setting up the form via TypoScript.

Usage

In the mail postProcessor configuration you could do something like this (depending on the names of the form elements):

replyToEmail = TEXT
replyToEmail {
    data = GP:tx_form_form|tx_form|e-mail
    htmlSpecialChars = 1
}
subject = TEXT
subject {
    data = GP:tx_form_form|tx_form|subject
    htmlSpecialChars = 1
    noTrimWrap = |Mail from Form: ||
}

Feature: #68895 - Introduced hook in BackendUserAuthentication::getDefaultUploadFolder

Description

It is now possible to change the upload folder returned by BackendUserAuthentication::getDefaultUploadFolder() by registering a hook. This makes it possible to set a different upload folder for fields with direct upload enabled in the backend.

Register own getDefaultUploadFolder hook

To use your own hook to manipulate the upload folder you need to register the function in ext_localconf.php of your extension.

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauthgroup.php']['getDefaultUploadFolder'][] =
    \Vendor\MyExtension\Hooks\DefaultUploadFolder::class . '->getDefaultUploadFolder';

Example getDefaultUploadFolder hook

&lt;?php
namespace Vendor\MyExtension\Hooks;

use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Resource\Folder;

/**
 * Class DefaultUploadFolder
 */
class DefaultUploadFolder {

    /**
     * Get default upload folder
     *
     * If there is a folder present with the same name as the last part of the table name use that folder.
     *
     * @param array $params
     * @param BackendUserAuthentication $backendUserAuthentication
     * @return Folder
     */
    public function getDefaultUploadFolder($params, BackendUserAuthentication $backendUserAuthentication) {

        /** @var Folder $uploadFolder */
        $uploadFolder = $params['uploadFolder'];
        $pid = $params['pid'];
        $table = $params['table'];
        $field = $params['field'];

        $matches = [];
        if (!empty($uploadFolder) &amp;&amp; preg_match('/_([a-z]+)$/', $table, $matches)) {
            $folderName = $matches[1];
            if ($uploadFolder->hasFolder($folderName)) {
                $uploadFolder = $uploadFolder->getSubfolder($folderName);
            }
        }
        return $uploadFolder;
    }
}

Feature: #69120 - Add basic file search in element browser

Description

A file search has been added to the TYPO3 Element Browser.

The search happens recursively from the currently selected folder in the folder tree. This way it is possible to search whole mount points or just single folders with a lot of files.

Feature: #69706 - Add support for alternative (inline) icon markup

Description

It is now possible to set alternative markups for an Icon. By default icon is rendered as <img src="..."/> tag with path to the icon file in the src attribute. With this change it's possible to render svg icon inline in the html e.g. <svg>...</svg>.

Placing SVG images inline allows to manipulate them using CSS or JS.

$icon->setAlternativeMarkup(SvgIconProvider::MARKUP_IDENTIFIER_INLINE, '&lt;svg&gt;...&lt;/svg&gt;');

Impact

An IconProvider can now add multiple markup variants for an icon.

Feature: #69764 - Introduced file icon detection by mime-type

Description

The IconRegistry has been extended with a mapping of file icons by mime-type. It is possible to register full mime-types main-type/sub-type but also a fallback for only the main part of the mime-type main-type/*. The core provides these fallbacks for audio/*, video/*, image/* and text/*.

Impact

It is now possible to register or overwrite the iconIdentifier for a file mime-type.

$iconRegistry = GeneralUtility::makeInstance(IconRegistry::class);
$iconRegistry->registerMimeTypeIcon('video/my-custom-type', 'icon-identifier-for-my-custom-type');

Feature: #69814 - ModuleTemplate API

Challenge

Currently all DocHeaders are implemented on their own.

This means we have about 80 DocHeaders which are equal but not the same.

The main challenge is to provide extension developers with all tools they need to build decent backend modules while maintaining control of the docHeader itself.

Solution

We will provide a replacement for DocumentTemplate which provides an easy-to-use API which is on the other hand flexible enough to tackle all tasks we currently think of.

At the same time we will remove the amount of duplicate marker based templates.

The API uses the Fluent-API approach and has been built to supply maximum IDE code completion support.

Parts of a docHeader Currently a typical docHeader is split up into the following sections:

  • Top Bar
    • Context Sensitive Help Icon
    • Select Menu(s)
    • Path
    • RecordInformation incl. Clickmenu
  • Bottom Bar
    • Left Button Bar
    • Right Button Bar

API Components

Buttons

InputButton
Used to generate a <button> element.
LinkButton
Used to generate links
SplitButton
A mixed component accepting multiple button objects and renders them into a condensed form.
FullyRenderedButton
Displays arbitrary HTML code and we highly recommend to use these.

Menus

Creating menus is pretty simple. Ask the DocHeaderComponent for the MenuRegistry and ask the MenuRegistry to create a Menu for you.

The Menu in return can create MenuItems for you.

A Menu can have several Types which are represented by their respective Fluid Partials in EXT:backend/Resources/Private/Partials/Menu/.

Examples of usages

Adding a button

$openInNewWindowButton = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar()
    ->makeLinkButton()
    ->setHref('#')
    ->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.openInNewWindow', TRUE))
    ->setIcon($this->iconFactory->getIcon('actions-window-open', Icon::SIZE_SMALL))
    ->setOnClick($aOnClick);

$this->moduleTemplate->getDocHeaderComponent()->getButtonBar()
    ->addButton($openInNewWindowButton, ButtonBar::BUTTON_POSITION_RIGHT);

Adding a menu with menu items

$languageMenu = $this->moduleTemplate->getDocHeaderComponent()->getModuleMenuRegistry()->makeMenu()
    ->setIdentifier('_langSelector')
    ->setLabel($this->getLanguageService()->sL('LLL:EXT:lang/locallang_general.xlf:LGL.language', TRUE));
$menuItem = $languageMenu->makeMenuItem()
    ->setTitle($lang['title'] . $newTranslation)
    ->setHref($href);
if((int)$lang['uid'] === $currentLanguage) {
    $menuItem->setActive(TRUE);
}
$languageMenu->addMenuItem($menuItem);
$this->moduleTemplate->getDocHeaderComponent()->getModuleMenuRegistry()->addMenu($languageMenu);

ButtonBar Hook

The old module rendering knew a $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['docHeaderButtonsHook'] hook to manipulate buttons. A similar hook is available in ModuleTemplate API as $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Backend\Template\Components\ButtonBar']['getButtonsHook'].

Registering your own hook

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['Backend\Template\Components\ButtonBar']['getButtonsHook']['MyExt'] =
    \MyVendor\MyExt\Hooks\ButtonBarHook::class . '->getButtons';

Example usage of the hook

class ButtonBarHook {

    /**
     * Get buttons
     *
     * @param array $params
     * @param ButtonBar $buttonBar
     * @return array
     */
    public function getButtons(array $params, ButtonBar $buttonBar) {
        $buttons = $params['buttons'];

        $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
        $button = $buttonBar->makeLinkButton();
        $button->setIcon($iconFactory->getIcon('my-custom-icon', Icon::SIZE_SMALL));
        $button->setTitle('My custom docHeader button');
        $button->setOnClick('alert(&quot;Hook works&quot;);return false;');

        $buttons[ButtonBar::BUTTON_POSITION_LEFT][1][] = $button;

        return $buttons;
    }
}

Feature: #69916 - PSR-7-based Routing for Backend AJAX Requests

Description

Support for PSR-7-based Routing for Backend AJAX requests has been added.

Impact

To add a route for an AJAX request, create the Configuration/Backend/AjaxRoutes.php of your extension:

return [
    // Does something
    'unique_route_name' => [
        'path' => '/toolcollection/some-action',
        'target' => \ACME\Controller\SomeController::class . '::myAction',
    ]
];

The unique_route_name (route identifier) parameter acts as the previously known key to call BackendUtility::getAjaxUrl() passed as parameter to the action refers to the route path, not to the route identifier itself. AJAX handlers configured in AjaxRoutes.php are not compatible with definitions in ext_localconf.php registered by ExtensionManagementUtility::registerAjaxHandler() due to different method signatures in the target actions, using PSR-7.

The route identifier is used in BackendUtility::getAjaxUrl() as $ajaxIdentifier` and as key in the global TYPO3.settings.ajaxUrls JavaScript object.

Feature: #70033 - Introduced TCA option showIconTable for selectSingle fields

Description

A new option showIconTable has been introduced for select fields with render type selectSingle to enforce or prevent the icon table underneath the field. By default the icon table is not shown.

Example

// Enforce icon table showing flags
$GLOBALS['TCA']['tt_content']['columns']['sys_language_uid']['config']['showIconTable'] = true;

Feature: #70126 - Introduce TCA option to add autocomplete attribute to input fields

Description

It is now possible to enforce or disable the auto completion for input fields in edit mode. The option is called autocomplete and can be set to TRUE or FALSE in the config section of a field.

Example

// Prevent auto completion of username field for be_users records
$GLOBALS['TCA']['be_users']['columns']['username']['config']['autocomplete'] = FALSE;

Feature: #70170 - ViewHelper to strip whitespace between HTML tags

Description

Removes redundant spaces between HTML tags while preserving the whitespace that may be inside HTML tags. Trims the final result before output.

Heavily inspired by Twig's corresponding node type.

<code title="Usage of f:spaceless">
<f:spaceless>
<div>
    <div>
        <div>text

text</div>
</div>
</div>
</f:spaceless>
</code>
<output>
<div><div><div>text

text</div></div></div>
</output>

Feature: #70332 - EXT:form - Add HTML4 / HTML5 attributes to the wizard

Description

The form wizard should support a wide set of attributes. At the moment the wizard is able to set some attributes, but this attribute-set is not complete and does not include HTML5 attributes.

The patch extends the wizard to set all universal HTML and HTML5 attributes based on selfhtml documentation version 8.1.2.

Currently supported attributes

accept, acceptcharset, accesskey, action, alt, checked, class, cols, dir, disabled, enctype, id, label, lang, maxlength, method, multiple, name, placeholder, readonly, rows, selected, size, src, style, tabindex, title, type, value

New attributes

autocomplete, autofocus, contenteditable, contextmenu, draggable, dropzone, height, hidden, inputmode, list, max, min, minlength, novalidate, pattern, required, selectionDirection, selectionEnd, selectionStart, spellcheck, step, translate, width, wrap

The type attribute will be extended with the following HTML5 types:

color, date, datetime, datetime-local, email, month, number, range, search, tel, time, url, week

Each element is now able to set the HTML universal attributes and element specific attributes.

Universal attributes are:

accesskey, class, contenteditable, contextmenu, dir, draggable, dropzone, hidden, id, lang, spellcheck, style, tabindex, title, translate

FORM

Currently supported attributes

accept, accept-charset, action, class, dir, enctype, id, lang, method, style, title

New attributes

Universal attributes + accept, accept-charset, action, autocomplete, enctype, method, novalidate

BUTTON

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, style, tabindex, title, type, value

New attributes

Universal attributes + autofocus, disabled, name, type, value

SELECT

Currently supported attributes

class, disabled, id, lang, multiple, name, size, style, tabindex, title

New attributes

Universal attributes + autofocus, disabled, multiple, name, required, size

TEXTAREA

Currently supported attributes

accesskey, class, cols, dir, disabled, id, lang, name, placeholder, readonly, rows, style, tabindex, title

New attributes

Universal attributes + autofocus, cols, disabled, inputmode, maxlength, minlength, name, placeholder, readonly, required, rows, selectionDirection, selectionEnd, selectionStart, wrap

SUBMIT

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, style, tabindex, title, type, value

New attributes

Universal attributes + autofocus, disabled, name, type, value

RADIO

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, style, tabindex, title, type, value

New attributes

Universal attributes + autofocus, checked, disabled, name, readonly, required, type, value

PASSWORD

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, maxlength, name, placeholder, readonly, size, style, tabindex, title, type, value

New attributes

Universal attributes + autocomplete, autofocus, disabled, maxlength, minlength, name, pattern, placeholder, readonly, required, size, type, value

HIDDEN

Currently supported attributes

class, id, lang, name, style, type, value

New attributes

Universal attributes + name, type, value

FILEUPLOAD

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, size, style, tabindex, title, type

New attributes

Universal attributes + accept, autofocus, disabled, multiple name, readonly, required, type, value

RESET

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, style, tabindex, title, type, value

New attributes

Universal attributes + autofocus, disabled, name, type, value

TEXTLINE

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, maxlength, name, placeholder, readonly, size, style, tabindex, title, type, value

New attributes

Universal attributes + autocomplete, autofocus, disabled, inputmode, list, maxlength, minlength, name, pattern, placeholder, readonly, required, size, type, value

CHECKBOX

Currently supported attributes

accesskey, alt, class, dir, disabled, id, lang, name, style, tabindex, title, type, value

New attributes

Universal attributes + autofocus, checked, disabled, name, readonly, required, type, value

Feature: #70531 - RequireJS module for split buttons

Description

A RequireJS module for split buttons has been added. The module can be used in another RequireJS modules to add callbacks being executed before the submit takes place. As the callback receives the click event, the submit can be modified, e.g aborting the submit.

Impact

To use the SplitButtons module, include it in your own RequireJS module:

define('Vendor/Ext/Module', ['TYPO3/CMS/Backend/SplitButtons'], function(SplitButtons) {
    // Your code...
});

Callbacks will be added by calling SplitButtons.addPreSubmitCallback:

SplitButtons.addPreSubmitCallback(function(e) {
    // Code being executed as callback before submit
});

Feature: #70583 - Introduced Icon API in JavaScript

Description

A JavaScript-based icon API based on the PHP API has been introduced. The methods getIcon() and getIcons() can be called in a RequireJS module.

When imported in a RequireJS module, a developer can fetch icons via JavaScript with the same parameters as in PHP. The methods getIcon() and getIcons() return Promise objects.

Importing

define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) {
});

Get icons

A single icon can be fetched by getIcon() which takes four parameters:

identifier
The icon identifier.
size
The size of the icon. Please use the properties of the Icons.sizes object.
overlayIdentifier
An overlay identifier rendered on the icon.
state
The state of the icon. Please use the properties of the Icons.states object.

To use the fetched icons, chain the done() method to the promise.

Examples

// Get a single icon
Icons.getIcon('spinner-circle-light', Icons.sizes.small).done(function(spinner) {
    $toolbarItemIcon.replaceWith(spinner);
});

Feature: #71196 - Disallow localization mixtures

Description

The PageLayout UI will now inform users if a mixture of translated content and standalone content is used in the page module since this is a major source of confusion for both administrators and editors.

In case an integrator knows what he/she is doing, we introduce a PageTSConfig setting to turn these warnings off to allow further usage of inconsistent translation handling.

mod.web_layout.allowInconsistentLanguageHandling = 1

Impact

Upon setting mod.web_layout.allowInconsistentLanguageHandling to 1 the page module will behave as before and allow inconsistent mixups of languages in a certain language.

Feature: #71251 - Add FlashMessage support in ModuleTemplate API

Description

Flash messages have different queues, depending on in which context they are enqueued. The FlashMessageService defaults the queue to core.template.flashMessages, Extbase defaults the queue to extbase.flashmessages .$randomPluginQueue.

Support for flash messages in ModuleTemplate has been added to enqueue flash messages automatically in the correct queue identifier.

Impact

Flash messages can be enqueued by the following code:

$this->moduleTemplate->addFlashMessage('I am a message body', 'Title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK, true);