Files
cms-core/Documentation/Changelog/10.4/Feature-90899-IntroduceAssetPreRenderingEvents.rst

130 lines
4.0 KiB
ReStructuredText

.. include:: /Includes.rst.txt
.. _changelog-Feature-90899-IntroduceAssetPreRenderingEvents:
==============================================================
Feature: #90899 - Introduce AssetRenderer pre-rendering events
==============================================================
See :issue:`90899`
Description
===========
AssetRenderer is amended by two events which allow post-processing of
AssetCollector assets.
These new PSR-14 events are introduced:
* :php:`\TYPO3\CMS\Core\Page\Event\BeforeJavaScriptsRenderingEvent`
* :php:`\TYPO3\CMS\Core\Page\Event\BeforeStylesheetsRenderingEvent`
Both stem fom the abstract base class
:php:`\TYPO3\CMS\Core\Page\Event\AbstractBeforeAssetRenderingEvent` and provide
these public methods:
* :php:`getAssetCollector(): AssetCollector`
* :php:`isInline(): bool`
* :php:`isPriority(): bool`
:php:`inline` and :php:`priority` refer to how the asset was registered with
:ref:`AssetCollector <changelog-Feature-90522-IntroduceAssetCollector>`.
The events are fired exactly once for every combination of
:php:`inline`/:php:`priority` before the corresponding section of JS/CSS assets
is rendered by the AssetRenderer.
To make the events easier to use, the :php:`AssetCollector::get*()` methods
have gotten an optional parameter :html:`?bool $priority = null` which when given a
boolean only returns assets of the given priority.
.. note::
post-processing functionality for assets registered via
TypoScript :typoscript:`page.include...` or the :php:`PageRenderer::add*()`
functions are still provided by these hooks:
* :php:`$GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssCompressHandler']`
* :php:`$GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['jsCompressHandler']`
* :php:`$GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssConcatenateHandler']`
* :php:`$GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['jsConcatenateHandler']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_pagerenderer.php']['render-preProcess']`
Assets registered with the AssetCollector (and output through the
AssetRenderer) are not included in those.
Example
=======
As an example let's make sure jQuery is included in a specific version and
from a CDN.
.. rst-class:: bignums
1. Register our listeners
:file:`Configuration/Services.yaml`
.. code-block:: yaml
services:
MyVendor\MyExt\EventListener\AssetRenderer\LibraryVersion:
tags:
- name: event.listener
identifier: 'myExt/LibraryVersion'
event: TYPO3\CMS\Core\Page\Event\BeforeJavaScriptsRenderingEvent
2. Implement Listener to enforce a library version or CDN URI
.. code-block:: php
namespace MyVendor\MyExt\EventListener\AssetRenderer;
use TYPO3\CMS\Core\Page\Event\BeforeJavaScriptsRenderingEvent;
/**
* If a library has been registered, it is made sure that it is loaded
* from the given URI
*/
class LibraryVersion
{
protected $libraries = [
'jquery' => 'https://code.jquery.com/jquery-3.4.1.min.js',
];
public function __invoke(BeforeJavaScriptsRenderingEvent $event): void
{
if ($event->isInline()) {
return;
}
foreach ($this->libraries as $library => $source) {
$asset = $event->getAssetCollector()->getJavaScripts($event->isPriority())
// if it was already registered
if ($asset[$library] ?? false) {
// we set our authoritative version
$event->getAssetCollector()->addJavaScript($library, $source);
}
}
}
}
Impact
======
Existing installations are not affected.
If using the AssetCollector API, these new events should be used for asset
postprocessing.
Related
=======
- :ref:`changelog-Feature-90522-IntroduceAssetCollector`
.. index:: PHP-API, ext:core