25 August 2026

Sicherheits-Backport für Powermail 7.5.x: Version 7.5.2

Für die nicht mehr offiziell unterstützte Powermail-Version 7.5.x steht ein gezielter Sicherheits-Backport bereit. Die inoffizielle Version 7.5.2 schließt die in TYPO3-EXT-SA-2026-022 beschriebene Fluid Server-Side Template Injection (CVE-2026-77136).

Damit können bestehende TYPO3-8.7- und TYPO3-9.5-Installationen kurzfristig abgesichert werden, ohne alle Formulare umbauen oder unmittelbar auf eine neue Powermail-Hauptversion migrieren zu müssen.

Was wurde behoben?

In älteren Powermail-Versionen wurden Mail-Headerwerte pauschal als Fluid interpretiert. Dadurch konnte ein über ein Formular übermittelter Absendername oder eine Absenderadresse unter bestimmten Umständen als Fluid-Code ausgeführt werden.

Der Backport trennt nun konsequent zwischen konfigurierten und vom Besucher übermittelten Werten:

  • Besucherwerte werden nicht mehr als Fluid-Template ausgeführt.
  • Konfigurierte Werte wie Betreff, Empfängername oder Absendername können weiterhin Fluid-Marker verwenden.
  • Der normale Marker sender_name bleibt unverändert nutzbar.

Kompatibilität

Für vorhandene Formulare sind keine Datenbankänderungen erforderlich. Insbesondere müssen sender_name-Felder oder -Marker nicht entfernt werden.

Auch reine Textwerte in TypoScript-Overrides, beispielsweise receiver.overwrite.senderName, funktionieren unverändert weiter.

Eine Ausnahme gilt nur für sehr spezielle Konfigurationen: Fluid-ViewHelper innerhalb eines Overrides, der einen vom Besucher bestimmten Mail-Header ersetzt, werden nicht mehr ausgewertet. Diese Einschränkung ist beabsichtigt und Teil der Sicherheitsmaßnahme.

Installation

  1. Vor dem Update ein Backup der Extension und der TYPO3-Installation erstellen.
  2. Powermail auf die bereitgestellte lokale Version 7.5.2 aktualisieren.
  3. TYPO3-Caches leeren.
  4. Mindestens eine Admin-Mail, eine Senderbestätigung und – falls verwendet – den Double-Opt-in-Prozess testen.

Wichtiger Hinweis

Powermail 7.5.x wird vom Hersteller nicht mehr offiziell gepflegt. Dieser Backport reduziert die unmittelbare Gefahr für Legacy-Installationen, ersetzt aber kein langfristiges Upgrade auf eine unterstützte TYPO3- und Powermail-Version.

Bei Fragen oder Auffälligkeiten nach dem Update bitte die eingesetzten Sonderkonfigurationen und Mail-Workflows prüfen.

11 August 2026

Von v12 direkt auf v14: Warum ein KI-gestützter Port des l10nmgr kein Spaziergang war

„Schmeiß den Code der alten Extension einfach in ChatGPT, die macht das schon fit für TYPO3 v14!“

Diesen Satz hört man aktuell öfter. Und Spoiler vorab: Wer so an ein Upgrade komplexer Extensions herangeht, wird sein System mit Anlauf an die Wand fahren.

Wichtiger Hinweis vorweg: Ich gehöre nicht zum Entwicklerteam des Localization Manager (l10nmgr) und das hier ist kein offizielles Release. Ich habe mir lediglich die öffentlich zugängliche v12 geschnappt und sie für interne Zwecke in Eigenregie auf TYPO3 v14 portiert. Da die v13 nicht öffentlich ist, fehlte jegliche Zwischenstufe – ich musste also zwei Major-Versionen an Breaking Changes auf einmal überbrücken.

Genau bei diesem Doppel-Sprung habe ich die echten Grenzen von KI-Tools erlebt. Hier sind ein paar konkrete Beispiele aus der Praxis, warum blindes KI-Vertrauen beim Refactoring scheitert.


1. Das Trainingsdaten-Problem: KI liebt alte Zöpfe

Ein Sprachmodell weiß nicht, was sich im allerneuesten TYPO3-Core geändert hat – es kennt vor allem das, womit es gefüttert wurde. Und beim Sprung von v12 auf v14 halluziniert die KI mit Vorliebe veraltete Zwischenlösungen zusammen, die im v14-Core sofort einen Fatal Error werfen:

  • Die alte KI-Gewohnheit: Um Übersetzungsdatensätze abzufragen, schlägt die KI gerne gewohnte Helfer wie LocalizationRepository::getRecordTranslation() vor.
  • Die v14-Realität: In v14 läuft das über saubere, TCA-basierte Record-Lookups.
  • Gleiches Spiel bei der Datenbank: Altes Doctrine-Handling muss explizit auf Connection::createSchemaManager() umgebaut werden.

Die KI baut dir fehlerfreien PHP-Code – der auf einem v14-System trotzdem augenblicklich crasht, weil die Methoden im Core gar nicht mehr existieren.


2. Datenkorruption verhindern: Der RTE-CAT-XML-Roundtrip

Der l10nmgr schubst nicht nur ein paar Strings durch die Gegend, sondern exportiert Datenstrukturen in spezielles XML für Übersetzungs-Tools (CAT-Software) und liest sie wieder ein.

Das muss absolut symmetrisch laufen. Bei Rich-Text-Feldern (RTE) in pages und tt_content bedeutet das: Absätze, HTML-Tags und Links müssen nach dem Re-Import exakt an der gleichen Stelle sitzen wie vorher.

  • Wo die KI blind ist: KI schaut auf isolierte Code-Schnipsel. Sie "sieht" nicht den gesamten Datenfluss über Export und Import hinweg. Ändert sie beim Refactoring des XML-Parsers auch nur eine Kleinigkeit, geht der Export zwar durch, aber beim Import zerschießt es leise die Formatierung in der Datenbank.
  • Der FlexForm-Fallstrick: Beim Traversieren von FlexForms über das compiled TcaSchema müssen unvollständige Datensätze sauber auf null-Werte geprüft werden. Die KI vergisst solche Edge Cases gerne – bis im Backend ein Redakteur ein halb ausgefülltes Element übersetzen will und das Modul abbricht.

