alwolf
I'm new here

Rückgabewert (variable) eines Beanshell Scripts in Ausgabekanal verwenden

Jump to solution

Ich habe mir ein Beanshell Skript erstellt, welches als Eingabeparameter ein Datenbank-Objekt hat und als Rückgabewert die Page ausgibt, welche auf dieses Datenbankobjekt verweist.

Mit CMS_RENDER kann ich den Rückgabewert nur ausgeben. Gibt es auch eine Möglichkeit, via CMS_SET den Rückgabewert aus dem Skript in eine Variable zu überegeben, auf der dann wieder innerhalb des Ausgabekanals gearbeitet werden kann?

Folgendes Konstrukt schwebt mir dabei vor (funktioniert nicht):

$CMS_SET(set_page, (script:"find_page_for_product","product":for_relatedProduct))$

Mit freundlichen Grüßen,

Alexander Wolf

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo,

man kann hier dem Script ein "Container-Objekt" übergeben, das dann befüllt wird. Wichtig ist hier, dass dieser Container vor dem Aufruf von $CMS_RENDER(...)$ definiert wird, damit er im entsprechenden aufrufenden Template zur Verfügung steht. Der Übersichtlichkeit halber macht man das am besten direkt vor dem Aufruf.

Beispiel:

$CMS_SET(set_result,[])$ $--Leere Liste als Container --$

$CMS_RENDER(script:"....",param1:...., param2:..., resultContainer:set_result)$

$CMS_VALUE(set_result.get(0)....)$

Im Script würde man dann einen entsprechenden Rückgabewert einfach in den übergebenen Container einfügen:

...

myResult=...

resultContainer.add(myResult);

Wenn man hier mit einer Map statt einer Liste als Container arbeitet kann man sogar mehrere Rückgabewerte bekommen - wichtig nist nur das auch alles entsprechend zu dokumentieren 😉

Kleiner Hinweis: Das direkte Setzen bzw. Definieren von Variablen "von unten nach oben" (also aus dem Script in den Seiten / Absatzkontext) ist - obwohl technisch möglich - im Gegensatz dazu nicht zu empfehlen, weil es den Code schlecht les- bzw. wartbar macht und (z.B. bei unbewusster Mehrfachverwendung eines Variablennamens einmal im Script und im Template) zu entsprechenden Seiteneffekten führen kann.

Viele Grüße

Michael

View solution in original post

0 Kudos
5 Replies
Peter_Jodeleit
Crownpeak employee

Hilft dieser Link? Mit CMS_SET Rückgabewert setzen

Peter
mbergmann
Crownpeak employee

Hallo,

man kann hier dem Script ein "Container-Objekt" übergeben, das dann befüllt wird. Wichtig ist hier, dass dieser Container vor dem Aufruf von $CMS_RENDER(...)$ definiert wird, damit er im entsprechenden aufrufenden Template zur Verfügung steht. Der Übersichtlichkeit halber macht man das am besten direkt vor dem Aufruf.

Beispiel:

$CMS_SET(set_result,[])$ $--Leere Liste als Container --$

$CMS_RENDER(script:"....",param1:...., param2:..., resultContainer:set_result)$

$CMS_VALUE(set_result.get(0)....)$

Im Script würde man dann einen entsprechenden Rückgabewert einfach in den übergebenen Container einfügen:

...

myResult=...

resultContainer.add(myResult);

Wenn man hier mit einer Map statt einer Liste als Container arbeitet kann man sogar mehrere Rückgabewerte bekommen - wichtig nist nur das auch alles entsprechend zu dokumentieren 😉

Kleiner Hinweis: Das direkte Setzen bzw. Definieren von Variablen "von unten nach oben" (also aus dem Script in den Seiten / Absatzkontext) ist - obwohl technisch möglich - im Gegensatz dazu nicht zu empfehlen, weil es den Code schlecht les- bzw. wartbar macht und (z.B. bei unbewusster Mehrfachverwendung eines Variablennamens einmal im Script und im Template) zu entsprechenden Seiteneffekten führen kann.

Viele Grüße

Michael

0 Kudos

Danke, damit ist meine Frage beantwortet Smiley Happy

Damit $CMS_RENDER$ dann nicht als Ausgabe "true" zurück gibt, muss man wohl noch das result Objekt überschreiben.

result.setValue("");

0 Kudos
mbergmann
Crownpeak employee

Ja, stimmt. Das hatte ich vergessen zu erwähnen 😉

0 Kudos

Hello Bergmann,

Thank you for your reply to the question and it is helpful for me.

But i am not getting return list value. I have completely explained down the issue for your reference.

FS-Version: Version: 5.2.200312.78911

In Page Template code :

$CMS_SET(set_result,[])$

$CMS_SET(set_lang, #global.language)$

         $CMS_RENDER(script:"pagestoresort", pageFolderElement:pt_folder.get(),resultContainer:set_result)$   // Calling Script                       

         $CMS_SET(set_result)$$CMS_RENDER(script:"pagestoresort", pageFolderElement:pt_folder.get(),resultContainer:set_result)$$CMS_END_SET$ // Not calling

             Return_Size: $CMS_VALUE(set_result.size())$

             RR$CMS_VALUE(set_result.get(0))$

                   $CMS_FOR(for_listValues, set_result)$

                               $CMS_VALUE(for_listValues)$                              

                   $CMS_END_FOR$

           $CMS_SET(set_page_folder, set_result.get(0))$                                                                                                

           $CMS_SET(set_image,set_page_folder.getFormData().get(set_lang, "pt_image_1").get())$                     

           $CMS_SET(set_headline,set_page_folder.getFormData().get(set_lang, "headline").get())$

Script Code:

Page lastUpdatedPage;

PageRefFolder siteStoreElement = context.getProperty("pageFolderElement");

List resultValue = context.getProperty("resultContainer");

..................

.........//code  inside// ......

.............................................

context.logInfo("**UID:**"+(lastUpdatedPage.getFormData().get(null,"pt_image_1").get()).getMedia().getUid());  

context.logInfo("**Page Class:**"+lastUpdatedPage.getClass());

resultValue.add(lastUpdatedPage);

context.logInfo("Result Return Size:"+resultValue.size());

result.setValue("");

Here problem is if i call the $CMS_RENDER()$ inside the $CMS_SET()$ it is not calling the script. If i call the $CMS_RENDER()$ out side the $CMS_SET()$ the specific script is called and i can see the log statements in the preview.

Below screenshot is outside of CMS_SET tag RENDERED script:

18.10.2020 17:34:10.722 INFO  (Script 'pagestoresort' (id=1107464) at 0, 0): **UID:**demo_image_a_16_9_hd_2x

18.10.2020 17:34:10.722 INFO  (Script 'pagestoresort' (id=1107464) at 0, 0): **Page Class:**class de.espirit.firstspirit.store.access.pagestore.PageImpl

18.10.2020 17:34:10.722 INFO  (Script 'pagestoresort' (id=1107464) at 0, 0): Result Return Size:1

Script_calling_log_without_cmsset.png

Script_type.png

RENDER is not calling inside if i place CMS_SET tag and  am not getting any results to HTML channel.

I am not sure what else i am missing here.. It will be helpful for me to resolve the problem.

Thanks and Regards,

Siva

0 Kudos