Die Pagination-Widgets von TYPO3 (bzw. Fluid) nehmen einem viel Arbeit ab. Jedoch verzweifelt so mancher, wenn es drum geht, auch Filter-Parameter an Folgeseiten weiterzureichen. Klappen tut’s sowohl im Frontend, wie auch im Backend. Ich erkläre kurz beide Fälle.
WeiterlesenKategoriearchiv: TYPO3
Eigenes Template für FE-Login in TYPO3 v10
Nachdem inzwischen schon öfters in Foren die Frage aufgetaucht ist, warum sich das Template von EXT:felogin nicht ändert trotz entsprechender Konfiguration, schreib ich mal ein bisschen Erklärung.
Funktionieren tut’s nämlich – wenn man’s richtig macht ;-)
TYPO3-Backend unterscheidbar machen
Gibt es von einer TYPO3-Website nicht nur eine Instanz, sondern mehrere (lokal, Development, Staging, Production) kann man sich leicht im Browsertab vertun – oder man färbt einfach das Backend context-abhängig um.
WeiterlesenKategorien in EXT:solr nutzen
Schnell kommt man an den Punkt, an dem man Solr zusammen mit Kategorien bzw. Hierarchien als Facetten nutzen möchte. Die kurze Zusammenfassung meiner ersten Erfahrungen und Lösungswege:
Datenstruktur
Die zu kategorisierenden Datensätze müssen mittels System Kategorien (sys_category) gruppiert werden. Hierfür braucht gar nicht viel im TCA rumhantiert zu werden, da der TYPO3 Core das passende Hilfsmittel (ExtensionManagementUtility::makeCategorizable()) liefert .
Kategorien indizieren
Wie die Kategorie-Zuordnung mit indiziert wird, erklärt Steffen in seinem Blog-Beitrag „EXT:solr – Use categories as hierarchical facets„.
(Inzwischen ist „category“ als Feld in Solr vorhanden, sodass kein dynamisches Feld mehr nötig ist (category_stringM => category))
plugin.tx_solr.index { fieldProcessingInstructions { category = categoryUidToHierarchy } queue.MYTYPE.fields { category = SOLR_RELATION category { localField = categories foreignLabelField = uid multiValue = 1 } } }
Durch den Beitrag stößt man auch auf die Details der Implementierung, v.a. die Field Processors und den konkreten categoryUidToHierarchy (Classes/FieldProcessor/CategoryUidToHierarchy.php). Beim Blick in den Code wird klar, dass er nur mit Systemkategorien arbeitet.
Frontend-Ausgabe
Seit die Solr-Extension auf Fluidtemplates aufbaut, ist die Konfiguration der Facette vereinfacht (Früher war ein HMENU nötig):
plugin.tx_solr { search { faceting { facets { category { label = Category field = category type = hierarchy } } } } }
Damit nutzt Solr automatisch das Hierarchy-Partial, und man bekommt einem Baum aus Kategorie-UIDs und der Anzahl der enthaltenen Datensätze angezeigt.
Und die Kategorie-Titel? Dafür braucht es einen kleinen Kniff mit TypoScript und eine kleine Änderung am Fluid-Template.
Via TypoScript legen wir uns ein cObject bereit, das uns den Titel einer System-Kategorie ausgibt:
lib.tx_solr.sys_category_title = RECORDS lib.tx_solr.sys_category_title { source.current = 1 tables = sys_category dontCheckPid = 1 conf.sys_category = TEXT conf.sys_category.field = title conf.sys_category.htmlSpecialChars = 1 }
Im Hierarchy-Partial ersetzen wir in der Section ‚hierarchyTree‘ das {childNode.label} gegen:
<f:cObject typoscriptObjectPath="lib.tx_solr.sys_category_title">{childNode.label}</f:cObject>
Fertig!
Links
- Steffen Ritter’s blog: EXT:solr – Use categories as hierarchical facets (als PDF-Backup)
- TYPO3 Core APIs – Making a table categorizable
(Artikel basiert auf TYPO3 8.7.16 und EXT:solr 8.0.3)
Caching Framework: automatisch Cache leeren bei Datensatzänderung
Das Caching Framework lässt sich gut verwenden, um aufwändig generierte/abgefragte Daten zur Wiederverwendung schneller parat zu haben. Die prinzipielle Funktionsweise haben wir in „Caching Framework nutzen“ erklärt und findet sich auch in der Doku sowie in zahlreichen anderen Blogs.
Was aber oftmals fehlt: wie aktualisiert man den Cache bzw. invalidert ihn bei Veränderung der Daten?
Häufig hängt der Inhalt des Caches von Datensätzen ab. D.h. der Cache-Inhalt veraltet, wenn sich ein Datensatz verändert. Und damit ist auch der Ansatzpunkt für die Invalidierung klar: der processDatamap_afterDatabaseOperations-Hook im DataHandler. Er wird immer nach Datenbankoperationen („new“ bzw. „update“) aufgerufen und bekommt auch den Taballennamen mit übergeben. Somit ist es recht einfach, die eigenen Datensätze zu erkennen und auf die Veränderung zu reagieren:
EXT:my_extension/Classes/Hooks/DataHandler.php:
<?php
namespace MyVendorName\MyExtension\Hooks;
use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class DataHandler
{
public function processDatamap_afterDatabaseOperations($status, $tableName, $recordId, array $databaseData, \TYPO3\CMS\Core\DataHandling\DataHandler $dataHandler)
{
if ($tableName === 'tx_myextension_domain_model_example') {
$cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('myCache');
$cache->flushByTag('tag_123');
}
}
}
Dann noch am Hook registrieren, und fertig:
EXT:my_extension/ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['myextension_clearcfcache'] = 'MyVendorName\\MyExtension\\Hooks\\DataHandler';
Links
URL mit Realurl und Extbase möglichst kurz machen
Kurze URLs schauen schön aus, lassen sich gut verbreiten (auch in Printprodukten) und sind wohla uch SEO-mäßig besser. Leider bringt Extbase erst einmal viele Parameter in der URL mit, und je nach Seitenbaum bringen auch die Ebenen viele URL-Anteile mit.
Mit etwas Trickserei bekommt man am Ende am doch schöne kurze URLs:
Bei einem Kunden in der Restaurantbranche ist es immens wichtig (sagt der SEO-Consultant), dass die URL möglichst kurz ausfällt. Im Prinzip wird eine URL gewünscht, die in etwa so aussieht:
example.com/objekte/objekt-in-rot.html
Dummerweise handelt es sich bei uns um eine Detailansicht innerhalb einer Extbase-Extension. Im schlimmsten Fall sieht die URL also so aus:
example.com/seite/objekte/action/show/controll/Object/object/objekt-in-rot.html
Mit ein bisschen Recherche, ein wenig Ausdauer und ein paar guten Hinweisen dank t3seo.de und verkon.de sind wir zum Ziel gekommen.
Übrigens auch eine gute Möglichkeit, Teile aus einem Realurl-Generierten-Pfad zu entfernen: t3node.com
Mega-Menü mit Cache optimieren
Ein Megamenü zeigt schnell alle Navigationspunkte – aber ist ein Schmerz beim ersten Rendern einer Seite. Dank CachingFramework lässt sich das optimieren.
Für ein solches Menü ist es nötig, dass für alle Teilseitenbäume die Äste ausgelesen werden (TypoScript: expAll) und noch unsichtbar in HTML eingebettet werden. Bei größeren Websites quält man da schnell mal den Datenbankserver, und die Performance lässt nach. Menüs werden pro Seite generiert, und erst dann mittels Seitencache zwischengespeichert. Für große Menüs heißt dies aber, dass auch die „anderen“, inaktiven Äste jedes Mal neu generiert werden :-(
Dynamic Content Elements (DCE) mit statischen Dateien
DCEs sind oftmals hilfreich, um schnell Contentelemente zu erstellen. Schön wäre es aber dennoch, wenn Datenstruktur und Templates mit versioniert werden könnten. Ansätze hierzu gab es wohl in Version 1.3, in Version 1.4 findet sich hierzu leider nichts mehr.
Henrik hatte 2015 hierfür auch einmal nach einer Lösung gesucht (und experimentell auch gefunden):
TYPO3 Dynamic Content Elements (DCE) mit statischen Dateien
(als PDF-Backup)
Template-Pfade via Flexform setzen
Früher war alles so einfach… Für Plugins konnte einfach in einem Flexform-Feld eine Template-Datei angegeben werden, und schwupps war die via TypoScript gesetzte Datei für dieses eine Content-Element überschrieben. Das wohl bekannteste Beispiel hierfür ist die Extension News (tt_news).
Die Zeiten haben sich geändert. Mit Extbase/Fluid ist Vieles flexibler und einfacher geworden: wir können Dank Partials HTML-Schnipsel wiederverwenden, können Dank der Overrides Kaskaden für Template-Pfade in TypoScript festlegen – aber wie kann gelöst werden, dass ein einzelnes Content-Element ein anderes Template bekommen soll?
Solr in TYPO3: alte Datensätze ausschließen
Ziel: alte Datensätze aus den Trefferlisten verbannen. Wen interessieren uralte News oder Schulungstermine, die bereits vorbei sind? Solr berücksichtigt in der Score-Berechnung zwar das Alter, aber dennoch war die Ergebnisliste mit zu vielen veralteten Treffern überfrachtet.
Lösungsansatz
Relativ einfach lässt sich die Index-Queue der TYPO3-Solr-Extension konfigurieren. Über die additionalWhereClause einfach eine Bedingung setzten, dass das Erstellungsdatum von News-Meldungen innerhalb der letzten 1,5 Jahre liegen muss:
plugin.tx_solr.index.queue { pressAnnouncements { table = tt_news additionalWhereClause = tstamp > UNIX_TIMESTAMP(date_sub(now(), interval 18 month)) } }
Prima, wir sind fertig – dachte ich auch. Bald zeigte sich nämlich, dass die Bedingung irgendwie nicht zum gewünschten Ergebnis führte, sondern uralte Meldungen weiterhin gefunden wurden.
So funktioniert das nicht!