Solche Fehler findet keine KI per Prompting, sondern nur der Entwickler durch akribisches Debugging mit echten Testdaten.


3. Strikte Security: Das Desaster mit Inline-JavaScript

Ein Klassiker, wenn man die KI bittet, das Backend-Modul auf den neuesten Stand zu bringen: Sie baut schnell ein kleines Inline-Script oder ein onclick="document.forms[0].submit()" ein, damit die Buttons im Modul wieder reagieren.

In TYPO3 v14 knallt das sofort. Dank strenger Content Security Policy (CSP) sperrt der Core Inline-Code rigoros aus.

  • CSP-Konformität: Sämtliche Event-Listener und Formular-Submits mussten sauber aus dem Fluid-Code getrennt und CSP-konform eingebunden werden.
  • UI-Upgrade: Nebenbei musste die Navigation des Moduls auf moderne Bootstrap-5-Tabs umgestellt werden.

Der KI ist eine CSP-Violation völlig egal – in ihrer isolierten Code-Welt funktioniert das Skript ja. Dass der Browser die Ausführung im TYPO3-Backend blockiert, merkt man erst beim manuellen Testen in den Developer Tools.


Mein Fazit für die Praxis

Der l10nmgr läuft bei mir intern für pages und tt_content jetzt stabil unter TYPO3 v14 – aber nicht, weil die KI den Job erledigt hat, sondern weil sie mir die stupide Tipparbeit abgenommen hat, während ich den Code Schritt für Schritt durchleuchtet und korrigiert habe.

Wenn du ein ähnliches internes Portierungsprojekt planst, behandle die KI wie einen sehr schnellen, aber extrem zerstreuten Junior-Entwickler:

  1. Lass dir die reine Fleißarbeit abnehmen.
  2. Hinterfrage jede geänderte API-Zeile.
  3. Teste den Daten-Roundtrip gründlich mit echten Test-Inhalten.

Erst die Kombination aus KI-Geschwindigkeit und deiner eigenen Erfahrung führt zu einem Code, dem du deine Datenbank anvertrauen kannst.

09 August 2026

DIY-Upgrade auf TYPO3 v14: Warum ich den l10nmgr selbst migriert habe – und was das bedeutet

Jeder, der seit ein paar Jahren TYPO3-Projekte betreut, kennt das Problem: Ein neues Major-Release wie TYPO3 v14 steht vor der Tür, der Core macht riesige Sprünge – aber manche etablierte Extension hängt fest.

Ein Paradebeispiel dafür ist der Localization Manager (l10nmgr). Für komplexe, mehrsprachige Instanzen ist das Tool Gold wert. Das Problem: Die frei zugängliche Version im Repository steht bei v12. Version 13 ist nicht öffentlich verfügbar, und eine offizielle v14 gibt es schlicht nicht.

Vor diesem Dilemma stand ich vor kurzem für interne Zwecke. Die Lösung? Ich habe mir die öffentliche v12 geschnappt und sie in akribischer Kleinarbeit – aber mit kräftiger KI-Unterstützung – direkt auf TYPO3 v14 gehoben. Völlig in Eigenregie, ohne Anbindung an die offiziellen Entwickler des l10nmgr und natürlich ohne die geschützten Features einer v13.

Das Ergebnis ist eine funktionierende, interne Lauffähigkeit für pages und tt_content. Doch das Experiment wirft ein paar spannende Fragen auf.


Der Doppel-Sprung: Wo KI echte Hilfe war

Von v12 direkt auf v14 zu springen bedeutet, eine komplette Core-Generation (v13) schlicht zu überspringen. Das heißt doppelt so viele Deprecations, doppelt so viele Breaking Changes und völlig veraltete API-Muster im Quellcode.

Sagen wir, wie es ist: Ohne KI-Unterstützung hätte ich mir diesen Aufwand für ein internes Werkzeug kaum gemacht.

  • Der Zeit-Katalysator: KI-Modelle sind genial darin, alte v12-Code-Muster zu erkennen und Vorschläge zu machen, wie man zwei Major-Versionen an Core-Evolution auf einmal überbrückt.
  • Muster-Mapping im Akkord: Veraltete API-Aufrufe über Dutzende Dateien hinweg aufzuspüren und systematisch umzubauen, ist für eine KI eine reine Fleißaufgabe.
  • Eigenbau statt Sackgasse: Statt darauf zu warten, ob irgendwann ein offizielles Update kommt, kann man sich für den eigenen Workflow selbst helfen.

Die Schattenseite: Die Verantwortung beim "Inoffiziellen Fork"

So genial die Möglichkeit ist, veralteten Code eigenhändig wiederzubeleben – man muss sich der Grenzen und der Verantwortung bewusst sein.

1. Völlige Eigenverantwortung

Wenn man eine Extension auf eigene Faust migriert, gibt es kein Sicherheitsnetz. Keine Community, die Bugfixes liefert, und kein offizielles Team, das man fragen kann.

Mein Grundsatz: Wenn der KI-gestützte Code beim Import Daten korrumpiert oder eine Sicherheitslücke aufreißt, gibt es keinen Maintainer, auf den man zeigen kann. Die Verantwortung liegt zu 100 % bei mir.

2. Der "Schuldenberg auf Pump"

Weil die offizielle v13 nicht öffentlich ist, fehlen meinem internen Port sämtliche Features oder Architektur-Anpassungen, die in dieser Generation entstanden sein könnten. Ich habe sozusagen eine v12 auf v14 "gepatcht". Wenn man hier nicht genau versteht, was die KI im Code geändert hat, baut man sich für zukünftige Updates eine technische Schuldenfalle.

3. Community vs. Eigenbrötelei

