Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich benutze quasi die UrlFactory aus den Beispielen. Das funktioniert auch wunderbar, allerdings bleibt ein Problem.
Hat man nun im Java-Client eine Produkt-Detailseite, so habe ich in meinem Modul als selected Element kein SectionImpl-Objekt, sondern ein DatasetImpl-Objekt.
Dieses ist kein ContentProducer und somit kann ich auch nicht die getUrl-Methode der UrlFactory benutzen.
Wie komme ich an die finale URL einer ausgewählten Produkt-Detail-Seite?
Wieso gehst du nicht den von mir skizzierten Weg?
[EDIT]
An das Dataset kommst du mit "context.getElement()".
gerne, aber ich weiß halt nicht, wie ich an das pageRef rankomme um pageref.getStoredUrl aufzurufen.
Mir fehlt also quasi der Teil:
PageRef pageref = ...;
Eine Möglichkeit wäre z.B. so: dataset.getTableTemplate().getPreviewPageRef()
Das war es ... danke schön. Mit der PageRef funktioniert es dann ja auch mit dem gewünschten Weg.
Das war es doch nicht
Zumindest in der Mithras-Responsiv Version ist das dataset.getTableTemplate().getPreviewPageRef() immer dasselbe für alle Produkte aller Kategorien.
Nachtag: Auch in der normalen Mithras Version bekomme ich als URL immer:
/Produkte/[Kopiervorlage]-Modulwechselrichter-150W-12V-Mini.html
für alle Produkte.
Es sollte aber am Ende eigentlich z.B.:
/Produkte/Solarspeicher/Accum-1-000-L.html
entstehen.
Gibt es hier schon eine Lösung?
Hm, meiner Meinung nach steht schon alles hier. Die Bestimmung der Seitenreferenz ist abhängig vom Kontext. Außerdem kann es ja durchaus gewünscht sein, das ein Datensatz an mehreren Stellen gerendert wird. Dein Problem, das die URL eines ganz anderen Datensatzes herauskommt, kann ich aber nicht nachvollziehen.
Hmmm .. hier ist nochmal der fertige Code, der aber im Falle eines Dataset immer die Url des Produktes liefert, welches ((Dataset) storeElement).getTableTemplate().getPreviewPageRef() für alle Elemente einer Datenquelle gleich ist. Vielleicht ist hier noch ein Gedankenfehler!?
Erst mal der Einstieg über einen Button im Template selbst ...
public class MyExecutable implements Executable{
@Override
public Object execute(Map<String, Object> paramMap) throws ExecutionException {
IDProvider selectedElement = (IDProvider) paramMap.get("element");
BaseContext context = (BaseContext) paramMap.get("context");
Language language = (Language) paramMap.get("language");
MyClass.doit(context, selectedElement , language);
return null;
}
@Override
public Object execute(Map<String, Object> paramMap, Writer paramWriter1, Writer paramWriter2) throws ExecutionException {
return null;
}
}
Und dann der Code, der mir die entsprechende URL zum selectedElement liefern soll ...
protected String getUrl() {
StoreElement storeElement = selectedElement;
PageRef pageRef;
if (storeElement instanceof Dataset) {
pageRef = ((Dataset) storeElement).getTableTemplate().getPreviewPageRef();
} else {
// get PageRef from page
}
final TemplateSet templateSet = fetchTemplateSet(pageRef);
PageParams pageParams = pageRef.getMultiPageParams(language, templateSet).getPageParams(0);
final UrlFactory urlFactory = config.createUrlFactory();
return urlFactory.getUrl(pageRef, templateSet, language, pageParams);
}
Du hast einige Hinweise in diesem Thread ignoriert
Kurzfassung ist: Für Datensätze bitte diesen Code benutzen
pageref.getStoredUrl(language, templateset, dataset.getEntity())
Ich hatte das schon versucht, dann aber aufgegeben, da die Methode getStoredUrl an der Stelle null lieferte.
Jetzt habe ich das noch mal probiert und festgestellt, dass gerade meine getesteten Entities null liefern. Andere gehen aber wie gewünscht.
z.B. bei dem Produkt KM 12 poly im Mithras Responsive Design liefert die Methode null zurück. Es existiert aber die URL: /Produkte/Kristalline-Module/Christallinemodule-Produkt_1044.html nach dem Deployment.
Woran liegt das?