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
(Artikel basiert auf TYPO3 8.7.16 und EXT:solr 8.0.3)