Open Source lebt eigentlich vom Teilen. Ein reiner "Private Port" löst zwar das eigene Problem, hilft der Community aber erst einmal nicht direkt weiter. Umso wichtiger ist es, transparent zu kommunizieren: Das hier ist ein Experiment für den eigenen Bedarf, kein offizielles Produkt.


Mein Fazit

Dass der l10nmgr auf Basis der v12 bei mir intern unter TYPO3 v14 wieder läuft, zeigt enorm gut, was heute dank KI möglich ist. Man ist nicht mehr völlig blockiert, wenn Erweiterungen veralten.

Aber KI ist kein Zauberstab. Sie nimmt uns die stupide Anpassungsarbeit ab – die Analyse, das Risiko und die finale Verantwortung für die Datenintegrität bleiben reine Mendersache.

26 August 2021

[UPDATE 2] TYPO3 9.x+ Routing mit tx_jobfair nutzen

Ich weiß ich weiß, eigentlich nutzt man keine veralteten Extensions mehr, die evtl. noch Sicherheitsprobleme haben - in diesem Fall nutze ich die Upload-Funktion überhaupt nicht, daher sollte diese Sicherheitslücke gar kein Problem mehr sein. Zurück zum Thema

Kurzum, wenn Ihr Jobfair mit TYPO3 9 oder 10 nutzen wollt und trotzdem sprechende URLs haben möchtet, braucht ihr folgenden Code in der der Siteconfig (config.yaml). An dieser Stelle möchte ich mich nochmal bei den Mitgliedern der inoffziellen TYPO3-Gruppe auf Facebook herzlich bedanken für die Hilfe! 


  Jobfair:

    type: Extbase

    limitToPages: 

      - 123

    extension: Jobfair

    plugin: Pi1

    routes:

      - 

        routePath: '/{job_title}'

        _controller: 'Job::show'

        _arguments:

          job_title: job

    defaultController: 'Job::show'

    aspects:

      job_title:

        type: PersistedAliasMapper

        tableName: tx_jobfair_domain_model_job

        routeFieldName: job_title slug

UPDATE:

Hey Leute, kurzes Update - wie ihr im Code oben sehen könnt, habe ich bei "routeFieldName:" anstatt job_title nun slug genommen. Das ist viel besser, weil hier aus den Titeln saubere URLs generiert werden. Gerade bei Stellenanzeigen mit Angaben wie z.B. (m/w/d) oder so werden die Slashes nicht mit in die URL übernommen sondern sauber mit "-" umgeschrieben. Dasselbe gilt auch für Umlaute. 

Falls ihr viele Stellenanzeigen habt und die ganzen Slugs nicht per Hand neu generieren wollt (bei einem Upgrade der Website) dann kann ich euch die Extension "Rebuild URL slugs" empfehlen. Damit könnt ihr auf Knopfdruck z.B. von allen News oder allen Jobs die Slugs neu generieren. 

P.S.: Wenn ihr eine angepasste Version von Jobfair für V9 haben wollt, gebt mir einfach Bescheid - aber bitte nicht die Bewerbungsfunktion nutzen! 

UPDATE 2 (2022): 

Jobfair wurde inzwischen offiziell fortgeführt! Vielen Dank an dieser Stelle an "nhovratov"!

Mir ist allerdings bei einer Installation ein neuer Bug aufgefallen: Wenn ihr die Stellenanzeigen in einem Ordner habt, der nicht im Seitenbaum eurer aktuellen Website liegt, werden die Stellenanzeigen auf der Detailseite nicht korrekt angezeigt. Siehe Screenshot, damit ihr wisst, was ich meine:


Es geht hier darum, dass dieselben Stellenanzeigen auf mehreren Seiten eingebunden werden sollen. Das Problem wird hier nochmal ausführlich dargestellt: https://forge.typo3.org/issues/91397. 

Die Lösung bei Jobfair: Ihr müsst folgende TCA anpassen, dann sollte es funktionieren:

$GLOBALS['TCA']['tx_jobfair_domain_model_job']['columns']['slug']['config']['eval'] = 'unique';




29 März 2021

Nextcloud Fehlermeldung: Step 4 is currently in process. Please reload this page later.

Hey Leute, 

wenn ihr mal euer Nextcloud aktualisiert und der Vorgang (aus welchem Grund auch immer) hängt und jeder Update-Prozess mit der Fehlermeldung "Step 4 is currently in process. Please reload this page later." quittiert wird, dann könnt ihr folgendes machen: 

  1. Geht per FTP/Shell/WebFTP etc. zum Unterordner "data". Hier dürfte es einen Unterordner namens "updater-xxxxxxxxxxxx" geben, wobei die "x" eine beliebige Zeichenfolge sein können. 
  2. Löscht diesen Unterordner (könnte eine Weile dauern, weil in dem Unterordner sämtliche Dateien für das jeweilige Update hinterlegt ist)
  3. Started den Updateprozess neu
  4. Et voilà!

03 März 2021

USB-Mikrofon/Audio-Interface mit SwyxIt! 11 benutzen

Jeder, der mal auf die Idee kam im Homeoffice (oder auch im Büro) mit SwyxIt! Version 11 (Windows) ein USB-Mikrofon/Audio-Interface zu nutzen, wird sehr schnell enttäuscht sein - beim Telefonieren hört das Gegenüber nämlich nichts, rein gar nichts, obwohl das Mikrofon korrekt ausgewählt und in den Audioeinstellungen augenscheinlich korrekt kalibriert wurde. 

Anscheinend ist es so, dass - aus welchem Grund auch immer - SwyxIt! die Empfindlichkeit des Mikrofons nicht einstellen (oder speichern) kann. Es ist quasi immer auf 0 eingestellt, egal was man in der App einstellt. 

