Search the FirstSpirit Knowledge Base
Hallo zusammen,
wir haben derzeitig folgendes Problem:
Unser Kunde möchte seine URL's auf die Advanced URL's umstellen. Dies funktioniert soweit fehlerfrei. Nun gibt es allerdings noch die Anforderung, dass die Sprachkürzel, welche bei der normalen URL Generierung vor den Seiten Pfad gesetzt werden, auch bei den Advanced URL's verwendet werden.
Beispiel:
www.test.de/de/index.jsp
Mithilfe multipler Generierungs- und Deployment-Tasks konnten wir dies nun realisieren, sodass die Seiten unterhalb des Sprachkürzels erreichbar sind.
Es gibt allerdings das Problem, dass bestimmte Seiten, wenn deren Name öfters generiert wird innerhalb eines Ordners, ein .2 erhalten am Ende.
Beispiel:
index.jsp
index.2.jsp
Unser Kunde möchte nun, dass das .2 aus dem Dateinamen entfällt.
Hatte bereits jemand einen ähnlichen Fall oder weiß, was wir an dieser Stelle tun müssen um die URL's nach dem Kundenwunsch zu generieren?
Beispiel:
Wir wären für alle Tipps und Tricks sehr dankbar.
Viele Grüße
Max
Hallo Max,
Du könntest dem Sitestore-Root entsprechende SEO-URLs zuweisen. Das geht aktuell nicht per GUI sondern nur über die API. D.h. Du müsstest mit einem kleinen Menü-Skript für die jeweiligen Sprachen die SEO-URLs setzen.
In etwa so:
import de.espirit.common.base.Logging;
import de.espirit.firstspirit.access.GuiScriptContext;
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.project.TemplateSet;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.globalstore.GlobalStoreRoot;
import de.espirit.firstspirit.access.store.globalstore.URLProperties;
import de.espirit.firstspirit.access.store.sitestore.SiteStoreRoot;
import de.espirit.firstspirit.agency.LanguageAgent;
import de.espirit.firstspirit.agency.ProjectAgent;
import de.espirit.firstspirit.agency.SpecialistsBroker;
import de.espirit.firstspirit.agency.StoreAgent;
import java.util.List;
import java.util.Locale;
StoreAgent storeAgent = context.requireSpecialist(StoreAgent.TYPE);
List<Language> languages = context.requireSpecialist(LanguageAgent.TYPE).getLanguages();
GlobalStoreRoot globalStoreRoot = (GlobalStoreRoot) storeAgent.getStore(Store.Type.GLOBALSTORE);
URLProperties urlProperties = globalStoreRoot.getUrlProperties();
SiteStoreRoot siteStoreRoot = (SiteStoreRoot) storeAgent.getStore(Store.Type.SITESTORE);
//only use first template set here
TemplateSet templateSet = context.requireSpecialist(ProjectAgent.TYPE).getTemplateSets().get(0);
try {
urlProperties.setLock(true);
for (Language language : languages) {
urlProperties.setStoredUrl(
'/'+language.getAbbreviation().toLowerCase(Locale.ENGLISH),
siteStoreRoot,
language,
templateSet
);
}
urlProperties.save();
urlProperties.setLock(false);
} catch (Exception e) {
context.logError("Could not modify URL settings");
}
Es müssten natürlich (vorher!) einmal alle URLs zurückgesetzt werden.
Dadurch dass hier letztlich "echte verschiedene" URLs erzeugt werden, sollte es auch nicht zu Konflikten und somit zu den numerischen Ergänzungen kommen.
Viele Grüße
Michael
Die Anforderung lässt sich nur korrekt umsetzen, wenn man eine eigene Implementierung einer UrlFactory als Modul bereitstellt und nutzt. Das kann z.B. auf Basis der Beispielimplementierung geschehen, der Code ist dafür freigegeben.
Hallo Max,
Du könntest dem Sitestore-Root entsprechende SEO-URLs zuweisen. Das geht aktuell nicht per GUI sondern nur über die API. D.h. Du müsstest mit einem kleinen Menü-Skript für die jeweiligen Sprachen die SEO-URLs setzen.
In etwa so:
import de.espirit.common.base.Logging;
import de.espirit.firstspirit.access.GuiScriptContext;
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.project.TemplateSet;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.globalstore.GlobalStoreRoot;
import de.espirit.firstspirit.access.store.globalstore.URLProperties;
import de.espirit.firstspirit.access.store.sitestore.SiteStoreRoot;
import de.espirit.firstspirit.agency.LanguageAgent;
import de.espirit.firstspirit.agency.ProjectAgent;
import de.espirit.firstspirit.agency.SpecialistsBroker;
import de.espirit.firstspirit.agency.StoreAgent;
import java.util.List;
import java.util.Locale;
StoreAgent storeAgent = context.requireSpecialist(StoreAgent.TYPE);
List<Language> languages = context.requireSpecialist(LanguageAgent.TYPE).getLanguages();
GlobalStoreRoot globalStoreRoot = (GlobalStoreRoot) storeAgent.getStore(Store.Type.GLOBALSTORE);
URLProperties urlProperties = globalStoreRoot.getUrlProperties();
SiteStoreRoot siteStoreRoot = (SiteStoreRoot) storeAgent.getStore(Store.Type.SITESTORE);
//only use first template set here
TemplateSet templateSet = context.requireSpecialist(ProjectAgent.TYPE).getTemplateSets().get(0);
try {
urlProperties.setLock(true);
for (Language language : languages) {
urlProperties.setStoredUrl(
'/'+language.getAbbreviation().toLowerCase(Locale.ENGLISH),
siteStoreRoot,
language,
templateSet
);
}
urlProperties.save();
urlProperties.setLock(false);
} catch (Exception e) {
context.logError("Could not modify URL settings");
}
Es müssten natürlich (vorher!) einmal alle URLs zurückgesetzt werden.
Dadurch dass hier letztlich "echte verschiedene" URLs erzeugt werden, sollte es auch nicht zu Konflikten und somit zu den numerischen Ergänzungen kommen.
Viele Grüße
Michael
Hallo Michael,
deine Lösung via Skript funktioniert einwandfrei und entspricht genau unseren Vorstellungen.
Hätte dazu noch eine kurze Frage. Ist diese Umstellung der URLProperties dann dauerhaft oder kann diese auch verschwinden? Beispielsweise nach einem Server Neustart?
Viele Grüße
Max
Hallo Max,
die Einstellungen werden ganz normal persistiert - ich habe es jetzt nicht explizit getestet, es würde mich aber sehr wundern wenn hier nach einem Neustart irgendwas verschwinden würde. Die URLs erscheinen übrigens sogar in der Konfigurations-Liste der SEO-URLs wenn sie einml per Skript angelegt sind - dort könnten sie natürlich gelöscht werden 😉
Ich habe gerade nochmal getestet, wie es sich mit der Funktion "Gespeicherte URLs zurücksetzen" verhält: Da die sich (sinnvollerweise) nicht auf Ordner auswirkt, kann man die auch kaum "versehentlich" löschen.
Viele Grüße
Michael
Hallo Michael,
danke dir für die Information. Habe gerade auch nochmal ein wenig das Skript getestet und konnte keine negativen Effekte oder Fehler finden. Schaut soweit alles gut aus 🙂
Vielen Dank für das sehr hilfreiche Skript.
Viele Grüße
Max
Hallo Michael,
in unserem Projekt nutzen wir das Mandantenprinzip und haben deswegen in der Struktur mehrere Länderauftritte. Nun habe ich dasselbe Problem wie Max, jedoch bei nur einem Mandanten (Japan), da dort die Anzeigenamen in Japanisch nicht gepflegt sind. Gibt es auch eine Skriptvariante die auf einem bestimmten Strukturordner rekursiv ausgeführt werden kann? Ich will nämlich die URL der anderen Mandanten nicht "kaputt" machen, da dort die Anzeigenamen der Ordner sauber übersetzt sind.
Besten Dank vorab und viele Grüße
Lukas
Hallo Lukas,
das Skript ist nur dazu da, auf dem SitestoreRoot die SEO-URLs zu setzen (weil es dafür schlicht keine GUI gibt). Wenn Du das auf einem Unterordner eines Mandanten in der Struktur machen willst, müssten die "Bordmittel" reichen, d.h. einfach für dessen Struktur-Ordner über die GUI eine SEO-URL definieren.
Oder habe ich etwas falsch verstanden?
Viele Grüße
Michael
Hi Michael,
stimmt natürlich, habe das in den globalen Einstellungen (URL-Einstellungen) für den Mandanten gemacht.
Danke dir und viele Grüße
Lukas