Beiträge der Kategorie TYPO3 v10

Modul Template für Redakteure freigeben

Für ein Projekt, das ich übernommen habe, brauchen die Redakteure der Seite Zugriff auf TypoScript. Ich hätte es definitiv anders implementiert (Datensätze, Modul, etc.), mein Vorgänger hatte aber den Weg gewählt. Wenn also ein Benutzer Anpassungen am TypoScript vornehmen wollte, brauche er zwangsweise die Admin-Rechte. Seit TYPO3 10 gibt es noch die Abgrenzung zum System Maintainer, aber sobald ein Benutzer Admin-Rechte besitzt, können Sie nicht weiter eingeschränkt werden. „Mit großer Macht kommt große Verantwortung“ (Onkel Ben aus Spiderman) und ich traue den Redakteure nicht über den Weg mit Admin-Rechten. Also habe ich nach der Möglichkeit gesucht, das Modul und die Tabellen für die Redakteure freizugeben, damit sie wieder normale Redakteure sein können.

In TYPO3 11 hat das folgende gut funktioniert. Wahrscheinlich auch unter TYPO3 10.

1. Zugriffsrechte für Modul anpassen in my_extension/ext_tables.php
$GLOBALS['TBE_MODULES']['_configuration']['web_ts']['access'] = 'user,group';

2. Tabellen für Benutzer freigeben (dann tauchen sie in der Liste der erlaubten Tabellen auf) in my_extension/Configuration/TCA/Overrides/sys_template.php
$GLOBALS['TCA']['sys_template']['ctrl']['adminOnly'] = 0;

3. Benutzergruppe oder Benutzer bearbeiten und dort das Modul „Template“ und die Tabelle „sys_template“ erlauben.

In TYPO3 12 hat sich die Registrierung der Module geändert. Abgesehen davon gibt es nun mehrere Template-Module. Es ist natürlich auch ein Vorteil, denn die Redakteure brauchen sie ja nicht alle.

1. Event-Handler für die Modul-Konfiguration registrieren
Backend Module configuration

2. Event Listener implementieren

namespace Vendor\MyExtension\Backend\EventListener;
 
use TYPO3\CMS\Backend\Module\BeforeModuleCreationEvent;
 
final class ModuleEventListener
{
    public function __invoke(BeforeModuleCreationEvent $event): void
    {
        // Change module icon of page module
        $modules = ['web_ts', 'web_typoscript_recordsoverview', 'web_typoscript_infomodify'];
        if (in_array($event->getIdentifier(), $modules)) {
            $event->setConfigurationValue('access', 'user');
        }
    }
}

Es reicht an dieser Stelle nicht, nur web_ts aufzulisten. Die verfügbaren Module sind die Keys in vendor/typo3/cms-tstemplate/Configuration/Backend/Modules.php

3. Benutzergruppe oder Benutzer bearbeiten und dort die Module „Template“, gewünschte Submodule und die Tabelle „sys_template“ erlauben.

E-Mail Versand defekt nach Plesk Update

Nach einem Plesk Update bei einem meiner Kunden funktionierte auf einmal der Mailversand nicht mehr. Selbst das Senden einer Test-E-Mail aus dem Backend lieferte folgende Fehlermeldung:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: #451: Expected response code "250/251/252" but got code "451", with message "451 qmail-spp failure: plugins/chkrcptto: can't execute (#4.3.0)". | Symfony\Component\Mailer\Exception\TransportException thrown in file [...]vendor/symfony/mailer/Transport/Smtp/SmtpTransport.php

Man kann den Fehler lösen, wenn man den sendmail-Befehlt in den Settings explzit angibt, z.B. /usr/sbin/sendmail -t

Wenn unter $GLOBALS['MAIL']['transport_sendmail_command'] nicht angegeben ist, dann wird als Fallback /usr/sbin/sendmail -bs verwendet. Die Option -bs bedeutet folgendes: „Stand-alone SMTP server mode. Read SMTP commands from standard input, and write responses to standard output. In stand-alone SMTP server mode, mail relaying and other access controls are disabled by default. To enable them, run the process as the mail_owner user.“ (Quelle)

TYPO3 Vhs Sprachnavigation Standardsprache fehlt

