Search the FirstSpirit Knowledge Base
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
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
Hilft dieser Link? Mit CMS_SET Rückgabewert setzen
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
Danke, damit ist meine Frage beantwortet
Damit $CMS_RENDER$ dann nicht als Ausgabe "true" zurück gibt, muss man wohl noch das result Objekt überschreiben.
result.setValue("");
Ja, stimmt. Das hatte ich vergessen zu erwähnen 😉
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
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