Hier habe ich die Lösung: 

  • Merkt euch den Namen eures USB-Mikrofons in der SwyxIt!-App. 
  • Öffnet den Registrierungseditor als Administrator
    1. Öffnet hierzu das Windowsmenü, 
    2. tippt "Regedit" ein
    3. Rechtsklick auf "Registrierungs-Editor"
    4. "Als Administrator ausführen"
  • Hangelt euch bis zu diesem Schlüssel: \HKEY_CURRENT_USER\SOFTWARE\Swyx\Client Line Manager\CurrentVersion\Options\S-xxxxxxx\AudioModes\
    • S-xxxxx steht für einen Ordner mit einer sehr langen Zahlenkombination, der bei jedem individuell ist
  • Öffnet dann hier den Unterordner mit dem Namen eures USB-Mikrofons. 
  • Stellt dann bei den Einträgen "HandsetCaptureVolume", "HandsfreeCaptureVolume", "HeadsetCaptureVolume" jeweils den gewünschten Wert von 0-100 (=Mikrofonempfindlichkeit) ein. Wichtig ist, dass ihr die Basis auf  "Dezimal" stellt! 

  • Danach sollte es gehen! Viel Spaß eurem Gegenüber für die deutlich verbesserte Sprachqualität!


13 Dezember 2020

AVM Fritz!Box für Google Stadia optimieren

Hey Leute, 

ich wollte euch zeigen, wie ihr eure Verbindung zu Google Stadia optimieren könnt mit einer Fritz!Box. Diese Anleitung bezieht sich auf das aktuelle Topmodel Fritz!Box 7590, gilt aber auch für die meisten anderen Fritzboxen. 

Google Stadia nutzt bestimmte Ports zur Übertragung des Streams und wir können durch Priorisierung dafür sorgen, dass Stadia deutlich besser läuft.

Geht in den Einstellungen zu "Internet" > "Filter" > "Listen". Dann zu "Netzwerkanwendungen" und "Netzwerkanwendung hinzufügen". Erstellt hier eine Regel mit dem Namen "Stadia" und fügt die Ports 44700-44899 für UDP und TCP hinzu. Speichert dies dann ab. 

Geht anschließend zu "Internet" > "Filter" > "Priorisierung". Dann unter "Priorisierte Anwendungen" und "Neue Regel". 

Wählt hier "Alle Geräte" (damit die Ports generell priorisiert werden, egal ob CCU, Laptop ode Smartphone/Tablet) und dann "Stadia" aus. 

Et Voilà!

Bei mir hat es einen deutlichen Unterschied gemacht. Erst recht wenn mehrere Geräte parallel aufs Internet zugreifen! Viel Spaß!

11 Dezember 2018

AVM Fritz!Box einbruchsicher machen

Heute möchte ich euch über eine oft übersehene, aber effektive Sicherheitsfunktion der Fritz!Box schreiben, nämlich die Möglichkeit zur Nutzung einer Hardwarebestätigung sowie der Einsatz von Zwei-Faktor-Authentisierung. 

Ihr findet beide Einstellungen gruppiert und leicht versteckt unter System > FRITZ!Box-Benutzer > Anmeldung im Heimnetz. Hier setzt ihr einfach ein Häkchen unter "Ausführung bestimmter Einstellungen und Funktionen zusätzlich bestätigen" sowie anschließend "Bestätigung über Google Authenticator App aktivieren". 

Im Anschluss müsst ihr beim Speichern eine Bestätigung über eine Eingabe eines Zahlencodes am Telefon oder über den Kopf an der FRITZ!Box durchführen.

Bereits jetzt musst ihr für bestimmte Änderungen an der FRITZ!Box physischen Zugang haben, um diese durchführen zu können, wie z.B. VPN-Verbindungen.

Ihr könnt ab sofort auch Zwei-Faktor-Authentisierung einsetzen. Geht hierzu in die Benutzereinstellungen und richtet 2FA mit der Google Authenticator App ein. Wenn jemand bestimmte Einstellungen verändern möchte braucht man physischen Zugang zu eurem Handy!

07 November 2018

Speaking URLs mit TYPO3 9.5.x + tx_news

Hallo Leute,

wie ihr wisst, gibt es RealURL bei TYPO3 9.5 nicht mehr. Um für tx_news die sprechenden URLs einzurichten, müsst ihr folgendes tun:

Öffnet diese Datei:

typo3conf/sites/eure-site/config.yaml

Fügt anschließend ganz am Ende der Datei folgende Codezeilen hinzu. Wichtig ist, dass ihr die eingerückten Zeilen/Leerzeichen beachtet! Ich füge daher zusätzlich einen Screenshot bei.

