Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Beispiel: Einflussnahme auf die URL-Erzeugung (Suchmaschinenoptimierung) / Das Interface PathLookup
Das Interface PathLookup
Package: de.espirit.firstspirit.generate
Im FirstSpirit SiteArchitect können nicht nur benutzerdefinierte URLs bzw. Pfade zu Projektknoten, wie Medien oder Seitenreferenzen definiert werden, sondern auch benutzerdefinierte Pfade zu hierarchisch übergeordneten Elementen, also zu Ordnern der Medien- und der Struktur-Verwaltung. Die Schnittstelle PathLookup kann verwendet werden, um diese Pfade während der Erzeugung der URL eines untergeordneten Objekts zu berücksichtigen.
Wird beispielsweise für einen Ordner in der Struktur-Verwaltung zusätzlich zu dem definierten Anzeigenamen „Startseite“ der Menüname „Willkommen“ vergeben, so soll sich dies auch auf die URLs aller Menübenen und Seitenreferenzen auswirken, die unterhalb dieser Menüebene liegen. Aus
http://domain.de/de/startseite/konferenz2013.html
wird also
http://domain.de/de/willkommen/konferenz2013.html
Um dies zu ermöglichen, wird beim Aufruf der Methode UrlFactory.init(..) eine Instanz von PathLookup übergeben:
Listing: Beispiel URL-Erzeugung – Übergabe von PathLookup bei Initialisierung
public class AdvancedUrlFactory implements UrlFactory {
privatePathLookup _pathLookup;
public void init(final Map<String, String> settings,
final PathLookup pathLookup) {
_pathLookup = pathLookup;
...
}
...
}
Das Interface bietet Zugriff auf die folgende Methode:
- @Nullable String lookupPath(IDProvider folder, Language language,
@Nullable TemplateSet templateSet): Die Methode ist zuständig für das Auslesen eines Pfades, der für einen übergeordneten Projektknoten (Instanzen vom Typ PageRefFolder oder MediaFolder) im SiteArchitect definiert wurde. Dazu wird der gewünschte Projektknoten vom Typ IDProvider übergeben. Außerdem wird der Parameter language übergeben, der die Projektsprache definiert, für die ein Knoten gelesen werden soll und optional der Parameter templateSet für einen Vorlagensatz. Die Methode liefert als Rückgabewert:- den vordefinierten Pfad für den übergebenen Projektknoten als String (sofern ein Pfad gespeichert wurde),
- null, falls für das angefragte Objekt bisher kein Pfad gespeichert wurde,
- null, falls es sich nicht um ein Objekt vom Typ MediaFolder bzw. PageRefFolder handelt,
- einen Leerstring, wenn es sich beim angefragten Objekt um den Wurzelknoten der Verwaltung handelt und keine vordefinierte URL zu diesem Wurzelknoten gespeichert wurde.
Der Pfad, der von der Methode lookupPath(…) zurückgegeben wird, enthält in keinem Fall einen abschliessenden Schrägstrich - wird der Pfad für einen Ordner angefragt, muss zum Anfügen eines Dateinamens oder weiteren Pfadbestandteils vor der weiteren Bearbeitung ein Schrägstrich an diesen Pfad angehängt werden. |
Die über PathLookup.lookupPath(…) ausgelesenen, vordefinierten Pfade können anschließend bei der Erzeugung der URLs untergeordneter Projektinhalte über die gesamte Vaterkette berücksichtigt werden (Beispiel aus der Referenz-Implementierung AdvancedUrlFactory):
Listing: Beispiel URL-Erzeugung – PathLookup verwenden
public class AdvancedUrlFactory implements UrlFactory {
privatePathLookup _pathLookup;
//Step 1 init()
public void init(final Map<String, String> settings,
final PathLookup pathLookup) {
_pathLookup = pathLookup;
...
}
...
//Step 2: getUrl()
public String getUrl(final ContentProducer contentProducer,
final TemplateSet templateSet, final Language language,
final PageParams pageParams) {
...
final StringBuilder buffer = new StringBuilder(0);
final String path =
_pathLookup.lookupPath(contentProducer, language, templateSet);
if (path != null) {
// write path to buffer
...
} else {
// execute recursive method to build a slash-delimited path for
// the provided folder a it's parent chain. For each folder on the
// chain this methods calls getName(folder, language). For the
// root folder (folder.getParent() == null) the constructed path
// is empty. The constructed path will be appended to the provided
// StringBuilder.
collectPath(contentProducer.getParent(), language, templateSet, len, buffer);
}
...
return buffer.toString();
}
...
}
In der Implementierung AdvancedUrlFactory wird über die Methode getUrl(…) der vordefinierte URL-Pfad eines Projektknotens ausgelesen. Dazu wird die Methode lookupPath(…) auf der bei der Initialisierung erzeugten Instanz von PathLookup aufgerufen, die rekursiv über die gesamte Vaterkette des Projektknotens läuft und den vordefinierten Pfad (sofern vorhanden) oder den Anzeigenamen des jeweiligen Vaterknotens ausliest. Alle so ausgelesenen Pfadfragmente werden über die Methode getUrl(…) zu einem neuen URL-Pfad zusammengesetzt.