dspieser
Returning Observer

Datenquelle / FS_CATALOG mit Absatztemplates

Hallo,

irgendwo versteh ich es nimmer.
Kann mir bitte jemand erklären was der Unterschied zwischen diesen beiden Ausgaben im CaaS-Kanal der selben Komponente ist?

Ich habe bei einer Datenquelle pro Datensatz eine FS_CATALOG die Absätze enthält.

Nun wollte ich im CaaS-Kanal der Absätze die JSON Ausgabe bereitstellen um in dem Datensatz Template lediglich die Ausgabe der Absätze machen.

Die Absätze pro Fall einzel ausgeben geht. Da muss ich dann aber in jedem Fall immer prüfen welches Template das ist.

Bsp Absatz.:

Absatz:

$CMS_SET(setSectionObj, {"":""})$

$CMS_SET(void, setSectionObj.clear())$

$CMS_SET(void, setSectionObj.put("content", "Text Bild"))$

$CMS_VALUE(setSectionObj.toJSON)$

Datensatz Template:

$CMS_IF(!ct_contentlist.empty)$

     $CMS_FOR(content,ct_contentlist)$

          $CMS_SET(setContent, content)$

          $CMS_SET(void,setContentList.add(setContent))$

     $CMS_END_FOR$

$CMS_END_IF$

liefert: "de.espirit.firstspirit.generate.IdentifiableCatalogCard@5a4952b1"

und 

$CMS_IF(!ct_contentlist.empty)$

     $CMS_FOR(content,ct_contentlist)$

          $CMS_VALUE(content)$

     $CMS_END_FOR$

$CMS_END_IF$

liefert: {"content":"Text Bild"}

ganz am Ende die letztendliche Ausgabe:

$CMS_VALUE(setJsonArticleObj.toJSON)$

ich bräuchte es aber in meiner Json und nicht einfach als Ausgabe.

Vielleicht steh ich ja auf dem Schlauch, aber habe schon mehrere Ausgaben versucht..

Danke schon mal für eure Denkanstöße

Grüße

Dietmar

0 Kudos
13 Replies
hoebbel
Crownpeak employee

Hallo Dietmar,

um die Eingabekomponenten der jeweiligen Card zu bekommen, benötigst Du die Schreibweise

$CMS_IF(!ct_contentlist.empty)$

     $CMS_FOR(content,ct_contentlist)$

          $CMS_VALUE(content.item.<Bezeichner>)$

     $CMS_END_FOR$

$CMS_END_IF$

Um die Catalog Eingabekomponente über die Vorlagen der einzelnen, inneren Absatztemplates auszugeben, reicht ein

$CMS_VALUE(ct_contentlist)$

Wenn ich es richtig verstanden habe, suchst Du letzteres.

Doku dazu: Online Dokumentation FirstSpirit - Datentyp Card

Anmerkung: Es gibt inzwischen auch die inline JSON Funktion. Diese erzeugt JSON für eine Seite, einen Absatz oder eine einzelne Eingabekomponente.

