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 forGlobal
andEvent 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));