Questions & Answers

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

Type a product name