Deprecation: #91814 - AbstractControl::setOnClick
See forge#91814
Description
In favor of allowing Content- HTTP headers, inline JavaScript
invocation via
\TYPO3\
has been marked as deprecated. Existing instructions can be migrated using existing JavaScript
helpers
Global or
Action and their capabilities to provide
similar functionality using
data- attributes.
There might be scenarios that require a custom JavaScript module handling specific use cases that are not covered by mentioned JavaScript helpers.
Impact
Using affected PHP methods (see section below) will trigger PHP
E_ errors.
Affected Installations
All sites using 3rd party extensions that are using following methods directly or in inherited class implementations:
\TYPO3\CMS\ Backend\ Template\ Components\ Abstract Control->set On Click \TYPO3\CMS\ Backend\ Template\ Components\ Abstract Control->get On Click
Migration
Mentioned JavaScript helpers cover most common use cases by using
data-
attributes instead of
onclick event attributes with corresponding HTML
elements.
- consider replacing simple
<a ... onclick="window.with plain HTML links likelocation. href= [URI]" <a href="[URI]"> - replacing
Backend, see documentation & examplesUtility:: view On Click - using
data-attributes forGlobalandEvent Handler Action, see documentation & examplesDispatcher
Example #1: open a new window/tab
- taken from extension
dce - see corresponding pull-request
$button->setOnClick(
'window.open(\'' . $this->getDceEditLink($contentUid) . '\', \'editDcePopup\', ' .
'\'height=768,width=1024,status=0,menubar=0,scrollbars=1\')'
);
Code block above being substituted with
Action capabilities,
using
data- and
data- HTML attributes:
$button->setDataAttributes([
'dispatch-action' => 'TYPO3.WindowManager.localOpen',
// JSON encoded representation of JavaScript function arguments
// (HTML attributes are encoded in \TYPO3\CMS\Backend\Template\Components\Buttons\LinkButton)
'dispatch-args' => GeneralUtility::jsonEncodeForHtmlAttribute([
$this->getDceEditLink($contentUid),
'editDcePopup',
'height=768,width=1024,status=0,menubar=0,scrollbars=1',
], false)
]);
Example #2: preview page in frontend
- taken from extension
wizard_crpagetree - see corresponding pull-request
$viewButton = $buttonBar->makeLinkButton()
// @deprecated setOnClick
->setOnClick(BackendUtility::viewOnClick($pageUid, '', BackendUtility::BEgetRootLine($pageUid)))
->setTitle($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage'))
->setIcon($iconFactory->getIcon('actions-view-page', Icon::SIZE_SMALL))
->setHref('#');
Code block above being substituted with
\TYPO3\
based on
Action capabilities, using
data- and
data- HTML attributes:
$previewDataAttributes = PreviewUriBuilder::create($pageUid)
->withRootLine(BackendUtility::BEgetRootLine($pageUid))
->buildDispatcherDataAttributes();
$viewButton = $buttonBar->makeLinkButton()
// substituted with HTML data attributes
->setDataAttributes($previewDataAttributes ?? [])
->setTitle($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage'))
->setIcon($iconFactory->getIcon('actions-view-page', Icon::SIZE_SMALL))
->setHref('#');
Example #3: confirmation dialog
- taken form extension
news - see corresponding pull-request
- side-note: There was a bug in extension
news, examples below have been adjusted to show how the scenario probably would have been before, usingconfirm()
$pasteTitle = 'Paste from Clipboard';
$confirmMessage = GeneralUtility::quoteJSvalue('Shall we paste the record?');
$viewButton = $buttonBar->makeLinkButton()
->setHref($clipBoard->pasteUrl('', $this->pageUid))
// @deprecated inline JavaScript requesting user confirmation
->setOnClick('return confirm(' . $confirmMessage . ')')
->setTitle($pasteTitle)
->setIcon($this->iconFactory->getIcon('actions-document-paste-into', Icon::SIZE_SMALL));
Code block above being substituted with capabilities of modal dialog handling and functionalities of the Bootstrap framework.
$pasteTitle = 'Paste from Clipboard';
$confirmMessage = 'Shall we paste the record?';
$viewButton = $buttonBar->makeLinkButton()
->setHref($clipBoard->pasteUrl('', $this->pageUid))
// using CSS class to trigger confirmation in modal box
->setClasses('t3js-modal-trigger')
->setDataAttributes([
'title' => $pasteTitle,
'bs-content' => $confirmMessage,
])
->setTitle($pasteTitle)
->setIcon($this->iconFactory->getIcon('actions-document-paste-into', Icon::SIZE_SMALL));