Реализация общего предварительного просмотра нижнего колонтитула Renderer в TYPO3 >= v12

Мы использовали хук tt_content_drawFooter, чтобы добавить дополнительную информацию в представление макета страницы в Backend для некоторых элементов контента.

Некоторая информация будет отображаться всегда, например, информация об элементе контента 18n_parent. Некоторая информация относится к элементам контента, таким как текстовые медиа.

Теперь при обновлении до v12 хук пропадает. Существуют некоторые события замены (но не для нижнего колонтитула), и можно переопределить предварительный просмотр Renderer, например. для всех типов или для определенных типов контента.

Реализация выглядит простой, но я столкнулся с проблемой:

  • Я могу использовать PageContentPreviewRenderingEvent->setPreviewContent(), чтобы переопределить содержимое (но не нижний колонтитул).
  • единственный способ установить нижний колонтитул — это установить предварительный просмотр Renderer в TCA, а затем наследовать класс, который был установлен ранее. Но для разных КЭ это будут разные классы

Например, это значение по умолчанию:

общий:

$GLOBALS['TCA']['tt_content']['ctrl']['previewRenderer'] = \TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer::class;

текстовые медиа:

$GLOBALS['TCA']['tt_content']['types'][$ctype]['previewRenderer'] = \TYPO3\CMS\Frontend\Preview\TextmediaPreviewRenderer;

типы содержимого контейнера:

$GLOBALS['TCA']['tt_content']['types'][$ctype]['previewRenderer'] = B13\Container\Backend\Preview\ContainerPreviewRenderer;

новости_pi1:

$GLOBALS['TCA']['tt_content']['types']['news_pi1']['previewRenderer'] = GeorgRinger\News\Hooks\PluginPreviewRenderer;

Поэтому, если я установлю свой PreviewRenderer, это должен быть другой класс, унаследованный от другого PreviewRender для каждого из них, который я хочу переопределить.

Что мне не хватает? Это невозможно или что было бы хорошим решением?

Пример:

Документация

Для контекста, это патч, в котором был удален предыдущий крючок нижнего колонтитула:

Просто вечерняя мысль без глубоких исследований: в частичном ../PageLayout/RecordDefault/Footer.html отображается только item.footerInfo. Тем временем партиал можно легко перезаписать (docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/…‌​). Тогда только {item} нужно будет соответствующим образом обогатить желаемым footerContent...

Julian Hofmann 11.07.2024 20:30

Должно ли решение быть связано с backend_layout/colPos, элементом-контейнером или одним элементом контента? Я думаю, что это может быть важно знать или принять важное решение.

David 12.07.2024 06:34

Дэвид, у меня есть два случая: есть некоторая информация, которая должна отображаться независимо от элемента контента (например, информация о языке). И есть некоторая информация, которая зависит от элемента контента.

Sybille Peters 12.07.2024 07:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы сказал, что у вас есть несколько вариантов:

Вариант 1:
Вы можете XClass StandardContentPreviewRenderer. Но это будет работать только для ctypes, которые напрямую используют StandardContentPreviewRenderer. Тогда вам также потребуется XClass для всех конкретных PreviewRenderers. Так что, возможно, это нехорошее решение.
https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ApiOverview/Xclasses/Index.html

Вариант 2:
Реализуйте собственный PreviewRenderer для всех типов ctypes, которыми вы хотите манипулировать. Затем вы можете использовать черту для реализации своей модификации. Тогда вам все равно понадобится несколько PreviewRenderer, но вы можете реализовать свой собственный код один раз в типаже.
https://www.php.net/manual/de/language.oop5.traits.php
https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/CodingGuidelines/PhpArchitecture/Traits.html

Вариант 3:
Вы можете исправить StandardContentPreviewRenderer для своих версий TYPO3 и либо реализовать свой код непосредственно в патче, либо отправить собственное событие PSR-14.
https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Events/EventDispatcher/Index.html
https://typo3worx.eu/2017/08/patch-typo3-using-composer/

Я думаю, что все три решения имеют некоторые (недостатки) преимущества. Я бы склонялся ко второму варианту, так как считаю его наиболее стабильным решением.

Обновлено:
Я только что протестировал упомянутый выше вариант Джулиана Хофмана. Да, вы можете переопределить часть нижнего колонтитула, но тогда вам потребуется реализовать собственный ViewHelper для управления нижним колонтитулом.
Это сработало бы, но я бы не предпочел. Но это всего лишь личное предпочтение.

Представляю еще один вариант на основе комментария Джулиана Хоффмана:

Это работает для TYPO3 v12 и выше.

  1. Используйте TSconfig, чтобы переопределить частичный Fluid.

    # Pattern: templates."composer-name"."something-unique" = "overriding-extension-composer-name":"entry-path"
    templates.typo3/cms-backend.9999999999 = myvendor/myextension:Resources/Private/Backend/TemplateOverrides/typo3/cms-backend
    
  2. Добавьте файл Fluid в свое расширение:

    Resources/Private/Backend/TemplateOverrides/typo3/cms-backend/Partials/Page-Layout/RecordDefault/Footer.html:

    Оригинал выглядит так:

    <f:if condition = "{item.footerInfo}">
      <div class = "t3-page-ce-footer">
        <div class = "t3-page-ce-info">
          {item.footerInfo -> f:format.raw()}             
        </div>
     </div>
    </f:if>
    

    Мы можем добавить еще:

    <f:if condition = "{item.record.layout}">
      <strong>Layout:</strong>
        <f:translate key = "LLL:EXT:myextension/Resources/Private/Language/locallang_backend.xlf:tt_content.layout.{item.record.layout}">{item.record.layout}</f:translate>
       <br/>
     </f:if>
    

Документация:

Другие вопросы по теме