routeEnhancers:
  NewsPlugin:
    type: Extbase
    limitToPages: [8]
    extension: News
    plugin: Pi1
    routes:
      - { routePath: '/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
    defaultController: 'News::detail'
    aspects:
      news_title:
        type: PersistedAliasMapper
        tableName: 'tx_news_domain_model_news'
        routeFieldName: 'path_segment'


Screenshot









  • Bei limitToPages fügt ihr die ID der jeweiligen Detail-Seite ein. 
  • Wenn ihr ein Segment wie /detail/ benötigt, könnt ihr entweder das über die eigentliche Unterseite lösen, die z.B. "Detail" heißt, oder 
  • Alternativ könnt ihr auch in diesem Beispiel in der Zeile 35 routePath: '/detail/{news_title}', schreiben. 
Et Voilà! Zugegebermaßen deckt diese Lösung keine Varianten wie z.B. "Archiv" ab, aber als Baseline-Lösung ist das sicherlich ein guter Ausgangspunkt!

Viel Spaß!

Euer Tao

19 Oktober 2018

fbclid + RealURL (und tx_news)

Hallo Leute,

wie ihr sicherlich mitbekommen habt, fügt Facebook seit einigen Tagen bei ausgehenden Links von Postings ab und zu einen Query String "fbclid" an. Analog zu Google Ads Query String "gclid" steht "fbclid wohl für "Facebook Click Identifier".

"fbclid" hat allerdings für gehörigen Wirbel bei einigen Betreibern von TYPO3-Websites in Kombination mit RealURL (und meistens auch tx_news o.ä.) gesorgt.

Folgende Phänomene tauchten plötzlich auf:

Phänomen 1: Falscher Inhalt wird gecached und demnach ausgeliefert


Wenn man News A aufruft mit einer fbclid ist zunächst alles ok.

.../newsA/?fbclid=xxx

Wenn man schließlich einen weiteren, beliebigen Newseintrag aufruft mit einem beliebigen fbclid-Parameter dranhängt, wird News A angezeigt.

.../newsB/?fbclid=xxx

Es wird immer die ursprüngliche News angezeigt, die als erstes mit fbclid aufgerufen wurde. Das ist natürlich sehr ärgerlich, wenn man einen Newseintrag auf Facebook teilt und dem User wird dann plötzlich ein anderer oder uralter Eintrag dargestellt.

Phänomen 2: Die Seite wird mit "fbclid" erst gar nicht angezeigt -> 404


In Kombination mit der Einstellung 'FE' => 'pageNotFoundOnCHashError' => true wird erst gar keine Seite angezeigt.

Die Lösung:

1. Im Installtool diese beiden Einstellungen setzen:

'FE' => 'pageNotFoundOnCHashError' => false,

'cHashExcludedParameters' => 'L, pk_campaign, pk_kwd, utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, fbclid',

2. Bei RealURL folgende Einstellung setzen 

(achtet auf die Schreibweise, vielleicht habt ihr noch Array):

'cache' => [
'ignoredGetParametersRegExp' => '/^(?:gclid|fbclid|utm_[a-z]+|pk_campaign|pk_kwd|TSFE_ADMIN_PANEL.*)$/',
],

Anschließend sämtliche Caches (auch RealURL) löschen. Damit sollte das Problem vom Tisch sein :-)

06 Juli 2018

WPML und Oshine Theme Page Builder

Nutzt du Wordpress zusammen mit dem Oshine Page Builder und möchtest Übersetzungen/XLIFF mit WPML exportieren? Folgende Konfiguration für die Shortcodes sollten helfen!

<wpml-config>
    <shortcodes>
 
        <shortcode>
            <tag>text</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_sub_title</tag>
        </shortcode>
     
        <shortcode>
            <tag>accordion</tag>
        </shortcode>
     
        <shortcode>
            <tag>chart</tag>
        </shortcode>
     
        <shortcode>
            <tag>animated_numbers</tag>
        </shortcode>
     
        <shortcode>
            <tag>flex_slider</tag>
        </shortcode>
     
        <shortcode>
            <tag>be_slider</tag>
        </shortcode>
     
        <shortcode>
            <tag>blog</tag>
        </shortcode>
     
        <shortcode>
            <tag>bubble_testimonial</tag>
        </shortcode>
     
        <shortcode>
            <tag>button_group</tag>
        </shortcode>
     
        <shortcode>
            <tag>button</tag>
        </shortcode>
     
        <shortcode>
            <tag>call_to_action</tag>
        </shortcode>
     
        <shortcode>
            <tag>contact_form</tag>
        </shortcode>
     
        <shortcode>
            <tag>content_slides</tag>
        </shortcode>
     
        <shortcode>
            <tag>be_countdown</tag>
        </shortcode>
     
        <shortcode>
            <tag>separator</tag>
        </shortcode>
     
        <shortcode>
            <tag>dropcap</tag>
        </shortcode>
     
        <shortcode>
            <tag>dropcap2</tag>
        </shortcode>
     
        <shortcode>
            <tag>linebreak</tag>
        </shortcode>
     
        <shortcode>
            <tag>animate_icons_style1</tag>
        </shortcode>
     
        <shortcode>
            <tag>gallery</tag>
        </shortcode>
     
        <shortcode>
            <tag>gmaps</tag>
        </shortcode>
     
        <shortcode>
            <tag>icon_card</tag>
        </shortcode>
     
        <shortcode>
            <tag>icon_group</tag>
        </shortcode>
     
        <shortcode>
            <tag>grids</tag>
        </shortcode>
     
        <shortcode>
            <tag>icon</tag>
        </shortcode>
     
        <shortcode>
            <tag>justified_gallery</tag>
        </shortcode>
     
        <shortcode>
            <tag>lists</tag>
        </shortcode>
     
        <shortcode>
            <tag>menu_card</tag>
        </shortcode>
     
        <shortcode>
            <tag>newsletter</tag>
        </shortcode>
     
        <shortcode>
            <tag>notifications</tag>
        </shortcode>
     
        <shortcode>
            <tag>shortcode_modules</tag>
        </shortcode>
     
        <shortcode>
            <tag>portfolio</tag>
        </shortcode>
     
        <shortcode>
            <tag>portfolio_carousel</tag>
        </shortcode>
     
        <shortcode>
            <tag>project_details</tag>
        </shortcode>
     
        <shortcode>
            <tag>portfolio_navigation_module</tag>
        </shortcode>
     
        <shortcode>
            <tag>pricing_column</tag>
        </shortcode>
     
        <shortcode>
            <tag>process_style1</tag>
        </shortcode>
     
        <shortcode>
            <tag>recent_posts</tag>
        </shortcode>
     
        <shortcode>
            <tag>services</tag>
        </shortcode>
     
        <shortcode>
            <tag>skills</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_sub_title</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_heading</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_heading2</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_heading3</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_heading4</tag>
        </shortcode>
     
        <shortcode>
            <tag>special_heading5</tag>
        </shortcode>
     
        <shortcode>
            <tag>tabs</tag>
        </shortcode>
     
        <shortcode>
            <tag>team</tag>
        </shortcode>
     
        <shortcode>
            <tag>testimonials</tag>
        </shortcode>
     
        <shortcode>
            <tag>title_icon</tag>
        </shortcode>
     
        <shortcode>
            <tag>tweets</tag>
        </shortcode>
     
        <shortcode>
            <tag>animate_icons_style2</tag>
        </shortcode>
     
        <shortcode>
            <tag>video</tag>
        </shortcode>
     
        <shortcode>
            <tag>clients</tag>
        </shortcode>     
 
    </shortcodes>