Ich selbst nutze die Extension Vhs sehr selten, betreue gelegentlich Projekte, die es einsetzen und komme daher nicht drumrum, mich damit zu beschäftigen.

Folgendes Setup: eine Seite mit drei Sprachen – Deutsch [0], Englisch [1] und Polnisch [2]. Die Zahl in Klammern ist die ID der Sprache im System. Wenn ich in Deutsch bin, dann möchte ich zur Auswahl Englisch und Polnisch, auf der englischen Seite Deutsch und Polnisch und auf der polnischen eben Deutsch und Englisch.

So kann man in Flux die Sprachnavigation einsetzen:

<v:page.languageMenu layout="name" />

Wenn man die Auswahl der Sprachen einschränken möchte, dann kann man einen weiteren Parameter mitgeben und darin eine kommaseparierte Liste mit Sprachen.

<v:page.languageMenu layout="name" languages="0,1,2" />

Meiner Logik nach sollte die Sprachauswahl bleiben, wie sie ist. Stattdessen verschwindet die Standardsprache aus der Navigation. Warum das?
In vhs/Classes/ViewHelpers/Page/LanguageMenuViewHelper.php Zeile 292ff.

$limitLanguages = static::arrayFromArrayOrTraversableOrCSVStatic($this->arguments['languages'] ?? []);
$limitLanguages = array_filter($limitLanguages);

Da wird der Wert aus dem Argument mit array_filter verarbeitet. Wird array_filter kein Callback übergeben, dann entfernt es alle leeren Elemente aus dem Array gem. der Definition von empty. Und empty sieht 0 auch als leer an. Damit wird aus der Liste 0,1,2 die 0 entfernt.

Und dann ist da ja noch das Problem mit dem ausblenden der aktiven Sprache. Da wäre ein Parameter sinnvoll gewesen. Die Lösung, um immer die nicht aktiven Sprachen anzuzeigen ist somit ein manuelles Rendering der Sprachnavigation, ohne die Sprachliste einzuschränken, ist somit diese:

<v:page.languageMenu as="languageMenu" flagImageType="png" layout="name">
    <ul>
        <f:for each="{languageMenu}" as="language">
            <f:if condition="{language.current} != 1">
                <li>
                    <a href="{language.url}">{language.label}</a>
                </li>
            </f:if>
        </f:for>
    </ul>
</v:page.languageMenu>

Tags: , ,

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für TYPO3 Vhs Sprachnavigation Standardsprache fehlt

Linkhandler mit Links zu Sections

Dieser Fall ist etwas speziell, aber vielleicht hilft es jemandem ja weiter. In einem Ordner liegen Datensätze vom Typ FAQ Einträge. Diese können in einem Plugin ausgewählt werden. Nun hatte die Kunden den Wunsch geäußert, aus dem Text in einem FAQ-Element auf ein anderes zu verlinkten. Ich habe den Linkhandler so konfiguriert, dass man aus einem Text mit dem Linkhandler ein FAQ-Elemeent referenzieren kann.

TCEMAIN {
    linkHandler {
        tx_faq {
            handler = TYPO3\CMS\Recordlist\LinkHandler\RecordLinkHandler
            label = FAQ
            configuration {
                table = tx_faq_domain_model_faq
                pageTreeMountPoints = 3870
            }
            scanAfter = page
        }
    }
}

In der Ausgabe gehe ich davon aus, dass das FAQ Element auf der gleichen Seite eingesetzt ist. Ich brauche damit nur einen Link mit Section zu generieren:

  1. config.recordLinks.tx_faq {
  2.     forceLink = 0
  3.     typolink {
  4.         #parameter = current
  5.         parameter.data = TSFE:id
  6.         section.data = field:uid
  7.         section.wrap = faq_|
  8.         useCacheHash = 1
  9.     }
  10. }

In Zeile 4 oder 5 bin ich mir sicher, ob es etwas bewirkt. Lasse ich die Angabe parameter komplett weg, wird kein Link generiert. Daher ist diese Stelle „geraten“. Wenn jemand die richtige Konfiguration kennt, dann gerne her damit.

Generiert wird der Link dann wie folgt: <a href="#faq_140">Typoblindtext</a>

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für Linkhandler mit Links zu Sections