Damit würde es so aussehen (wenn nur die CATALOG Eingabekomponente ausgegeben werden soll:

$CMS_VALUE(json(ct_contentlist))$

und in den einzelnen Absätzen:

$CMS_VALUE(json(#this))$

Dokumentationseinstieg dazu:

Online Dokumentation FirstSpirit - Json Funktion

bzw.

Online Dokumentation FirstSpirit - Ein Ausdruck für Alles

Hinweis: Die JSON Funktion steht seit der FirstSpirit Version 2019-12 zur Verfügung und wird regelmäßig erweitert. Für die Nutzung sollte also eine möglichst aktuelle FirstSpirit Version verwendet werden.

Viele Grüße aus Dortmund

Holger

0 Kudos
dspieser
Returning Observer

Hallo Holger,

danke für deinen Beitrag.

Das habe ich bereits verstanden, es löst aber nicht mein Problem.

Wenn ich ein $CMS_VALUE(#row.ContentList)$ mache bekomme ich das erwartete Verhalten.
Es komm das raus was in der Absatzvorlage definiert wurde bzw. steht.

{"content":"Bühne Test","template":"Content.contentpage","templatename":"ContentPage","type":"type"}

Wenn ich aber den Inhalt in ein SET  $CMS_SET(void,setJsonArticleObj.put("content",#row.ContentList))$ schreibe

liefert mir die Preview Ausgabe : $CMS_VALUE(setJsonArticleObj.toJSON)$

"content": ["de.espirit.firstspirit.generate.IdentifiableCatalogCard@8f7cab"],

Vielleicht ist es jetzt deutlicher.

Ich kann die Unterschiedliche Ausgabe nicht ganz verstehen.
Es muss mit dem SET zusammen hängen.

Grüße

Dietmar

0 Kudos
hoebbel
Crownpeak employee

Hallo Dietmar,

funktioniert $CMS_SET(setJsonArticleObj["content"],eval(#row.ContentList))$ ?

Erklärung: $CMS_SET(setJsonArticleObj["content"], ist dasselbe wie $CMS_SET(void,setJsonArticleObj.put("content", - nur das kein temporäres Objekt erzeugt wird.

eval(#row.ContentList) löst das Objekt auf (wie $CMS_VALUE()$), anstatt es direkt zu übergeben.

Viel Grüße

Holger

0 Kudos
dspieser
Returning Observer

Hallo Holger,

leider nein.

Ausgabe jetzt:

"content": "[de.espirit.firstspirit.generate.IdentifiableCatalogCard@72a27c55, de.espirit.firstspirit.generate.IdentifiableCatalogCard@590678a1, de.espirit.firstspirit.generate.IdentifiableCatalogCard@124cdb23, de.espirit.firstspirit.generate.IdentifiableCatalogCard@530b7042, de.espirit.firstspirit.generate.IdentifiableCatalogCard@32aaeea2]",

Grüße

Dietmar

0 Kudos
hoebbel
Crownpeak employee

Hallo Dietmar,

ich hab es jetzt mal selber versucht und dabei verstanden, wo das Problem liegt Smiley Sad

Funktioniert das hier bei Dir:

Absatz (oder auch so lassen, wie Du den bereits hast):

$CMS_SET(setSectionObj, {:})$ $--setzt direkt eine leere Map --$

$CMS_SET(setSectionObj["content"], "Text Bild")$ $--spart das temporäre "void" Objekt --$

  

Datensatz Template:

$CMS_IF(!ct_contentlist.empty)$

     $CMS_FOR(content,st_bestandsliste)$

          $CMS_SET(set_Content)$$CMS_VALUE(content.item)$$CMS_END_SET$

          $CMS_SET(void,setContentList.add(set_Content.toString()))$

     $CMS_END_FOR$

$CMS_END_IF$

Der "Trick" ist, das CMS_SET als Templatefragment zu setzen (also mit $CMS_END_SET$) und dann mit toString() dessen Inhalt zu übergeben.

Viele Grüße

Holger

0 Kudos
dspieser
Returning Observer

Guten Morgen Holger,

hatte mich schon gefreut, da das JSON Valide war.

Allerdings wird das gesamte JSON-Object des Absatzes als String ausgegeben.

"content": ["{\"basicLayout\":{\"highlighted\":\"normal\",\"marginBottom\":\"mb-3\"},\"content\":{\"sectionText\":\"<p>Diese Europameisterschaft der Berufe soll die besondere Rolle des Handwerks als Stütze der EU-Wirtschaftskraft betonen und das Ansehen des Handwerks stärken. Im Mittelpunkt stehen junge Handwerker und ihre Leistungen. Denn ein ganz konretes Ziel ist es, mehr junge Menschen für einen der etwa 130 Handwerksberufe zu begeistern. Würth ist Mitglied der WorldSkills Germany und unterstützt als Sponsor auch die EuroSkills, die Ende September in Budapest zum sechsten Mal ausgetragen wurden.<\\/p>\"},\"sectionLayout\":{\"basicLayout\":\"01\",\"imageSide\":\"image_left\",\"slideText\":\"false\",\"textWidthRestrict\":\"false\",\"wrapText\":\"true\"},\"template\":\"section00\",\"templatename\":\"01. Text-Bild\"}",

Wenn du dafür auch noch ne Antwort hättest?

Danke nochmal

Gruß

Dietmar

0 Kudos
hoebbel
Crownpeak employee

Guten Morgen Dietmar,

um herauszufinden, wo die Problemstelle ist, ändere doch mal die innere Vorlage so ab, dass dort manuell JSON ausgegeben wird, also zum Beispiel in

{"test":"Dies ist einfaches JSON","number":7}

$--

bisherige Code der Vorlage - das Klappt aber nur, wenn dort nicht schon FirstSpirit Kommentare (oder genauer die Zeichenkombination --$) vorhanden sind

--$

Wenn Du dann weiterhin innerhalb der content-Liste Strings bekommst, liegt das Problem in der äußeren Vorlage. Wenn der Inhalt der content-Liste dann aber korrektes JSON ist, liegt das Problem in der inneren Vorlage.

Anhand der Ausgabe, die Du gepostet hast, gehe ich aber davon aus, dass hier auf den String (der nach meinem Verständnis valides JSON enthält) nochmals irgendwo toJson() angewandt wird. (es müsste also in der äußeren Vorlage passieren)

Es könnte "$CMS_VALUE(setJsonArticleObj.toJSON)$" sein - brauchst Du das wirklich? Funktioniert hier evtl. auch $CMS_VALUE(setJsonArticleObj)$?

Viele Grüße

Holger

0 Kudos
dspieser
Returning Observer

Hallo Holger,

mit innere Vorlage ist der Absatz richtig? (Also welcher in der Card steht)

Dort habe ich jetzt dein Beispiel in der Ausgabe eingetragen.

Ausgabe:

content": ["{\"test\":\"Dies ist einfaches JSON\",\"number\":7}"],

Das "toJSON" brauche ich damit der Datensatz überhaupt JSON wird.

Ohne toJSON:

{article_description=Junge Talente fördern und gut ausgebildete Fachkräfte an Unternehmen vermitteln – diese Ziele verfolgt der Verein WorldSkills Germany e.V. Durch Partner wie Würth verfügt der Verein über ein großes Netzwerk, in dem Ausbilder und Talente zueinander finden. Vor allem im Bereich Handwerk fördert WorldSkills Germany den Nachwuchs und organisiert alle zwei Jahre im Verbund mit Vereinen anderer europäischer Länder den Wettbewerb EuroSkills., article_id=57216, article_link=/fs5preview/preview/3794790/site/DE/current/4548805/4019247/contentId=57216, article_shortdescription=Junge Talente fördern und gut ausgebildete Fachkräfte an Unternehmen vermitteln – diese Ziele verfolgt der Verein WorldSkills Germany e.V. Durch Partner wie Würth verfügt der Verein über ein großes Netzwerk, in dem Ausbilder und Talente zueinander finden. Vor allem im Bereich Handwerk fördert WorldSkills Germany den Nachwuchs und organisiert alle zwei Jahre im Verbund mit Vereinen anderer europäischer Länder den Wettbewerb EuroSkills., article_title=EuroSkills 2018: Würth fördert größten Talent-Wettbewerb des Handwerks, article_titletag=EuroSkills 2018: Würth fördert größten Talent-Wettbewerb des Handwerks, content=[{"test":"Dies ist einfaches JSON","number":7}], mainObject={cta={}, image=/fs5preview/preview/3794790/media/DE/current/4230632/res_wl2_frontpage_1200/wuerth_euroskills2018_061_klein_1.jpg, teaser={alttag=Magazin Teaser wuerth_euroskills2018_063_quadrat, image=/fs5preview/preview/3794790/media/DE/current/4230643/res_wl2_frontpage_1200/wuerth_euroskills2018_063_quadrat.jpg, titletag=Magazin Teaser wuerth_euroskills2018_063_quadrat}, text=<h2 class="heading-alt text-primary">Die EM der Handwerksberufe</h2>

<p>Junge Menschen für das Handwerk begeistern und die Bedeutung des Handwerks für die Wirtschaft unterstreichen - das ist das erklärte Ziel dieses Wettbewerbs. Im Beitrag erfahren Sie mehr über die Hintergründe und wie das deutsche Team abgeschnitten hat. </p>}, prodCat=null}

Gruß

Dietmar

0 Kudos
hoebbel
Crownpeak employee

Hallo Dietmar,

Das Problem hier ist, dass aus dem Absatz nun gültiges JSON zurückkommt, der Rest aber in einem anderen Format vorliegt.

Wie sehen denn Listen in dem Format an anderen Stellen aus?

Ich sehe hier zwei Lösungsansätze - entweder den Inhalt der inneren Absätze nicht als JSON, sondern so zurück liefern, dass das Format anschließend in JSON umgewandelt wird. Also eine Liste in diesem {"key"="value",...} Format.

Oder bei der Umwandlung des Datensatzes in JSON die inneren Absätze weglassen und diese anschließend dem fertigen JSON hinzufügen.

JSON müsste ja ein einfacher String sein, also beispielsweise so:

$CMS_SET(myjson,"{\"test\":\"Dies ist JSON\",\"number\":7}")$$-- das erzeugt nur irgendeinen String, der gültiges JSON--$

$CMS_VALUE(myjson.substring(0,myjson.length-1)+",\"content\":"+setContentList+"}")$ $-- das schneidet das letzte Zeichen des JSON ab (sollte immer ein "}" sein) und fügt den Inhalt der inneren Absätze hinzu und schließt das JSOn wieder mit einem "}"--$

$-- Wenn das letzte Zeichen auch ein "]" sein kann, dann anstelle des schließenden "}" einfach myjson.substring(myjson.length-1) verwenden --$

Da ich aber nicht genau weiß, was hier wie wann gemacht wird, fällt es mir sehr schwer, eine sinnvolle Lösung zurückzuschreiben.

Wenn das auf die einfache Art, das JSON um die inneren Absätze zu erweitern, nicht klappt, kannst Du mal an einem möglichst kurzen Beispiel zeigen, was Ihr genau macht?

z.B wie {test=Dies soll json werden,number=7} in JSON umgewandelt wird?

Und wie eine Liste in diesem Format aussehen soll?

Ich hoffe, dass ich dann  morgen Zeit finde, eine passende Lösung zu suchen.

Viele Grüße

Holger

0 Kudos