</wpml-config>

06 Dezember 2017

Simples Cheat-Sheet für AdWords

Ich habe für mich persönlich mal ein kleines Cheat-Sheet für AdWords erstellt mit den wichtigsten Basics, um entsprechende Kampagnen zu optimieren:

  • Nutze keine automatischen Placements. 
  • Nutze keine weitestgehend passenden Keywords (und wenn doch, dann mindestens mit Modifizierern)
  • Suchbegriffe checken
    • Füge negative Keywords auf wöchentlicher Basis hinzu
    • Füge Suchbegriffe, die Conversions erzeugt haben, als Keyword hinzu. Ggf. gezielt mehr bieten auf besonders gute Keywords
  • Optimiere deine Anzeigentexte (ggf. A/B-Tests)
  • Optimiere deine Landing Pages (ggf. A/B-Tests)
  • Lehn dich zurück und entspanne dich zwischendurch ;-)

27 September 2017

Typo3 7.x+: Typo3-Link-Tags auch in HTML-Content-Elementen von fluid_styled_content

Früher (Typo3 bis 6.x) bzw. mit css_styled_content konnte man auf folgende Weise TypoLinks wie <link 1 - - "Linktitel">Linktext</link> auch in HTML-Elementen parsen:

tt_content.html.parseFunc.tags.link < lib.parseFunc.tags.link

Da man ab Typo3 7.x auch fluid_styled_content nutzen kann (und meiner Meinung nach auch sollte), funktioniert der Typoscript-Codeschnipsel nicht mehr. Um diese Funktionalität wiederherzustellen, müsst ihr folgendes machen (Vielen Dank auch
an Georg Ringer für seinen Input, der mich überhaupt erst darauf gebracht hat).
Zunächst müsst ihr das Template für das HTML-Element von fluid_styled_content (typo3/sysext/fluid_styled_content/Resources/Private/Templates/Html.html) überschreiben. 


Weitere Informationen zum Überschreiben von Standard-Templates findet ihr hier: https://docs.typo3.org/typo3cms/extensions/fluid_styled_content/7.6/Configuration/OverridingFluidTemplates/Index.html


Anschließend könnt ihr den vorhanden Code-Schnipsel ändern:



Vorher: 

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


Nachher:

<f:format.htmlentitiesDecode>
    <f:format.html parseFuncTSPath="lib.parseFunc">
        {data.bodytext}
    </f:format.html>

</f:format.htmlentitiesDecode>


Erläuterung:

f:format.html parseFuncTSPath="lib.parseFunc" sorgt dafür, dass der HTML-Inhalt geparsed wird und die <link>-Tags durch entsprechende HTML-Tags ersetzt werden. 

f:format.htmlentitiesDecode wird im nächsten Schritt die HTML-Entitäten korrekt in sauberen HTML-Code umwandeln, damit diese auch vom Browser korrekt interpretiert werden. 


Et voilà!


-------------

Update am 31.05.2019:

Ab Typo3 8.x funktionieren zwar die <link>-Tags immer noch, aber es wurde ein neues System eingeführt. Siehe Link: https://docs.typo3.org/m/typo3/reference-typoscript/8.7/en-us/Functions/Typolink/Index.html#resource-references


D.h. dass die Verlinkungen nun so aufgebaut sind: 


<a href="t3://page?uid=1" title="startseite"></a> 


anstatt 


<link 1 - - "startseite"></link>



Von Haus aus ist der CKE so eingestellt, dass er diese a-Tags problemlos übernimmt. Wenn ihr weiterhin die klassischen link-Tags nutzen wollt/müsst, dann müsst ihr die Konfiguration vom CKE anpassen, damit dieser auch link-Tags akzeptiert. 
---------
Update am 08.09.2021
Ab TYPO3 8 hat sich glaube ich auch die Syntax verändert, mit der man die Templates überschreibt. Diese müsst ihr anpassen. Hier ein Beispiel (mit Beispielpfaden)

Vorher (TYPO3 7):
lib.fluidContent.partialRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Partials/
lib.fluidContent.templateRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Templates/
lib.fluidContent.layoutRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Layouts/

Nachher (TYPO3 8+, Veränderung fett markiert)
lib.contentElement.partialRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Partials/
lib.contentElement.templateRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Templates/
lib.contentElement.layoutRootPaths.200 = fileadmin/templates/fluid_styled_content/Resources/Private/Layouts/

15 Mai 2015

Typo3 7.x und 1und1: Crontab Scheduler auf PHP 5.5 umstellen

Vor einziger Zeit habe ich einen Artikel geschrieben, wie ihr beim Webhosting von 1und1 in Kombination mit Typo3 6.x den Scheduler richtig einrichtet. Bei Typo3 7.x ist der Einsatz von PHP ab Version 5.5 unbedingt nötig, weswegen ihr etwas umstellen müsst, andernfalls bekommt ihr bei der Ausführung vom Scheduler eine Fehlermeldung wie diese hier:

X-Powered-By: PHP/5.4.39Content-type: text/html
Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /homepages/xx/xxxxxxxxxx/htdocs/xxxxxx/typo3/sysext/core/Classes/Core/Bootstrap.php on line 121

Bisher war der Befehl für den Einsatz der bisherigen dev-Version "php6" gewesen (PHP5.4), so wie in diesem Beispiel: 

0 0 * * * php6 /kunden/homepages/xx/dxxxxxxxxx/htdocs/Unterordner/typo3/cli_dispatch.phpsh schedule

Um aber jetzt PHP 5.5 einzusetzen, müsst ihr anstatt php6 jetzt /usr/bin/php5.5 eingeben. Das sieht dementsprechend nun so aus:

0 0 * * * /usr/bin/php5.5 /kunden/homepages/xx/dxxxxxxxxx/htdocs/Unterordner/typo3/cli_dispatch.phpsh schedule

