Aus dem Stehgreif weiß ich so was natürlich nicht. In der offiziellen Doku ist eine Anleitung am Beispiel von og:image beschrieben, hier ist der Schnipsel für og:title.
page=PAGEpage{
meta {
og:title.stdWrap.cObject =TEXT
og:title.stdWrap.cObject {if.isFals.field = og_title
field= title
}}}
Nach einem Update auf TYPO3 11 und PHP 8.1 hatte ich im Backend folgende Warnung:
Core: Error handler (BE): PHP Warning: Undefined array key type in /var/www/html/vendor/symfony/expression-language/Node/GetAttrNode.php line 97
Ich hatte schon die Vermutung, dass es mit TypoScript-Conditions zu tun hat. Dieser Blog-Artikel auf typo3-probleme.de hat mich auf die richtige Anpassung gebracht.
So muss die Condition angepasst werden, damit es keine Warnung mehr gibt:
Für einen Kunden habe ich Module entwickelt, in denen die dargestellten Daten als CSV exportiert werden könnne. Ursprünglich für TYPO3 8 entwickelt, wurden die Module in den letzten Jahren mehrfach aktualisiert, im Moment für TYPO3 11.
Ein Export in einem Backend-Modul kann wie folgt implementiert werden:
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.
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.
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:
Ok, wahrscheinlich ist der Titel „ddev Tipps“ etwas zu hoch gegriffen. Seit einiger Zeit nutze ich ddev (auf Windows mit WSL2) als lokale Entwicklungsumgebung. Meine Anfängliche Skepsis verschwand schnell und nun möchte ich es nicht mehr missen. Ich kann innerhalb von wenigen Minuten jede bestehende Website lokal installieren, wenn man mir Git-Zugangsdaten, einen Datenbank-Dump und fileadmin-Inhalte gibt. Wobei das letztere nicht unbedingt benötigt wird, filefill hilft zur Not auch. PHP Version Umstellen, TYPO3 Updates – alles kein Problem.
Mit ddev launch kann man ja das Frontend der Seite aufrufen. Meistens brauche ich direkt das Backend – und das geht mit ddev launch /typo3.
Da ich phpMyAdmin nicht besonders mag und stattdessen HeidiSQL nutze, um auf die Datenbank zuzugreifen, brauche ich den dba-Container nicht, da er unnötig Speicherplatz verbraucht. Man kann in der .ddev/config.yaml in omit_containers in jedem Projekt angeben, dass dieser Container ausgelassen werden soll. Da ich diesen Container nie brauche, kann man man das auch global in ~/.ddev/global_config.yaml konfigurieren.
omit_containers: [dba]
Noch so ein kleiner Tipp: Wenn man mal Mist gebaut hat und die Projektnamen durcheinander gebracht hat, dann finden sich alle ddev-Projekte in dieser Datei ~/.ddev/global_config.yaml. Da kann man dann ein Projekt einfach löschen, falls nötig.
Wie oben beschrieben, greife ich mit HeidiSQL auf meine ddev Datenbanken zu. Dazu definiere ich in ddev einen festen DB Port (host_db_port: "22156"), lege die Verbindung in Heidi einmal an und kann sie immer wieder einfach starten.
Falls mal nur ein Teil der Datenbank aktualisiert werden soll, dann nicht ddev import-db verwenden. Dabei wird die Datenbank gelöscht und neu geschrieben. Falls man nun einen Teil der Daten bekommen hat, dann das hier verwenden. Das Password ist ‚db‘
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.
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:
config.recordLinks.tx_faq {
forceLink =0
typolink{
#parameter = current
parameter.data = TSFE:id
section.data =field:uid
section.wrap = faq_|
useCacheHash =1
}
}
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>
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_contentselect{
selectFields = count(uid) AS count
pidInList = this
where ={#colPos}=1
andWhere =(deleted =0 AND hidden =0)}
renderObj =COA
renderObj {10=TEXT10{
data =field:count
}}}
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
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:
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.
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:
Neueste Kommentare