Anzahl Elemente in einer Spalte per TypoScript

In einem Projekt wurden die Elemente in der Header-Spalte immer als Slideshow ausgegeben – auch wenn nur ein Element in dieser Spalte sichtbar war. Ich habe nach einer Möglichkeit gesucht, im Template abzufragen, wie viele Elemente dargestellt werden müssen und dann statt Slideshow einfach nur das Bild auszugeben. Mit diesem TypoScript wird die Anzahl der Elemente korrekt ermittelt und kann dann an das Fluid Template übergeben werden. Es funktionert sogar mit Workspaces.

countHeaderElements = CONTENT
countHeaderElements {
    table = tt_content
    select {
        selectFields = count(uid) AS count
        pidInList = this
        where = {#colPos}=1
        andWhere = (deleted = 0 AND hidden = 0)
    }
 
    renderObj = COA
    renderObj {
        10 = TEXT
        10 {
            data = field:count
        }
    }
}

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für Anzahl Elemente in einer Spalte per TypoScript

TCA für Typen überschreiben

Trotz der vielen Anleitungen, ist es jedesmal ein Try and Error das TCA für einen bestimmten Typ zu überschreiben. In diesem Fall sollte für das Element ‚video‘ die Auswahl der Dateitypen eingeschränkt werden.

Um ein Feld für alle Typen zu überschreiben, packt man folgenden Block in my_ext/Configuration/TCA/Overrides/tt_content.php

$GLOBALS['TCA']['tt_content']['columns']['header']['label'] = 'Foobar';

Was überschrieben werden kann, findet man im Backend über das Modul Configuration raus, in dem man sich das TCA anzeigen lässt.

Will man nun etwas für einen bestimmten Typen überschreiben, dann setzt man statt ['columns'] folgendes ein: ['types']['video']['columnsOverrides'].

$GLOBALS['TCA']['tt_content']['types']['introtext']['columnsOverrides']['header']['label'] = 'Foobar';

Bei den Felden mit Kindelementen wird es etwas komplizierter – das ist für alle Typen:

$GLOBALS['TCA']['tt_content']['columns']['assets']['config']['overrideChildTca']['columns']['uid_local']['config']['appearance']['elementBrowserAllowed'] = 'youtube,vimeo';
$GLOBALS['TCA']['tt_content']['columns']['assets']['config']['filter'][0]['parameters']['allowedFileExtensions'] = 'youtube,vimeo';

Nach dem gleichen Prinzip wie beim Header kann diese Konfiguration nur für einen bestimmten Inhaltstyp vorgenommen werden:

$GLOBALS['TCA']['tt_content']['types']['video']['columnsOverrides']['assets']['config']['filter'][0]['parameters']['allowedFileExtensions'] = 'youtube,vimeo';
$GLOBALS['TCA']['tt_content']['types']['video']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['uid_local']['config']['appearance']['elementBrowserAllowed'] = 'youtube,vimeo';

Tags:

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für TCA für Typen überschreiben

Event Listener mit Dependancy Injection

Um die News-Ausgabe mit weiteren Daten anzureichern, stellt News Events bereit, auf die reagiert werden kann. Das Event wird dabei in Configuration/Services.yaml registiert. In meinem Fall brauche ich in dem EventListener den Zugriff auf ein Repository. ObjectManager->get gilt seit TYPO3 10 als veraltet, injectXXX-Funktionen werden nicht ausgeführt. Was nun? Ein Fall für Dependancy Injection!

Der Basis Event-Listener sieht so aus und wird (in meinem Fall) in Classes/Event abgelegt:

<?php
use GeorgRinger\News\Event\NewsDateMenuActionEvent;
class EventListener
{
    /**
     * @var \MyNamespace\MyExtension\Domain\Repository\FooRepository
     */
    protected $fooRepository;
 
    /**
     * @param \MyNamespace\MyExtension\Domain\Repository\FooRepository $fooRepository
     */
    public function __construct(\MyNamespace\MyExtension\Domain\Repository\FooRepository $fooRepository)
    {
        $this->fooRepository = $fooRepository;
    }
 
    public function enrichWithAdditionalData(NewsDateMenuActionEvent $event): void
    {
 
    }
}

In Configuration/Services.yaml wird der Event-Listener registriert. Gleichzeitig wird definiert, welchen Typ die Variable $fooRepository beim Erstellen des Listeners haben muss. Wichtig sind dabei die letzten zwei Zeilen: dabei wird die Klasse FooRepository als public definiert, damit sie per Depencancy Injection in einem Listener instanziiert werden kann.

services:
  _defaults:
    autowire: true
    autoconfigure: true

  MyNamespace\MyExtension\Event\EventListener:
    arguments:
      $fooRepository: '@MyNamespace\MyExtension\Domain\Repository\FooRepository'
    tags:
      - name: event.listener
        identifier: 'news-event-listener'
        method: 'enrichWithAdditionalData'
        event: GeorgRinger\News\Event\NewsDateMenuActionEvent

  MyNamespace\MyExtension\Domain\Repository\FooRepository:
    public: true

Doku hier: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/DependencyInjection/Index.html

Mask – IRRE Inhaltselemente ausgeben

Beim Erstellen von Mask Inhaltslementen kann man als Typ „Inhalte“ wählen. In der Anleitung fehlt die Angabe, wie man diese Inhaltselemente im Frontend ausgegeben bekommt. Dabei ist es so einfach:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      xmlns:mask="http://typo3.org/ns/MASK/Mask/ViewHelpers"
      data-namespace-typo3-fluid="true">
 
<f:if condition="{data.tx_mask_irre_contents}">
    <f:for each="{data.tx_mask_irre_contents}" as="content">
        <mask:content uid="{content.uid}" />
    </f:for>
</f:if>

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für Mask – IRRE Inhaltselemente ausgeben

TYPO3 Extension Settings im Scheduler Task auslesen

Ich brauche die Settings eines Plugins im Scheduler. Es gibt zwar zahlreiche Snippets und Hinweise, wie es gehen soll, die alle nicht funktioniert haben. Dieses Snippet ist getestet unter TYPO3 10.

Da man sich im Backend befindet, müssen die Settings von plugin nach module kopiert werden:

module.tx_myextension < plugin.tx_myextension

Meine Extension heißt beispielhaft my_extension und ich habe im TypoScript die Konfiguration für alle Plugins gesetzt.

Im Scheduler-Task kann man auf die Settings dann wie folgt zugreifen. Zu beachten dabei die Schreibweise des Extensionnames, es ist CamelCase.

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
 
$configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
$configuration = $configurationManager->getConfiguration(
    ConfigurationManager::CONFIGURATION_TYPE_SETTINGS,
    'MyExtension'
);

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für TYPO3 Extension Settings im Scheduler Task auslesen

TCA für Image Manipulation (crop) in eigener Extension

Es gibt ein paar Beispiele im Netz, wie man Bild-Manipuation für tt_content aktiviert und Crop-Varianten (cropVariants) definiert. Ich habe kein Beispiel gefunden, wie man in seiner eigenen Extension direkt einem Bild-Feld Crop-Eigenschaften mitgeben kann. Nach langer Suche und viel rumprobieren ist das mein Ergebnis, das funktioniert.

'stage_image' => [
    'exclude' => true,
    'label' => 'LABEL',
    'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
        'stage_image',
        [
            'appearance' => [
                'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference'
            ],
            'overrideChildTca' => [
                'types' => [
                    '0' => [
                        'showitem' => '
                        --palette--;;imageoverlayPalette,
                        --palette--;;filePalette'
                    ],
                    \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [
                        'showitem' => '
                        --palette--;;imageoverlayPalette,
                        --palette--;;filePalette'
                    ],
                ],
                'columns' => [
                    'crop' => [
                        'config' => [
                            'cropVariants' => [
                                'default' => [
                                    'title' => 'Desktop',
                                    'allowedAspectRatios' => [
                                        'default' => [
                                            'title' => 'Rechteckig 22:9',
                                            'value' => 2.4
                                        ],
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
            'foreign_match_fields' => [
                'fieldname' => 'stage_image',
                'tablenames' => 'xxx',
                'table_local' => 'sys_file',
            ],
            'maxitems' => 1,
        ],
        $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
    ),
],

Geschrieben in TYPO3, TYPO3 v10 | Kommentare deaktiviert für TCA für Image Manipulation (crop) in eigener Extension