(in diesem Beispiel wurde der Scheduler so eingestellt, dass er immer Nachts um 0 Uhr gestartet wird)

Jetzt sollte auch der Scheduler von Typo3 7.x bei eurem 1und1 Hostingpaket laufen!

12 Februar 2015

Typo3 6.x und mehrsprachige Bilderelemente: "Localize all records" freischalten

Habt ihr bei Typo3 6.x auch das Problem, dass es bei mehrsprachigen Websites ziemlich kompliziert ist, die Bilder der Zielsprachen im Nachgang anzupassen? 

Bei einem normalen Kopiervorgang in Typo3 6.x von einem Content Element mit Bildern werden alle aktuell vorhandenen Bilder übernommen - soweit so gut. Wenn ihr aber nun in der Originalsprache die Bilder verändert, hinzfügt oder entfernt, müsst ihr theoretisch alle Schritte in jeder Zielsprache per Hand durchführen. Hier gibt es in der Standardkonfiguration keine Möglichkeit, die Übersetzung mit dem Original abzugleichen oder zu synchronisieren, obwohl diese Funktion grundsätzlich vorgesehen ist. Das Löschen und die erneute Kopie von einem Content Element ist langfristig keine wirkliche Lösung. Ich zeige euch, wie man die Lokalisierung und Synchronisierung von Bildern aktiviert. 

Keine Möglichkeit, veränderte Bilder im Nachgang aus dem Original zu "übernehmen"
Keine Möglichkeit, veränderte Bilder im Nachgang aus dem Original zu "übernehmen"


Erstellt im Ordner /typo3conf/ eine Datei mit dem Namen extTables.php, falls noch nicht vorhanden. Fügt in dieser Datei folgende Zeilen hinzu.

<?php

$GLOBALS['TCA']['tt_content']['columns']['image']['config']['appearance']['showPossibleLocalizationRecords'] = TRUE;
$GLOBALS['TCA']['tt_content']['columns']['image']['config']['appearance']['showRemovedLocalizationRecords'] = TRUE;
$GLOBALS['TCA']['tt_content']['columns']['image']['config']['appearance']['showAllLocalizationLink'] = TRUE;
$GLOBALS['TCA']['tt_content']['columns']['image']['config']['appearance']['showSynchronizationLink'] = TRUE;

?>

Achtet bei einer bereits vorhandenen Datei darauf, dass ihr die <?php und ?> Klammern nicht doppelt hinzufügt, hier reichen dann auch die 4 Zeilen aus.

Nun habt ihr auch die zusätzlichen Buttons "Localize all records" und "Synchronize with original language". "Localize all records" bewirkt, dass alle Bilder, die im Original hinterlegt sind und in der Übersetzung nicht vorhanden sind, übernommen werden. "Synchronize with original language" bewirkt, dass auch eine eventuell veränderte Reihenfolge der Bilder im Original auch in der Übersetzung übernommen wird. Beide Buttons erleichtern die Arbeit mit Typo3-Inhalten bei mehrsprachigen Websites ungemein!

"Localize all records" und "Synchronize with original language" sind verfügbar
"Localize all records" und "Synchronize with original language" sind verfügbar


04 November 2014

Typo3-Extension "Quick Google Maps" (cbgooglemaps) anpassen

Ich finde die Extension "Quick Google Maps" (cbgooglemaps) ist ziemlich genial, allerdings gibt es da 2 Dinge, die man nicht direkt über die Einstellungen der Extension beeinflussen kann: Die Reaktion von Google Maps auf das Scrollrad und der Einsatz von eigenen Pushpins, wobei Ersteres die Usability beeinflusst (stört beim scrollen) und letzteres die Optik. 

Leider habe ich nicht herausgefunden, wie man ein eigenes Template bei cbgooglemaps einsetzt, daher habe ich als quick'n'dirty-Anpassung einfach das ursprüngliche Template (/typo3conf/ext/cbgooglemaps/Resources/Private/Templates/Map/Index.html) direkt angepasst.
Öffnet das Template und fügt an den entsprechenden Stellen den Code hinzu  (ist eigentlich ziemlich offensichtlich)

Meine Anpassungen sind die Deaktivierung vom Scrollrad hinter Zeile 22
mapOptions_{contentId}.scrollwheel= false;

und den Einsatz von einer eigenen Pin-Grafik hinter Zeile 29 (ändert die entsprechende URL)
mapCenter_{contentId}.icon = '/fileadmin/images/Pushpin.png';

Hier könnt ihr die Extension mit den Veränderungen live begutachten - eigener Pushpin und kein Scrollwheel: http://www.e-kern.com/de/kontakt/standorte-europa/deutschland/frankfurt.html

(diese Anpassungen basieren auf der Version 2.1.15 für Typo 4.x)

29 Oktober 2014

Typo3 4.5.x: Schwarze Hintergründe bei Bildkonvertierung mit Transparenzen

Habt ihr auch das Problem, dass beim Umwandeln von PNG-, GIF- oder PDF-Dateien zu JPG die transparenten Bildelemente schwarz dargestellt werden? Ich hatte dieses Problem vor allem bei PDF- und GIF-Dateien gehabt. Bisher habe ich das Problem hauptsächlich bei Typo3 4.5.x und niedriger gehabt, bei Typo3 6.2 hingegen gar nicht (für 6.1, 6.0 und 4.7 habe ich nicht getestet).


Öffnet hierzu die Datei /t3lib/class.t3lib_stdgraphic.php und ersetzt folgenden Code

$this->cmds['jpeg'] = '-colorspace ' . $this->colorspace . '

mit diesem Code

$this->cmds['jpeg'] = '-colorspace ' . $this->colorspace . ' -background white -flatten 


