- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
CMS_INPUT_TRRESELECT - TREEDATA - Knoten (NODE) REKURSIVE SELEKTION - TNODE - TNODES
Hallo liebe Community,
eine Frage an euch ๐
wie kann ich in FirstSpirit 4.2 , bei der Verwendung von TREEDATA , erkennen, das es sich um eine einfache Selektion oder eine rekursive selektion im Fall eines selektierten Ordner? Geht das รผberhaupt ? Wenn Ja, wie?
Hier ist mein Code, der funktioniert, aber es fehlt mir eine Unterscheidung:
//FORMULAR KANAL
<CMS_INPUT_TREESELECT name="pt_tree" allowEmpty="no" hFill="yes" provider="Tree">
<LANG>... Label ... usw...
<CMS_INPUT_TREESELECT>
//HTML-Kanal
$CMS_IF(!pt_tree.isEmpty)$
$CMS_FOR(node,pt_tree.keySet)$ $CMS_IF(node.hasChildren())$
$CMS_FOR(child, node.getChildren())$
$CMS_VALUE(child)$ // OK, wenn der Ordner selektiert ist (1 oder Doppelt Selektiert)
$CMS_END_FOR$
$CMS_ELSE$
$CMS_VALUE(node)$ // OK, nur die einfache Selektion fรผr ein Blatt-Knoten
$CMS_END_IF$
$CMS_END_FOR$
$CMS_END_IF$
Nun jeder Wert wird ausgegeben
wenn selectiert wird. Nun in der TREEDATA Dokumentation (SIEHE ANHANG), es gibt Doppelt-Selektion fรผr eine Rekursive Auswahl und eine einfacher Auswahl Bei der Abholung von Kindern, mรถchte ich unterscheiden, wenn es um eine Rekursive Auswahl geht und wenn es um eine einfache Auswahl geht. Bei Einfache Auswahl, bekomme ich auch rekursive Kinder, das ist nicht Ok. Ich mรถchte dann unterscheiden, wenn es NUR einmal selektiert wird, dann hole ich seine direkte Kinder, wenn es dann doppelt selektiert wird, hole ich die Kinder aus dem gesamten selektierten Teilbaum. Danke fรผr euer Hilfe
- Labels:
-
Developers
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Community,
Hallo Tim,
Hallo Sebastian,
sorry, ich war lange Hauรerhaus und hatte kein Zugriff auf FirstSpirit, deswegen beantworte ich erst spรคt.
Ich hbae hier untern meine Ansรคtze angelegt, es gibt bestimmt, andere Alternative, aber zu mindesten hier ist mein Ansatz. Sollte eine bessere Varainte von irgendjemandem geben, wรผrde ich mich freuen die Alternative zu kennen.
Hier ist diue Lรถsung zu dem Problem: In dem API, gibt es "TNodes" (.../espirit/firstspirit/service/treedata/editor/TNodes.html) de.espirit.firstspirit.service.treedata.editor.TNodes TNodes ist ein Map. "Map" fรผr "Map" (https://docs.oracle.com/javase/7/docs/api/java/util/Map.html).
TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".
Es gibt auch TNnode (.../espirit/firstspirit/service/treedata/TNode.html) de.espirit.firstspirit.service.treedata.TNode
Es gibt Zwei alternative wie ich versucht habe, das Problem zu lรถsen. Die zweite Alternative war mir besser. 1)
Alternative 1: In dem Template die Verschachtelung bauen ohne zu merken ob es rekursive oder nicht rekursive3 ist, dafรผr musste ich nur immer prรผfen oder das Selektierten Knoten ein Blatt ist oder nicht, sollte er kein Blatt sein, prรผfe ich ob er Kinder-Knoten, bis auf Blรคtter-Knoten, um diese zu holen. Noch ein Problem hier war, dass ich genau nicht unterscheiden kann, wenn den selektierten Vater RECURSIVE oder SINGLE selektiert wurde. Diese Alternative war mir ungรผnstig, deswegen wollte ich das im Skript auslagern, um die Bearbeitung dort zu machen und einfach die Daten in dem Template "HTML-Kanal auslesen", da die Dekalration des Komponentes bleibt unverรคndert wir in meinem obigen Post. 2)
Alternative 2. Der grund eigentlich warum ich dieser Post erstellt habe. Die Daten im Skript bearbeiten oder auslesen, mit dem Skript.Typ "Vorlage", und dieses Skript einfach in dem Template einbinden. Dies vermeidet, dass ich viel Kommische Code Verschachtelung in dem Template schreiben muss, wenn ich immer Tief in einem Baum schauen muss, wie in der Alternative (1). Dazu kรถnnte ich in deiser Variante merken, ob es sich um SINGLE oder RECURSIVE Selektieren handeln.
######### BEGIN ALTERNATIVE 1 ###############
Beispiel zu dem ALternative 1- Ergebnis in dem Template auslesen:
/*merke ich ob ein Vater hat kinder, aber nicht ob dieses Vater RECURSIVE selektiert wurde oder SINGLE selektiert wurde
*/
$CMS_FOR(node, pt_tree.keySet)$
$CMS_IF(node.hasChildren())$
$CMS_FOR(c, node.getChildren)$
$CMS_IF(c.hasChildren())$
$CMS_FOR(x, c.getChildren)$
$CMS_IF(!x.hasChildren())$
$CMS_VALUE(x.getLabel(#global.language.locale))$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_ELSE$
$CMS_VALUE(c.getLabel(#global.language.locale)))$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_ELSE$
$CMS_VALUE(node.getLabel(#global.language.locale))$
$CMS_END_IF$
$CMS_END_FOR$
######### ENDE ALTERNATIVE 1 ###############
Beispiel ALternative 2 , im Skript:
Fรผr mein im Template eingegebene "pt_tree",hole ich erstmal den gesamten Set-Werte fรผr alle(oder fรผr den) selektierten Knoten-ORDNER/Vater-KNoten(weil, fรผr Blatt-Knoten TNode ist sowieso einfache Selektion), also my EntrySet. TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".
In dem API, es gibt die "Contant Field Values", dort sind dann die Werte fรผr RECURSIVE (2), SINGLE (1) und UNSELECTED (0) zu finden, was mir eigentlich gefehlt hatte. public static final int RECURSIVE 2 public static final int SINGLE 1 public static final int UNSELECTED 0 Das war dann der Schlรผssel zu meinem Problem.
Hier ein Schnitt meines Codes:
######### BEGIN ALTERNATIVE 2 ###############
//hole mir hier die Daten aus dem selektieren Baum Knoten im Template รผber den Context
pt_tree = context.getProperty("pt_tree");
dataValue = context.getVariableValue("pt_tree");
editorValue = dataValue;
for(entry: editorValue.entrySet())
{
if(entry.value == 2)
{
//hier kann ich dann auf die Knoten mit RECURSIVE Selektion zugreiffen, Gilt NUR fรผr Vรคter-Knoten
/ /Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
//...
}
else if(entry.value == 1)
{
/*hier kann ich dann auf die Knoten mit SINGLE Selektion zugreiffen, egal ob Vรคtter- Knoten oder Blรคtter-Knoten . Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
*/
//...
}
else
{
// Fall von unselektierten Knoten //Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
//...
}
}
/*
hier am Ende der Beabeiung, lade das Ergebnis in einer (oder mehrere) Varaible(n), die ich dann im HTML-Kanal brauchen werden.
*/
//Hier ist der Beipiel fรผr die gesamten selektireten Knoten
context.getPageContext().setVariableValue("myVariable",allSelektedNodes);
//Ende des Skripts
---------------------------------------------------------------------------------------------------------
Mein Skript habe ich dann im Html- Kanal des Templates รผber
'$CMS_RENDER(script:"skriptEindeutigerName")' gebunden:
$-- Wir sind hier im Template HTML-Kanal --$
$CMS_RENDER(script:"skriptEindeutigerName")$
$CMS_SET(myValues, #global.pageContext.getVariableValue("myVariable"))$
$CMS_FOR(result, myValues)$
$CMS_VALUE(result.getLabel(#global.language.locale))$
$CMS_END_FOR$
######### ENDE ALTERNATIVE 2 ###############
Ich hoffe, dass dieser Ansatz, irgendwann mal jemandem helfen wird.
Danke und beste Grรผรe
Fabrice
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Fabrice,
in Kapitel 4.2.4 der Dokumentation heiรt es
Der Unterschied zwischen der einfachen und der rekursiven Auswahl liegt lediglich in einem zusรคtzlichen Attribut, das bei einer rekursiven Auswahl gespeichert wird, z.B.:
Element A โ einfache Auswahl โ es wird der Wert A gespeichert.
Element B โ rekursive Auswahl โ es wird der Wert B* gespeichert.
Hilft dir das womรถglich weiter?
Viele Grรผรe
Tim
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Fabrice,
benรถtigst Du noch weitere Hilfe oder hat Dir Tims Antwort geholfen? In diesem Fall wรคre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lรถsung gefunden haben, wรคre es nett, wenn Du diese hier bereitstellst.
Viele Grรผรe,
Sebastian
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Community,
Hallo Tim,
Hallo Sebastian,
sorry, ich war lange Hauรerhaus und hatte kein Zugriff auf FirstSpirit, deswegen beantworte ich erst spรคt.
Ich hbae hier untern meine Ansรคtze angelegt, es gibt bestimmt, andere Alternative, aber zu mindesten hier ist mein Ansatz. Sollte eine bessere Varainte von irgendjemandem geben, wรผrde ich mich freuen die Alternative zu kennen.
Hier ist diue Lรถsung zu dem Problem: In dem API, gibt es "TNodes" (.../espirit/firstspirit/service/treedata/editor/TNodes.html) de.espirit.firstspirit.service.treedata.editor.TNodes TNodes ist ein Map. "Map" fรผr "Map" (https://docs.oracle.com/javase/7/docs/api/java/util/Map.html).
TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".
Es gibt auch TNnode (.../espirit/firstspirit/service/treedata/TNode.html) de.espirit.firstspirit.service.treedata.TNode
Es gibt Zwei alternative wie ich versucht habe, das Problem zu lรถsen. Die zweite Alternative war mir besser. 1)
Alternative 1: In dem Template die Verschachtelung bauen ohne zu merken ob es rekursive oder nicht rekursive3 ist, dafรผr musste ich nur immer prรผfen oder das Selektierten Knoten ein Blatt ist oder nicht, sollte er kein Blatt sein, prรผfe ich ob er Kinder-Knoten, bis auf Blรคtter-Knoten, um diese zu holen. Noch ein Problem hier war, dass ich genau nicht unterscheiden kann, wenn den selektierten Vater RECURSIVE oder SINGLE selektiert wurde. Diese Alternative war mir ungรผnstig, deswegen wollte ich das im Skript auslagern, um die Bearbeitung dort zu machen und einfach die Daten in dem Template "HTML-Kanal auslesen", da die Dekalration des Komponentes bleibt unverรคndert wir in meinem obigen Post. 2)
Alternative 2. Der grund eigentlich warum ich dieser Post erstellt habe. Die Daten im Skript bearbeiten oder auslesen, mit dem Skript.Typ "Vorlage", und dieses Skript einfach in dem Template einbinden. Dies vermeidet, dass ich viel Kommische Code Verschachtelung in dem Template schreiben muss, wenn ich immer Tief in einem Baum schauen muss, wie in der Alternative (1). Dazu kรถnnte ich in deiser Variante merken, ob es sich um SINGLE oder RECURSIVE Selektieren handeln.
######### BEGIN ALTERNATIVE 1 ###############
Beispiel zu dem ALternative 1- Ergebnis in dem Template auslesen:
/*merke ich ob ein Vater hat kinder, aber nicht ob dieses Vater RECURSIVE selektiert wurde oder SINGLE selektiert wurde
*/
$CMS_FOR(node, pt_tree.keySet)$
$CMS_IF(node.hasChildren())$
$CMS_FOR(c, node.getChildren)$
$CMS_IF(c.hasChildren())$
$CMS_FOR(x, c.getChildren)$
$CMS_IF(!x.hasChildren())$
$CMS_VALUE(x.getLabel(#global.language.locale))$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_ELSE$
$CMS_VALUE(c.getLabel(#global.language.locale)))$
$CMS_END_IF$
$CMS_END_FOR$
$CMS_ELSE$
$CMS_VALUE(node.getLabel(#global.language.locale))$
$CMS_END_IF$
$CMS_END_FOR$
######### ENDE ALTERNATIVE 1 ###############
Beispiel ALternative 2 , im Skript:
Fรผr mein im Template eingegebene "pt_tree",hole ich erstmal den gesamten Set-Werte fรผr alle(oder fรผr den) selektierten Knoten-ORDNER/Vater-KNoten(weil, fรผr Blatt-Knoten TNode ist sowieso einfache Selektion), also my EntrySet. TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".
In dem API, es gibt die "Contant Field Values", dort sind dann die Werte fรผr RECURSIVE (2), SINGLE (1) und UNSELECTED (0) zu finden, was mir eigentlich gefehlt hatte. public static final int RECURSIVE 2 public static final int SINGLE 1 public static final int UNSELECTED 0 Das war dann der Schlรผssel zu meinem Problem.
Hier ein Schnitt meines Codes:
######### BEGIN ALTERNATIVE 2 ###############
//hole mir hier die Daten aus dem selektieren Baum Knoten im Template รผber den Context
pt_tree = context.getProperty("pt_tree");
dataValue = context.getVariableValue("pt_tree");
editorValue = dataValue;
for(entry: editorValue.entrySet())
{
if(entry.value == 2)
{
//hier kann ich dann auf die Knoten mit RECURSIVE Selektion zugreiffen, Gilt NUR fรผr Vรคter-Knoten
/ /Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
//...
}
else if(entry.value == 1)
{
/*hier kann ich dann auf die Knoten mit SINGLE Selektion zugreiffen, egal ob Vรคtter- Knoten oder Blรคtter-Knoten . Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
*/
//...
}
else
{
// Fall von unselektierten Knoten //Den erfolgt wie im Fall Alternative 1, nur mit einem anderen Syntax
//...
}
}
/*
hier am Ende der Beabeiung, lade das Ergebnis in einer (oder mehrere) Varaible(n), die ich dann im HTML-Kanal brauchen werden.
*/
//Hier ist der Beipiel fรผr die gesamten selektireten Knoten
context.getPageContext().setVariableValue("myVariable",allSelektedNodes);
//Ende des Skripts
---------------------------------------------------------------------------------------------------------
Mein Skript habe ich dann im Html- Kanal des Templates รผber
'$CMS_RENDER(script:"skriptEindeutigerName")' gebunden:
$-- Wir sind hier im Template HTML-Kanal --$
$CMS_RENDER(script:"skriptEindeutigerName")$
$CMS_SET(myValues, #global.pageContext.getVariableValue("myVariable"))$
$CMS_FOR(result, myValues)$
$CMS_VALUE(result.getLabel(#global.language.locale))$
$CMS_END_FOR$
######### ENDE ALTERNATIVE 2 ###############
Ich hoffe, dass dieser Ansatz, irgendwann mal jemandem helfen wird.
Danke und beste Grรผรe
Fabrice