Questions & Answers

SOLVED
mareike
Returning Observer

Navigation Service Search by SEO Route

Jump to solution

What is the correct format to pass the seo path to the Search by SEO Route Endpoint?

In the documentation in Swagger UI the format is described as: /navigation/{navigationId}/by-seo-route/{+seoRoute:.+}

But no matter in what format I enter my seo routes, the result ist always 404.

I already tried things like this:

/navigation/preview.mynavigationid/by-seo-route/{path/to-my-site/}

or this

/navigation/preview.mynavigationid/by-seo-route/{seoRooute:"path/to-my-site/"}

Does someone have an actual example how to pass a path and/or a seoRouteRegex to the Endpoint?

When using the Swagger "Try it out"-Tool, the input in the route input is not taken into account so it always gives me:

427474_pastedImage_0.png

0 Kudos
1 Solution

Accepted Solutions
tkachuk
Crownpeak employee

Hi Mareike,

sorry about the confusing documentation, now that you pointed it out it is obvious that we need to improve this.

Regarding your question, suppose you have the following navigation:

{

  "id": "root",

  "label": "foobar_DE",

  "seoRoute": "/foo/de",

  "children": [

    {

      "id": "sub",

      "label": "foobarsub_DE",

      "seoRoute": "/foo/sub/de"

    }

  ]

}

You can query the child element directly using the following request:

.../by-seo-route/foo/sub/de

It is not possible to provide a regex during the GET request. Rather, the way it works is that first the navigation service tries to do an equals match on the seoRoute of the elements. If a match is found, the element is returned. If not, it tries to apply the seoRouteRegex of the elements to the requested seo route, again returning the element with the first match.

I hope this clears it up. If you have any more questions, don't hesitate to ask!

View solution in original post

0 Kudos
8 Replies
tkachuk
Crownpeak employee

Hi Mareike,

sorry about the confusing documentation, now that you pointed it out it is obvious that we need to improve this.

Regarding your question, suppose you have the following navigation:

{

  "id": "root",

  "label": "foobar_DE",

  "seoRoute": "/foo/de",

  "children": [

    {

      "id": "sub",

      "label": "foobarsub_DE",

      "seoRoute": "/foo/sub/de"

    }

  ]

}

You can query the child element directly using the following request:

.../by-seo-route/foo/sub/de

It is not possible to provide a regex during the GET request. Rather, the way it works is that first the navigation service tries to do an equals match on the seoRoute of the elements. If a match is found, the element is returned. If not, it tries to apply the seoRouteRegex of the elements to the requested seo route, again returning the element with the first match.

I hope this clears it up. If you have any more questions, don't hesitate to ask!

0 Kudos
mareike
Returning Observer

Hallo Konstantin,
vielen Dank fรผr die Antwort.
Mit einer normalen seoRoute funktioniert es. Bei einer seoRouteRegex, z.B. so "seoRouteRegex": "^[\\/]?ueber-uns\\/standorte\\/[^\\s\\/]+$" bekomme ich allerdings den Fehler "Malformed URI: Illegal character in path" Ist hier etwas besonderes zu beachten?

0 Kudos
tkachuk
Crownpeak employee

Hallo Mareike,

wie genau sieht deine Request URL aus?

0 Kudos
mareike
Returning Observer

Oh sorry, ich lese gerade erst den Teil mit der Regex. Dann verstehe ich nicht so ganz wie ich alle Seiten einer Contentprojektion erhalten kann.
Denn 1. benรถtigen wir eine vollstรคndige Liste aller Datenbankeintrรคge, um in unserer Applikation alle Routen anzulegen.
und 2. auch wenn ich einen anderen Datenbank-Eintrag รผber den Endpunkt abfrage greift zwar die RegEx Regel und ich bekomme einen Eintrag zurรผck aber es ist immer der obserste Eintrag der Datenbank und nicht der, den ich abgefragt habe. in unserem Beispiel haben wir einen Datensatz mit Standorten. Vom Navigation Endpoint kommt folgender Eintrag:
{...

       "contentReference": "/ueber-uns/standorte/berlin.html",

       "seoRoute": "/ueber-uns/standorte/berlin.html",

       "seoRouteRegex": "^[\\/]?ueber-uns\\/standorte\\/[^\\s\\/]+$",

...   

},

Ein Request an den by-seo-rout Endpunkt mit ueber-uns/standorte/muenchen.html liefert ebensfalls den Eintrag fรผr den Standort Berlin.

Wie kann man denn alle Daten-Seiten erhalten?

