Dokumentation
Tree
Benötigt: Symcon >= 5.0
Erstellt einen Baum mit der Überschrift caption.
Die angezeigten Spalten werden in columns definert.
Initiale Einträge des Baumes können via values vorgegeben werden.

Allgemeine Parameter
| Parameter | Beschreibung |
|---|---|
| add (optional) | (default: false) Wenn true, dann wird unter der Tabelle ein "Hinzufügen"-Button eingeblendet, welcher dem Baum ein neues Element unter dem angewählten Knoten hinzufügt |
| caption (optional) | Sichtbare Beschriftung des Baumes |
| columns | Spalten des Baumes |
| delete (optional) | (default: false) Wenn true, dann wird hinter jedem Eintrag in des Baumes ein Button eingeblendet, welcher das entsprechende Element löscht |
| download (optional) | (default: "") Ist dieser Parameter nicht leer und beinhaltet die Ausgabe des onAdd, onDelete, onEdit, onExpand oder onSelectionChanged-Skriptes eine Data-URL, so wird die Rückgabe als Textdatei mit dem Namen das download-Parameters heruntergeladen. (ab Symcon 7.0) |
| form (optional) | (default: basierend auf den edit-Parametern von columns) Ein individuelles Formular zum Bearbeiten oder Hinzufügen von Zeilen. Die Definition des Formulars erfolg analog zur Definition des Formulars für Aktionen statisch oder als PHP-Code. Die Verwendung des Formulars funktioniert analog zum gleichnamigen Parameter der List (ab Symcon 7.0) |
| link (optional) | (default: false) Ist dieser Parameter true, dann wird die Ausgabe des onAdd, onDelete, onEdit, onExpand und onSelectionChanged-Skriptes als Link geöffnet. Ist er false, so wird die Ausgabe als Dialog im Konfigurationsformular angezeigt. (ab Symcon 6.0) |
| multiAdd (optional) | (default: true, falls onAdd und form nicht gesetzt sind und nur eine einzige editierbare Spalte mit einer Objektauswahl existiert, sonst false) Als Objektauswahl gelten die Typen SelectObject, SelectCategory, SelectEvent, SelectInstance, SelectLink, SelectMedia, SelectScript oder SelectVariable. Ist dieser Parameter true, so wird beim Hinzufügen direkt die Objektauswahl der ersten sichtbaren Spalte mit einer Objektauswahl geöffnet, in der mehrere Objekte gleichzeitig ausgewählt werden können. Für jedes gewählte Objekt wird ein Eintrag hinzugefügt, dessen weitere Werte ihren add-Wert erhalten und anschließend über den Dialog bearbeitet werden können, siehe List. Beim Hinzufügen mehrerer Objekte wird onAdd trotzdem nur ein mal ausgeführt. Ist dieser Parameter false, so wird beim Hinzufügen der Dialog geöffnet. Existiert jedoch nur eine einzige editierbare Spalte mit einer Objektauswahl und ist form nicht gesetzt, so wird stattdessen direkt die Objektauswahl für ein einzelnes Objekt geöffnet. (ab Symcon 9.1) |
| name (optional) | Name des Baumes |
| onAdd (optional) | (default: "") Skript, welches nach dem Hinzufügen eines Eintrages des Baumes ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden (Arrays werden ab Version 6.0 unterstützt). In dieser Ausführung bietet der Baum als Variablenwert nicht den aktuell ausgewählten Eintrag sondern den hinzugefügten Eintrag, siehe Verwendung des Bauminhaltes in on-Aktionen. Ansonsten hat es die gleichen Eigenschaften wie onClick des Button (ab Symcon 5.3) |
| onDelete (optional) | (default: "") Skript, welches nach dem Löschen eines Eintrages des Baumes ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden (Arrays werden ab Version 6.0 unterstützt). In dieser Ausführung bietet der Baum als Variablenwert nicht den aktuell ausgewählten Eintrag sondern den gelöschten Eintrag, siehe Verwendung des Bauminhaltes in on-Aktionen. Ansonsten hat es die gleichen Eigenschaften wie onClick des Button (ab Symcon 5.3) |
| onEdit (optional) | (default: "") Skript, welches nach der Bearbeitung eines Eintrages des Baumes ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden (Arrays werden ab Version 6.0 unterstützt). In dieser Ausführung bietet der Baum als Variablenwert nicht den aktuell ausgewählten Eintrag sondern den bearbeiteten Eintrag, siehe Verwendung des Bauminhaltes in on-Aktionen. Ansonsten hat es die gleichen Eigenschaften wie onClick des Button (ab Symcon 5.3) |
| onExpand (optional) | (default: "") Skript, welches nach der Ausklappen eines Eintrages des Baumes ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. In dieser Ausführung bietet der Baum als Variablenwert nicht den aktuell ausgewählten Eintrag sondern den ausgeklappten Eintrag, siehe Verwendung des Bauminhaltes in on-Aktionen. Ansonsten hat es die gleichen Eigenschaften wie onClick des Button (ab Symcon 6.4) |
| onSelectionChanged (optional) | (default: "") Skript, welches ausgeführt wird, nachdem der Benutzer per Klick oder Pfeiltaste einen anderen Eintrag des Baumes ausgewählt hat. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Der Baum bietet als Variablenwert den neu ausgewählten Eintrag. Beim Aufheben der Auswahl und bei einer Änderung der Werte per UpdateFormField wird das Skript nicht ausgeführt, siehe Auf die Auswahl reagieren. Ansonsten hat es die gleichen Eigenschaften wie onClick des Button (ab Symcon 9.1) |
| rowCount (optional) | (default: 0) sichtbare Anzahl von Zeilen; bei mehr Zeilen im Baum wird ein Scrollbalken eingeblendet - ist der Wert 0, so füllt der Baum den restlichen noch verfügbaren Platz im Instanzeditor. Nur ein Konfigurationselement kann den gesamten restlichen Platz erhalten. |
| sort (optional) | Sortierung des Baumes. Wird dies nicht gesetzt wird der Baum nach den Identifikatoren der Knoten sortiert |
| type | Tree |
| values (optional) | initiale Einträge des Baumes |
| visible (optional) | (default: true) Bei true ist der Baum sichtbar, ansonsten ist er unsichtbar (ab Symcon 5.2) |
| enabled (optional) | (default: true) Bei true kann der Baum verwendet werden, ansonsten wird er deaktiviert dargestellt (ab Symcon 6.0) |
| changeOrder (optional) | (default: false) Bei true kann die Reihenfolge der Einträge per Drag & Drop verändert werden. Die Sortierung des Baumes nach Spalten ist dann allerdings nicht möglich. (ab Symcon 6.0) |
| loadValuesFromConfiguration (optional) | (default: true) Dieser Parameter gibt an, ob der Baum mit den Werten der Eigenschaft gefüllt werden soll, siehe Speichern und Laden von Bäumen. Wird der Wert auf true gesetzt, so ist es für einen erfolgreichen Review im Module Store erforderlich, den Baum dennoch im Sinne des Benutzers zu füllen, siehe Reviewrichtlinien Punkt 13 (ab Symcon 6.0) |
Parameter für columns
| Parameter | Beschreibung |
|---|---|
| add (optional) | initialer Wert in dieser Spalte bei einem neu hinzugefügtem Eintrag, notwendig wenn add bei dem Baum auf true gesetzt ist. Alternativ kann ein Objekt übergeben werden, welches den Wert automatisch generiert, siehe Parameter für add (ab Symcon 9.1) |
| caption | Sichtbare Beschriftung einer Spalte |
| confirm (optional) | (default: "") Abfragetext, bevor eine onClick-Aktion ausgeführt wird. Nur wenn die Abfrage mit "Ja" bestätigt wird, wird die Aktion ausgeführt. Ist kein Abfragetext definiert, so wird die Aktion direkt ausgeführt (ab Symcon 5.2) |
| download (optional) | (default: "") Ist dieser Parameter nicht leer und beinhaltet die Ausgabe des onClick-Skriptes dieser Spalte eine Data-URL, so wird die Rückgabe als Textdatei mit dem Namen das download-Parameters heruntergeladen. (ab Symcon 7.1) |
| edit (optional) | Beschreibung eines editierbaren Elements |
| link (optional) | (default: false) Ist dieser Parameter true, dann wird die Ausgabe des onClick-Skriptes dieser Spalte als Link geöffnet. Ist er false, so wird die Ausgabe als Dialog im Konfigurationsformular angezeigt. (ab Symcon 7.1) |
| name | eindeutiger Name einer Spalte um diese zu referenzieren; der Name darf nicht "id", "parent", "expanded", "rowColor", "editable" oder "deletable" sein, da diese Werte für andere Funktionen belegt sind, siehe Parameter für values |
| onClick (optional) | (default: "") Skript, welches bei einem Klick auf ein Feld dieser Spalte ausgeführt wird. Es hat die gleichen Eigenschaften wie onClick des Button. Das Skript wird nur ausgeführt, sofern dieses Feld nicht leer, also 0, false oder "" ist (ab Symcon 5.2) |
| quickFilter (optional) | (default: false) Bei true wird der Text dieser Spalte beim Schnellfilter in der Suche betrachtet. Sollte der Wert bei allen Spalten auf false gesetzt sein, so wird der Schnellfilter ausgeblendet. (ab Symcon 7.2) |
| save (optional) | (default: true, falls das Element editierbar ist oder add ein Objekt zur automatischen Generierung ist, sonst false) Bei true sollen die Werte dieser Spalte als Modul-Eigenschaften gesichert werden, siehe Speichern und Laden von Bäumen |
| visible (optional) | (default: true) Bei false wird die Spalte nicht angezeigt |
| width | Breite der Spalte in Pixeln, als CSS-String (z.B. "100px"); genau eine Spalte muss den Wert "auto" haben, wodurch die Breite dieser Spalte den restlich verfügbaren Platz nutzt. Darüber hinaus werden an dieser Spalte die Erweiterungs-Symbole des Baumes dargestellt. |
Parameter für edit
| Parameter | Beschreibung |
|---|---|
| type | Typ der Darstellung, entsprechend der möglichen Eingaben: CheckBox, IntervalBox, NumberSpinner, PasswordTextBox, Select, SelectCategory, SelectColor, SelectEvent, SelectFile, SelectInstance, SelectLink, SelectMedia, SelectObject, SelectScript, SelectVariable, ValidationTextBox, List, Tree |
| Weitere Parameter | Die weiteren Parameter ergeben sich je nach gewähltem Typ; die Parameter "name" und "caption" des Typs werden ignoriert |
Wird der "type" List oder Tree verwendet, so wird der Wert dieser Spalte nicht noch einmal JSON-codiert. Es ist also lediglich erforderlich den Wert des übergeordneten Baumes einmalig zu parsen. Jede Unterliste bzw. Unterbaum steht dann direkt als Objekt zur Verfügung. Analog müssen die Werte in "values" auch nicht doppelt codiert werden.
Der Parameter "add" der Spalte wird entsprechend der Lokalisierung übersetzt, sofern der "type" von "edit" ValidationTextBox oder PasswordTextBox ist oder "edit" gar nicht gesetzt ist
Parameter für add
Statt eines festen Wertes kann der Parameter add einer Spalte auch ein Objekt sein, welches beschreibt, mit welcher Strategie der Wert für einen neu hinzugefügten Eintrag automatisch generiert wird (ab Symcon 9.1). Der Wert wird beim Hinzufügen des Eintrages generiert und anschließend wie ein regulärer Wert behandelt. Der generierte Wert ist innerhalb der Spalte eindeutig: Stimmt ein zufälliger Wert mit dem Wert eines bestehenden Eintrages überein, so wird ein neuer Wert generiert. Generierte Werte werden nicht übersetzt.
| Parameter | Beschreibung |
|---|---|
| strategy | Strategie der Generierung: "increment": Der höchste numerische Wert dieser Spalte über alle Einträge des Baumes wird um step erhöht. Nicht numerische Werte werden ignoriert. Existiert noch kein numerischer Wert, so wird start bzw. ohne start der Wert step verwendet. Ist start gesetzt, so wird nie ein Wert kleiner als start generiert (bei negativem step nie ein größerer) "random-string": Eine zufällige Zeichenkette aus den Zeichen a-z, A-Z und 0-9 mit der Länge length "random-integer": Eine zufällige ganze Zahl zwischen min und max "guid": Eine zufällige GUID (UUID Version 4), z.B. "{3F2504E0-4F89-4D3A-9A0C-0305E82C3301}" |
| step (optional) | (default: 1) Schrittweite, um welche der höchste Wert erhöht wird, nur für die strategy "increment"; muss eine Zahl ungleich 0 sein |
| start (optional) | Wert des ersten Eintrages und Untergrenze aller folgenden Werte (Obergrenze bei negativem step), nur für die strategy "increment"; muss eine Zahl sein |
| length (optional) | (default: 32) Anzahl der Zeichen der generierten Zeichenkette, nur für die strategy "random-string" |
| min (optional) | (default: 0) Untere Grenze (inklusive) der zufälligen ganzen Zahl, nur für die strategy "random-integer"; muss kleiner als max sein |
| max (optional) | (default: 2147483647) Obere Grenze (inklusive) der zufälligen ganzen Zahl, nur für die strategy "random-integer"; muss größer als min sein |
Damit generierte Werte erhalten bleiben, werden Spalten mit einem solchen add-Wert standardmäßig gespeichert, d.h. der Parameter "save" ist für diese Spalten standardmäßig true. Fehlt einem geladenen Eintrag der Wert in einer solchen Spalte, z.B. weil die Spalte nachträglich hinzugefügt wurde, so wird der Wert beim Laden nach der gleichen Strategie generiert. Auch der Standardwert, den on-Aktionen erhalten, wenn kein Eintrag ausgewählt ist, wird nach der Strategie generiert. Kann kein eindeutiger Wert generiert werden, weil bereits alle möglichen Werte verwendet werden, z.B. bei "random-integer" mit einem kleinen Bereich zwischen min und max, so schlägt das Hinzufügen mit einer Fehlermeldung fehl.
// Spalten mit automatisch generierten Werten
{
"caption": "ID",
"name": "ID",
"width": "50px",
"add": { "strategy": "increment", "step": 10 }
}, {
"caption": "Token",
"name": "Token",
"width": "auto",
"add": { "strategy": "random-string", "length": 16 },
"edit": { "type": "ValidationTextBox" }
}, {
"caption": "Zufallszahl",
"name": "Number",
"width": "100px",
"add": { "strategy": "random-integer", "min": 1, "max": 100 },
"edit": { "type": "NumberSpinner" }
}, {
"caption": "GUID",
"name": "GUID",
"width": "300px",
"add": { "strategy": "guid" }
}
Die strategy "increment" ermittelt den nächsten Wert aus den aktuellen Einträgen. Wird der Eintrag mit dem höchsten Wert gelöscht, so wird dessen Wert beim nächsten Hinzufügen erneut vergeben. Soll ein Wert nie wiederverwendet werden, z.B. weil er als dauerhafte ID gegenüber einem externen System dient, so kann sich das Modul den höchsten jemals vergebenen Wert merken und ihn über start vorgeben.
// Gelöschte IDs werden nicht erneut vergeben
public function GetConfigurationForm(): string
{
$form = json_decode(file_get_contents(__DIR__ . '/form.json'), true);
// Das Attribut HighestID wird in ApplyChanges auf den höchsten Wert der Liste aktualisiert, sinkt aber nie
$form['elements'][0]['columns'][0]['add'] = ['strategy' => 'increment', 'start' => $this->ReadAttributeInteger('HighestID') + 1];
return json_encode($form);
}
Parameter für sort
| Parameter | Beschreibung |
|---|---|
| column | Name der Spalte, nach welcher der Baum sortiert wird |
| direction | Die Richtung der Sortierung; "ascending" für eine aufsteigende Sortierung und "descending" für eine absteigende Sortierung |
Parameter für values
| Parameter | Beschreibung |
|---|---|
| deletable (optional) | (default: true) Bei false kann die Zeile nicht gelöscht werden (ab Symcon 5.4) |
| editable (optional) | (default: true) Bei false kann die Zeile nicht editiert werden, obwohl der Baum an sich editierbare Spalten besitzt (ab Symcon 5.4) |
| expanded (optional) | (default: false) Falls dieser Wert true ist, wird der Eintrag beim Laden des Konfigurationsformulares direkt ausgeklappt |
| id | Ein Identifikator, mit welchem der Eintrag in der Baumdarstellung als Elternknoten adressiert werden kann, id muss größer als 0 sein |
| parent (optional) | (default: 0) In diesem Feld kann die id eines Wertes gesetzt werden, welcher in der Baumdarstellung der Elternknoten von diesem Wert wird. Hiefür muss der Eltern-Wert im Array "values" vor dem Kind stehen. Ist "parent" 0, so wird das Element auf oberster Ebene eingefügt. |
| rowColor (optional) | (default: transparent) Hintergrundfarbe der Zeile als Hex-Code (z.B. Rot: "#ff0000" ), leerer String für Transparenz |
| icons (optional) | (default: {}) Icons können analog zur List verwendet werden. (ab Symcon 9.0) |
| Weitere Parameter (optional) | (default: "") Für jeden initialen Eintrag des Baumes werden hier die Werte zu allen Spalten definiert. Hierfür wird für jede Spalte ein Parameter mit dem Namen der Spalte eingetragen. Die Belegung des Parameters entspricht dem Wert dieser Spalte bei dem entsprechenden Eintrag. |
Speichern und Laden von Bäumen
Das Speichern und Laden von Bäumen erfolgt fast analog zu Listen.
In der Eigenschaft werden zusätzlich die Werte für id und parent gespeichert.
Beim Laden ist zu beachten, dass bei der Verwendung von values immer der Identifikator des Knotens angegeben werden muss, damit diese dem passenden Knoten aus der Eigenschaft zugewiesen werden können.
Verwendung des Bauminhaltes in on-Aktionen
Die Verwendung der Werte des Baumes in Skripten erfolgt analog zu Listen. Darüber hinaus beinhaltet jeder Eintrag den Wert "expanded", welcher angibt ob der Eintrag aktuell eingeklappt (false) oder ausgeklappt (true) ist.
Auf die Auswahl reagieren
Über den Parameter onSelectionChanged kann das Modul darauf reagieren, dass der Benutzer einen anderen Eintrag des Baumes auswählt (ab Symcon 9.1). Das Verhalten, die Anwendungsfälle und die Abgrenzung zum onClick einer Spalte entsprechen der List. Für den Baum gilt zusätzlich:
- Auch der Wechsel per Pfeiltaste links zum Elternknoten und per Pfeiltaste rechts zum ersten Kindknoten eines ausgeklappten Eintrages führt onSelectionChanged aus.
- Das Aus- und Einklappen eines Eintrages ändert die Auswahl nicht und führt nur onExpand aus. Wird dabei ein Eintrag verborgen, der ausgewählt ist, so wird die Auswahl ohne onSelectionChanged aufgehoben.
- Nach einer Änderung von values per UpdateFormField bleibt die Auswahl anhand der id des Eintrages erhalten.
- Oft stehen unterschiedliche Arten von Einträgen im Baum, z.B. Räume und Geräte. Anhand der Werte des ausgewählten Eintrages, z.B. $(Name des Baumes)['parent'] oder einer eigenen Spalte, kann das Skript unterscheiden, was ausgewählt wurde.
Beispiel: Ein Baum mit Räumen und Geräten. Wird ein Gerät ausgewählt, so wird sein Ort angezeigt und der Button "Status anzeigen" aktiviert. Wird ein Raum ausgewählt, so wird der Button deaktiviert.
// Beispiel: form.json
{
"actions": [
{
"type": "Tree",
"name": "Rooms",
"caption": "Räume und Geräte",
"rowCount": 6,
"columns": [
{ "caption": "Name", "name": "Name", "width": "auto", "add": "" },
{ "caption": "InstanceID", "name": "InstanceID", "width": "100px", "add": 0, "visible": false }
],
"values": [
{ "id": 1, "Name": "Wohnzimmer", "InstanceID": 0, "expanded": true },
{ "id": 2, "parent": 1, "Name": "Deckenlicht", "InstanceID": 12345 },
{ "id": 3, "Name": "Küche", "InstanceID": 0 },
{ "id": 4, "parent": 3, "Name": "Dunstabzug", "InstanceID": 23456 }
],
"onSelectionChanged": "ROOM_UISelectNode($id, $Rooms['InstanceID']);"
},
{ "type": "Label", "name": "NodeDetails", "caption": "Bitte ein Gerät auswählen" },
{
"type": "Button",
"name": "StatusButton",
"caption": "Status anzeigen",
"enabled": false,
"onClick": "ROOM_UIShowStatus($id, $Rooms['InstanceID']);"
}
]
}
// Beispiel: module.php
<?php
declare(strict_types=1);
class RoomOverview extends IPSModule
{
// onSelectionChanged des Baumes Rooms: Räume haben keine Instanz, nur Geräte
public function UISelectNode(int $InstanceID)
{
$isDevice = IPS_InstanceExists($InstanceID);
$this->UpdateFormField('NodeDetails', 'caption', $isDevice ? IPS_GetLocation($InstanceID) : 'Bitte ein Gerät auswählen');
$this->UpdateFormField('StatusButton', 'enabled', $isDevice);
}
// onClick des Buttons "Status anzeigen"
public function UIShowStatus(int $InstanceID)
{
if (!IPS_InstanceExists($InstanceID)) {
echo 'Bitte ein Gerät auswählen';
return;
}
echo (IPS_GetInstance($InstanceID)['InstanceStatus'] == IS_ACTIVE) ? 'Das Gerät ist aktiv' : 'Das Gerät ist nicht aktiv';
}
}
Beispiel
{
"type": "Tree",
"name": "Devices",
"caption": "Devices",
"rowCount": 5,
"add": true,
"delete": true,
"sort": {
"column": "Name",
"direction": "ascending"
},
"columns": [{
"caption": "InstanceID",
"name": "InstanceID",
"width": "75px",
"add": 0,
"edit": {
"type": "SelectInstance"
}
}, {
"caption": "Name",
"name": "Name",
"width": "auto",
"add": ""
}, {
"caption": "State",
"name": "State",
"width": "40px",
"add": "New!"
}, {
"caption": "Temperature",
"name": "Temperature",
"width": "75px",
"add": 20.0,
"edit": {
"type": "NumberSpinner",
"digits": 2
}
}],
"values": [{
"id": 1,
"InstanceID": 0,
"Name": "Kategorie",
"State": "",
"Temperature": 0
},{
"id": 2,
"parent": 1,
"InstanceID": 12435,
"Name": "ABCD",
"State": "OK!",
"Temperature": 23.31,
"rowColor": "#ff0000"
}]
}