Achtet bitte zur Sicherheit auch darauf, dass hinter -flatten auch ein Leerzeichen ist. Wir ihr ablesen könnt, wird bei diesem Befehl für eine Umwandlung in JPG zunächst ein weißer Hintergrund hinzugefügt und anschließend das Bild "flachgelegt", also die Bildebenen zusammengelegt unter Berücksichtigung der vorher festgelegten Hintergrundfarbe.

15 Oktober 2014

Sicherheitslücke in der Extension dmmjobcontrol und Workaround

Update 20.10.2014: Kevin Renskers arbeitet zwar nicht mehr an der Extension und sucht auch jemanden, der die Extension gerne "adoptiert", aber er hat die unten genannten Änderungen übernommen und hochgeladen. Einen Bug gibt es zwar noch, aber auch dieser wird gerade von jemand anderen bearbetet und demnächst hochgeladen: Zwar wird die Sicherheitslücke mit diesen Änderungen gestopft, aber die Suchfunktion ist dann nicht mehr Nutzbar.
----------------------------------

Ein Sicherheitsleck in der Extension dmmjobcontrol wurde auf typo3.org bekannt gegeben: http://typo3.org/teams/security/security-bulletins/typo3-extensions/typo3-ext-sa-2014-012/

Langfristig ist es sicherlich sinnvoller auf eine andere Extension aufzubauen, die auch gewartet wird, z.B. Job Fair, welches optisch fast eine 1:1 Kopie von dmmjobcontrol ist. Leider läuft diese Extension nur auf Typo3 6.x läuft, was den Umstieg etwas komplizierter macht, wenn man noch Typo3 4.5 nutzt. Manche Websites haben sehr viele Einträge in der Extension und eine Übertragung in eine andere Extension wird nicht so schnell funktionieren. Es scheint aber so, als würde Job Fair laut Angaben des Autors fast die gleiche Datenbankstruktur zu haben wie dmmjobcontrol - vielleicht ist es möglich, mit einer Art "Update-Script"

Auf http://seclists.org/fulldisclosure/2014/Sep/89 habe ich ein Workaround gefunden, wie ihr diese beiden Sicherheitslücken vorübergehend stopfen könnt. Dies sollte aber meiner Meinung nach nicht dauerhaft geschehen, sondern sollte solange, bis man es geschafft hat, auf eine andere Extension umzusteigen - wer weiß welche Sicherheitslücken in Zukunft auftauchen.


Öffnet die Datei typo3conf/ext/dmmjobcontrol/pi1/class.tx_dmmjobcontrol_pi1.php

Ersetzt die Zeile 112 mit folgendem Code gegen die XSS-Lücke
$markerArray['###KEYWORD_VALUE###'] = htmlspecialchars($session['search']['keyword'], ENT_QUOTES);

Ersetzt die Zeile 257 mit folgendem Code gegen die SQL-Injection-Lücke:
$whereAdd[] = $table.'.uid_local=tx_dmmjobcontrol_job.uid AND ('.$table.'.uid_foreign='.implode(' OR '.$table.'.uid_foreign=', intval($value)).')';

27 Januar 2014

Extension ve_guestbook mit Typo3 6.2 (Beta 4) kompatibel machen

Bekommt ihr, wenn ihr versucht unter Typo3 6.2 (Beta 4) die Extension "ve_guestbook" zum Laufen zu bringen diese Fehlermeldung?

"Fatal error: require_once(): Failed opening required 'PATH_t3libclass.t3lib_tcemain.php' ...?

Ähnlich wie beim vorherigen Posting zum Thema T3jquery und Typo3 6.2 Beta, wird hier in der Extension eine veraltete Klasse aufgerufen, die es nicht mehr gibt. Hier eine Anleitung, wie ihr das umgehen könnt, bis eine angepasste Version der Extension veröffentlicht wird.

Öffnet dazu die Datei /typo3conf/ext/ve_guestbook/pi1/class.tx_veguestbook_pi1.php (Sicherheitskopie anlegen!) und verändert den Code in Zeile 31 von

require_once (PATH_t3lib . "class.t3lib_tcemain.php");

zu

require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('core') . 'Classes/DataHandling/DataHandler.php';

Fertig! Jetzt sollte die Extension wieder Laufen

---------------------------------
Update vom 23. April 2014:

in der oben genannten Datei müsst ihr auch in Zeile 25 den Code

require_once (PATH_tslib . "class.tslib_pibase.php");

durch diesen Code ersetzen:

require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/Plugin/AbstractPlugin.php';
----------------------------------------

02 November 2013

T3jquery mit Typo3 6.2 kompatibel machen

Bekommt ihr, wenn ihr im Backend das T3jquery-Modul unter Typo3 6.2 (Beta 2) aufruft, die Fehlermeldung

"Fatal error: require_once(): Failed opening required 'PATH_t3libclass.t3lib_scbase.php' ...?

Das liegt daran, dass T3Jquery im Backend die Klasse bzw. die Datei "/t3lib/class.t3lib_scbase.php" aufruft. Diese Klasse ist unter Typo3 6.2 allerdings "deprecated", wurde also in dieser Form entfernt und mit einer neuen Klasse ersetzt. Solange noch kein Patch rausgekommen ist, könnt ihr euch selbst helfen!

Öffnet dazu die Datei /typo3conf/ext/t3jquery/mod1/index.php und verändert den Code in Zeile 33 von

require_once(PATH_t3lib . 'class.t3lib_scbase.php');

zu

require_once(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('backend') . 'Classes/Module/BaseScriptClass.php');

Danach die Datei abspeichern und Voila! Das Backendmodul funktioniert wieder.


----
Update 1

Das gleiche funktioniert natürlich auch  mit anderen Extensions, die das Backend nutzen, wie z.B. dix_urltool.

Hier müsst ihr in der Datei /typo3conf/ext/dix_urltool/mod1/index.php die Zeile 40 auf die gleiche Art und Weise modifizieren wie oben.

----
Update 2

Seit Ende März gibt es auch ein offizielles Update von t3jquery, die mit Typo3 6.2 kompatibel ist!
http://typo3.org/extensions/repository/view/t3jquery