0 Kudos
tkachuk
Crownpeak employee

Ich verstehe deine Anforderung gerade leider nicht ganz. Kannst du bitte deinen Use Case etwas detaillierter beschreiben?

Allgemein gibt es die Mรถglichkeit beim /by-seo-route Endpunkt den Query Parameter all zu verwenden, um die gesamte Navigation abzufragen. Sofern die vordefinierten Filtermechanismen nicht reichen ist es dann mรถglich im Browser die nรถtigen Elemente rauszusuchen.

Wenn es darum geht eine Liste aller Links zu den Datensรคtzen zu bekommen, dann gibt es die Mรถglichkeit eine Anfrage an den CaaS mit entsprechendem Filter abzusetzen.

0 Kudos
mareike
Returning Observer

Hallo Konstantin,

sorry fรผr die Unklarheiten, ich beschreibe den Use Case am Besten nochmals detaillierter.

Wir haben eine NextJS App, die auf Basis der Inhalte des FirstSpirit CMS Seiten und deren Inhalte erstellt.

Da die Seiten dynamisch angelegt werden, benรถtigen wir zunรคchst einen Endpunkt der alle URLs und zugehรถrigen gids beinhaltet.

Wir hatten gehofft, dass dies der Navigation Service รผbernehmen kรถnnte.

In einer weiteren Funktion der App werden dann die Seiten mit Inhalten befรผllt, indem ein Request an den CaaS mit der entsprechenden gid geschickt wird.

Die Datensatz-Seiten bilden hier eine Ausnahme, da sie ja alle die gleiche gid haben nutzen wir hier momentan folgenden fetch:

await fsxaApi.fetchByFilter(

  [{

   field: 'template.fsType',

   value: 'TableTemplate',

   operator: ComparisonQueryOperatorEnum.EQUALS,

  },{

   field: 'template.identifier',

   value: (baseContent2SectionPage.children[0].children[0] as Section).id,

   operator: ComparisonQueryOperatorEnum.EQUALS,

  },],CONSTANTS.DEFAULT_LOCALE,1,500

)) as Dataset[];

Der Array der da zurรผckkommt enthรคlt dann alle Datensatzseiten eines bestimmten Datensatzes. Im Ergebnis gibt es auch eine Propety die "route" heiรŸt. Ist das das was du mit "Wenn es darum geht eine Liste aller Links zu den Datensรคtzen zu bekommen, dann gibt es die Mรถglichkeit eine Anfrage an den CaaS mit entsprechendem Filter abzusetzen." meinst? Oder gibt es da noch eine elegantere Lรถsung?

Vielleicht noch ein Satz zur Erklรคrung: Wir ziehen das CMS gerade erst in die Cloud um und konnen onPremise den Navigation Service nicht nutzen. Daher hatten wir uns mittels
<CMS_FUNCTION name="Navigation" resultname="pagetmpl_sitemap"> eine eigene JSON gebastelt die alle Routen und gids enthielt. In dieser standen auch alle Datensatz-Routen drin, daher hatten wir gehofft, dass der Navigation Service uns auch eine solche Liste bietet Smiley Happy

0 Kudos
tkachuk
Crownpeak employee

Ja, das ist die Lรถsung, die ich meinte.

Allgemein bilden die Navigationen im Navigation Service Stand jetzt die Struktur des Site Stores aus FS ab. Also sรคmtliche PageRefFolder und PageRef Elemente. Content Projektionen werden insoweit vom Navigation Service unterstรผtzt, als dass fรผr zugehรถrige PageRefs automatisch eine seoRouteRegex generiert wird, wie hier beschrieben: Navigation Service: Modul Dokumentation

Eine Mรถglichkeit fรผr jede Datensatzseite ein eigenes Element in der Navigation zu generieren gibt es Stand jetzt nicht. Datenprojektionen gehรถren unserer Meinung nach nicht direkt in die Navigation, da wir ansonsten sehr "breite" Navigationsbรคume hรคtten. Wir haben Kunden mit mehreren Huntderttausenden Datensรคtzen in ihren Projekten.

Falls das etwas ist, was ihr euch wรผnscht, stellt bitte ein entsprechendes Feature Request.

0 Kudos
mareike
Returning Observer

Hallo Konstantin, sorry fรผr die spรคte Antwort. Vielen Dank dir, das beantwortet unsere Fragen. Ich werde versuchen die URLs der Datensรคtze รผber den CaaS-Filter zu erstellen.

0 Kudos

Type a product name