MichaelN
I'm new here

final URL eines Datasets

Jump to solution

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?

0 Kudos
30 Replies

Dann wird bei der Generierung eine URL-Strategie ohne Persistenz benutzt. Stell doch mal den Auftrag um, so dass z.B. "Advanced URLs" als Strategie benutzt wird.

Peter
0 Kudos

Soweit ich das sehen kann steht das auf "Advanced URLs"

generate.jpg

0 Kudos

[EDIT]

Hm, die URL Produkte/Kristalline-Module/Christallinemodule-Produkt_1044.html sieht aber nicht nach "Advanced URLs" aus... 1044 ist die ID des entsprechenden Datensatzes?

Sprache und Template-Satz sind bei deinem Aufruf korrekt?

Peter
0 Kudos

Hilft leider alles nichts.

Jetzt habe ich auch schon die neue Mithras-Version installiert und die Seiten auch komplett (und Fehlerfrei) generiert.

Die Seite und die Änderrungen sind auch ordnungsgemäß deployed, allerdings liefert getStoredUrl trotzdem null.

0 Kudos

Hallo Michael,

wie schon anfangs von Peter erwähnt hat ja ein Datensatz für sich alleine NIE eine URL, sondern immer nur die Kombination "Seitenreferenz der ContentProjektion"+Datensatz.

Kann es sein, dass Du mit der falschen Seitenreferenz arbeitest? Es muss die sein, über die die Detailseite des Datensatzes auch erzeugt wird - nur dort wird die entsprechende Information "eingetragen".

Oft ist das die Vorschauseite, das muss aber nicht sein - das kommt aufs Projekt an. Wenn ich es richtig im Kopf habe, ist das im Mithras nicht so, darauf deutet auch der Dateipfad der Detailseite - der enthält nämlich die Produktkategorie als Ordner. Ich meine, die einzelnen Detailseiten werden im Mithras je nach Kategorie des Produktes von verschiedenen Seitenreferenzen mit entsprechenden Filtern erzeugt.

D.h. Du müsstest erst die "passende" Seitenreferenz (letztlich diejenige, die für die Detailseiten der Kategorie des Produktdatensatzes "zuständig" ist) finden und dann genau diese pageRef nach der storedUrl für den Datensatz fragen.

Viele Grüße

Michael

0 Kudos

Hallo und danke für die Antwort.

Das Problem, was ich ja von Anfang an hatte ist, dass ich nicht programmatisch herausbekomme, welche Verwendung - es gibt augenscheinlich ref.jpg

keine!? - hier vorhanden ist.

Bis jetzt habe ich den _empfohlenen_ Ansatz über:

PageRef pageRef = ((Dataset) storeElement).getTableTemplate().getPreviewPageRef(); 

versucht, aber das liefert ja anscheinend nicht das gewünschte.

D.h. Du müsstest erst die "passende" Seitenreferenz (letztlich diejenige, die für die Detailseiten der Kategorie des Produktdatensatzes "zuständig" ist) finden und dann genau diese pageRef nach der storedUrl für den Datensatz fragen.

"finden" heiß, dass muss projektspezifisch manuell geschehen, oder gibt es einen programmatischen Weg? Gerade mit dem Hintergrund, dass es eigentlich ja nur einen Weg (URL) zum Ziel (Produkt-Detailseite) geben sollte, und in diesem Projekt ja auch gibt?

0 Kudos

Es bleibt im Übrigen die Frage offen, warum es für einige Produkte über getTableTemplate().getPreviewPageRef()funktioniert und  andere null liefern!?

0 Kudos

Ich versuche nun den vorgeschlagenen Weg.

Der Code sieht wie folgt aus:

((PersistentList) ((Dataset) contentElement).getEntity().get("categoriesList")).get(0)

Damit komme ich nun an das Entity der Kategorie. Wie kann ich dann nun das passende Dataset der Kategorie-Entity (storeElementFromCategoryEntity) bekommen um mir dann wieder per

((Dataset) storeElementFromCategoryEntity).getTableTemplate().getPreviewPageRef();

die zugehörige PageRef zu holen?

Sprich wie komme ich an das passende Dataset einer Entity?

Ist das wirklich der gewünschte und _einfachste_ Weg zum Ziel?

0 Kudos

Also ... schlussendlich bekomme ich als pageRef wieder mal null.

final ContentStoreRoot contentStore = (ContentStoreRoot) storeElement.getProject().getUserService().getStore(Type.CONTENTSTORE, false);

Content2 content2 = contentStore.getContent2ByName("kategorien");

       

Entity entity = ((Entity)((PersistentList) ((Dataset) contentElement).getEntity().get("categoriesList")).get(0));

Dataset dataset = content2.getDataset(entity);

       

pageRef = dataset.getTableTemplate().getPreviewPageRef(); // liefert null

0 Kudos

Und bei diesem Ansatz ist urlPath null:

public static PageRef getFirstPageRefFromStoreElement(StoreElement storeElement) {

        ReferenceEntry[] referenceEntries = storeElement.getIncomingReferences();

        for (ReferenceEntry referenceEntry : referenceEntries) {

            IDProvider idProvider = referenceEntry.getReferencedElement();

            if (!(idProvider instanceof PageRef)) {

                continue;               

            }

            return (PageRef) idProvider;

        }

        return null;

}

final ContentStoreRoot contentStore = (ContentStoreRoot) storeElement.getProject().getUserService().getStore(Type.CONTENTSTORE, false);
Content2 content2 = contentStore.getContent2ByName("kategorien");
       
Entity entity = ((Entity)((PersistentList) ((Dataset) contentElement).getEntity().get("categoriesList")).get(0));
Dataset dataset = content2.getDataset(entity);
       
pageRef = getFirstPageRefFromStoreElement(dataset);

urlPath = pageRef.getStoredUrl(language, templateSet, ((Dataset) storeElement).getEntity());

0 Kudos