Contentelemente mit typoscript

Warum eigentlich

Viele der Entwickler im TYPO3-Umfeld haben eine tiefe Abneigung gegen typoscript und versuchen diesen Teil von TYPO3 so weit und so gut wie möglich zu umschiffen.

Die Auswüchse die ich in den vergangen 10 Jahren gesehen habe, sind jedoch erschreckend. Anstatt wenige Zeile typoscript zu verwenden, wurden aufwendige Controller programmiert, nur um Funktionen zu re-implemenntieren die durch getText zur Verfügung stehen.

In diesem Artikel möchte ich zeigen wie man eigentlich sehr leicht und schnell mit typoscript und den Boardmitteln von TYPO3 mächtige Elemente implementieren kann.

Neue Contenelemente registrieren

Der Vollständigkeit halber zeige ich auch den klassischen Weg der Registrierung. Da mir das aber zu kompliziert war, habe ich die Extension mst_yaml2tca geschrieben. Die macht das alle viel einfacher.

<?php

declare(strict_types=1);

use TYPO3\CMS\Core\Utility\GeneralUtility;

call_user_func(function ($extKey = 'site_provider') {

  $register = GeneralUtility::makeInstance(\MST\MstYaml2Tca\Tca\Registry::class);
  $register->loadFile($extKey, GeneralUtility::getFileAbsFileName('EXT:' . $extKey . '/Configuration/Yaml/tt_content.yaml'));

});
site_provider/Configuration/TCA/Overrides/tt_content.php
contentElements:
  # group id
  additional_elements:
    # group title
    title: "Additional Elements"
    # list of elements
    elements:
      # element id
      additional_text:
        title: "Additional Text"
        description: "This element is used to add additional text to the page."
        icon: "content-text"
        config:
          showitem:
            -
              title: "LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general"
              fields:
                - "--palette--;;general"
                - "--palette--;;header"
                - "bodytext"
            -
              title: "LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance"
              fields:
                - "--palette--;;frames"
            -
              title: "LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access"
              fields:
                - "--palette--;;hidden"
                - "--palette--;;access"
site_provider/Configuration/Yaml/tt_content.yaml

mst_yaml2tca

<?php

declare(strict_types=1);

use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

call_user_func(function ($extKey = 'site_provider') {

  ExtensionManagementUtility::addTcaSelectItem(
    'tt_content',
    'CType',
    [
      'Additional Text',
      'additional_text',
      'content-text',
      'additional_elements',
    ],
  );

  $GLOBALS['TCA']['tt_content']['types']['additional_text'] = [
    'showitem' => '--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,--palette--;;general,--palette--;;header,bodytext,--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,--palette--;;frames,--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,--palette--;;hidden,--palette--;;access'
  ];
  $GLOBALS['TCA']['tt_content']['ctrl']['typeicon_classes']['additional_text'] = 'content-text';
});
site_provider/Configuration/TCA/Overrides/tt_content.php

Nachdem das Element jetzt im Backend registriert ist, können wir es im mit ein wenig Inhalt füllen und dann im Frontend anzeigen.

Dazu brauchen wir lediglich ein paar Zeilen Typoscript und ein Fluidtemplate.

tt_content.additional_text =< lib.contentElement
tt_content.additional_text {
    layoutRootPaths.20 = EXT:site_provider/Resources/Private/Layouts/
    partialRootPaths.20 = EXT:site_provider/Resources/Private/Partials/
    templateRootPaths.20 = EXT:site_provider/Resources/Private/Templates/
    template = AdditionalText
}
site_provider/Configuration/TypoScript/tt_content.typoscript
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="Main">

    <f:format.html>{data.bodytext}</f:format.html>

</f:section>
</html>
site_provider/Resources/Private/Templates/AdditionalText.html

So, wir sehen, dass wir mittels der Boardmittel von TYPO3 sehr einfach und schnell neue Inhaltselemente erstellen kann.

Im nächsten Artikel werden wir sehen, wie wir mittels typoscript komplexe Probleme lösen können.

Klassisch

site_provider/Configuration/TCA/overrides/tt_content.php

Comments

No Comments

Write comment

* These fields are required