fyf
I'm new here

CMS_INPUT_TRRESELECT - TREEDATA - Knoten (NODE) REKURSIVE SELEKTION - TNODE - TNODES

Jump to solution

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

Treedata-IMG.jpg

0 Kudos
1 Solution

Accepted Solutions

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-2.jpg

TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".

TNodes-1.jpg

Es gibt auch TNnode (.../espirit/firstspirit/service/treedata/TNode.html) de.espirit.firstspirit.service.treedata.TNode

TNode-1.jpg

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.

TNodes-1.jpg

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

View solution in original post

0 Kudos
3 Replies
pavone
I'm new here

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

0 Kudos

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

0 Kudos

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-2.jpg

TNodes hat die Variablen "int RECURSIVE" , "int SINGLE" und "int UNSELECTED".

TNodes-1.jpg

Es gibt auch TNnode (.../espirit/firstspirit/service/treedata/TNode.html) de.espirit.firstspirit.service.treedata.TNode

TNode-1.jpg

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.

TNodes-1.jpg

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

0 Kudos