Skip to content
Snippets Groups Projects
Commit fcddb90b authored by Stefan Bürk's avatar Stefan Bürk Committed by Georg Ringer
Browse files

[DOCS] Add example for `Page Module` PSR-14 events

With #98375 hooks in the `Page Module` has been replaced by
modern PSR-14 events to customize the `Page Module` rendering.

The related PSR-14 events are:

* TYPO3\CMS\Backend\View\Event\IsContentUsedOnPageLayoutEvent
* TYPO3\CMS\Backend\View\Event\ModifyDatabaseQueryForContentEvent
* TYPO3\CMS\Backend\View\Event\PageContentPreviewRenderingEvent

This change adds some basic example how to implement event listener
for these events to the corresponding feature ReST changelog file.

Resolves: #102046
Related: #98375
Releases: main, 12.4
Change-Id: Ie7bdd8f365accc0224c28365da2f54e908520bd2
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/81263


Reviewed-by: default avatarGeorg Ringer <georg.ringer@gmail.com>
Tested-by: default avatarGarvin Hicking <gh@faktor-e.de>
Reviewed-by: default avatarChris Müller <typo3@krue.ml>
Tested-by: default avatarcore-ci <typo3@b13.com>
Reviewed-by: default avatarGarvin Hicking <gh@faktor-e.de>
Tested-by: default avatarChris Müller <typo3@krue.ml>
Tested-by: default avatarGeorg Ringer <georg.ringer@gmail.com>
parent 85c921c7
Branches
Tags
No related merge requests found
......@@ -24,6 +24,157 @@ They are drop-in replacement to the removed hooks:
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][PageLayoutView::class]['modifyQuery']`
* :php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']`
Example for :php:`IsContentUsedOnPageLayoutEvent`
-------------------------------------------------
Registration of the event in your extension's :file:`Services.yaml`:
.. code-block:: yaml
:caption: EXT:my_extension/Configuration/Services.yaml
MyVendor\MyExtension\Listener\ContentUsedOnPage:
tags:
- name: event.listener
identifier: 'my-extension/view/content-used-on-page'
The corresponding event listener class:
.. code-block:: php
:caption: EXT:my_extension/Classes/Listener/ContentUsedOnPage.php
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Listener;
use TYPO3\CMS\Backend\View\Event\IsContentUsedOnPageLayoutEvent;
final class ContentUsedOnPage
{
public function __invoke(IsContentUsedOnPageLayoutEvent $event): void
{
// Get the current record from the event.
$record = $event->getRecord();
// This code will be your domain logic to indicate if content
// should be hidden in the page module.
if ((int)($record['colPos'] ?? 0) === 999
&& !empty($record['tx_myext_content_parent'])
) {
// Flag the current element as not used. Set it to true, if you
// want to flag it as used and hide it from the page module.
$event->setUsed(false);
}
}
}
Example for :php:`ModifyDatabaseQueryForContentEvent`
-----------------------------------------------------
Registration of the event in your extension's :file:`Services.yaml`:
.. code-block:: yaml
:caption: EXT:my_extension/Configuration/Services.yaml
MyVendor\MyExtension\Listener\ModifyDatabaseQueryForContent:
tags:
- name: event.listener
identifier: 'my-extension/view/modify-database-query-for-content'
The corresponding event listener class:
.. code-block:: php
:caption: EXT:my_extension/Classes/Listener/ModifyDatabaseQueryForContent.php
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Listener;
use TYPO3\CMS\Backend\View\Event\ModifyDatabaseQueryForContentEvent;
use TYPO3\CMS\Core\Database\Connection;
final class ModifyDatabaseQueryForContent
{
public function __invoke(ModifyDatabaseQueryForContentEvent $event): void
{
// early return if we do not need to react
if ($event->getTable() !== 'tt_content') {
return;
}
// Retrieve QueryBuilder instance from event
$queryBuilder = $event->getQueryBuilder();
// Add an additional condition to the QueryBuilder for the table
// Note: This is only a example, modify the QueryBuilder instance
// here to your needs.
$queryBuilder = $queryBuilder->andWhere(
$queryBuilder->expr()->neq(
'some_field',
$queryBuilder->createNamedParameter(1, Connection::PARAM_INT)
)
);
// set updated QueryBuilder to event
$event->setQueryBuilder($queryBuilder);
}
}
Example :php:`PageContentPreviewRenderingEvent`
-----------------------------------------------
Registration of the event in your extension's :file:`Services.yaml`:
.. code-block:: yaml
:caption: EXT:my_extension/Configuration/Services.yaml
MyVendor\MyExtension\Listener\PageContentPreviewRendering:
tags:
- name: event.listener
identifier: 'my-extension/view/page-content-preview-rendering'
The corresponding event listener class:
.. code-block:: php
:caption: EXT:my_extension/Classes/Listener/PageContentPreviewRendering.php
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Listener;
use TYPO3\CMS\Backend\View\Event\PageContentPreviewRenderingEvent;
final class PageContentPreviewRendering
{
public function __invoke(PageContentPreviewRenderingEvent): void
{
$tableName = $event->getTable();
$record = $event->getRecord();
// early return if we do not need to react
if ($event->getTable() !== 'tt_content'
|| ((string)($record['CType'] ?? '') !== 'my-content-element'
) {
return;
}
// Create custom preview content
$previewContent = sprintf(
'<div class="alert alert-notice">No preview available for %s:%s</div>',
$event->getTable(),
($event->getRecord()['uid'] ?? 0)
);
// Set (override) preview content with custom content.
$event->setPreviewContent($previewContent);
}
}
Impact
======
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment