Kategorien 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

(Artikel basiert auf TYPO3 8.7.16 und EXT:solr 8.0.3)

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

Weiterlesen

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 :-(

Weiterlesen

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?

Weiterlesen

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!

Weiterlesen

Direct Mail und gemischte Protokolle (HTTP und HTTPS)

Wenn Direct Mail plötzlich falsche Inhalte verschickt – aber wir haben nix gemacht…also, eigentlich nix. Vor einigen Tagen wurde für eine TYPO3-Instanz mit mehreren Seitenbäumen und Domains das Protokoll konsequent auf HTTPS umgestellt und eine entsprechende RewriteRule hinterlegt. Alles prima – bis der nächste Newsletter versendet werden sollte: der hatte statt seines Inhaltes die Startseite als Inhalt :-\

In der Erinnerung „Wir haben da doch letztens…“, haben wir die RewriteRule einmal deaktiviert – und siehe da, der Newsletter lief wieder. Was aber läuft mit Umschreibung auf HTTPS schief?

Weiterlesen

TCA erweitern

Das TCA von TYPO3 lässt sich seit Langem via ext_table.php erweitern und/oder manipulieren. Das Ganze funktioniert seit TYPO3 6.2 aber auch strukturierter und obendrein dann auch performanter (weil gecacht). Das erklärt Maddy in ihrem Beitrag „TCA manipulation in TYPO3 6.2″ (englisch) recht schön.

Dennoch wollte es bei mir nicht immer klappen. Im speziellen Fall wollte ich in einem betagteren Projekt mit TYPO3 6.2.29 und tt_news 3.6.0 die News-Artikel um ein paar Felder erweitern. War die Erweiterung des TCA in der ext_tables.php eingetragen, lief alles. Sobald ich sie in Configuration/TCA/Overrides/tt_news.php auslagerte, wurde sie ignoriert.

Lösung

Via Configuration/TCA/Overrides/ lassen sich offenbar nur Tabellen verändern, die auf gleichem Weg (also via Configuration/TCA/) definiert wurden.

 

Quelle

Query debuggen mit Extbase

Eine Abfrage ans Repository bleibt leer? Aber warum? Welcher Parameter in der Abfrage führte zum leeren Ergebnis?

Leider erhält man nicht so rasch die SQL-Query, die hier abgefeuert wurde. Aber mit einem kleinen Eingriff wird man doch schlauer: folgenden Schnipsel vor dem $query->execute(); einfügen:

/** @var Typo3DbQueryParser $queryParser */
$queryParser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser');
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->parseQuery($query));

Update 2017-12-06

In TYPO3 8.x ist durch die Integration von Doctrine der Aufruf etwas anders

$queryParser = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class);
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryToDoctrineQueryBuilder($query)->getSQL());

 

Quellen: