« Zurück zu Produkt

Dokumentation

PopupAlert

Benötigt: Symcon >= 5.0

Enthält das Konfigurationsformular dieses Element, so wird es beim Laden der Konfigurationsseite geöffnet. Nachdem das Popup geschlossen wurde, ist es zusätzlich möglich dies mithilfe von Dynamik (visible auf true) erneut zu öffnen.

Beispiel

Allgemeine Parameter

Parameter Beschreibung
name (optional) Name des PopupAlert
popup Definition des zu öffnenden Popups (Parameter sind ab Symcon 6.1 änderbar durch Verknüpfung der Paramternamen, beispielsweise popup.closeCaption)
type PopupAlert
visible (optional) (default: true) Ist visible initial true, so wird das Popup beim Öffnen der Instanzkonfiguration geöffnet, ansonsten passiert nichts. Durch Änderung auf true kann das Popup im Nachhinein geöffnet werden. Eine Änderung auf false schließt ein aktuell geöffnetes Popup. (ab Symcon 5.2)

Parameter für popup

Parameter Beschreibung
buttons (optional) (default: []) Eine Liste von Buttons welche im Popup unten rechts dargestellt wird. An erster Stelle wird immer der Schließen-Button dargestellt, danach folgen die hier beschriebenen Buttons in Reihenfolge (ab Symcon 6.1)
caption (optional) (default: "") Sichtbarer Titel des Popups (ab Symcon 8.2)
closeCaption (optional) (default: "OK", bei mehreren (link: ./#Parameter_fuer_pages text: pages) "Abbrechen") Die Beschriftung des Schließen-Buttons unten rechts im Popup
initialPage (optional) (default: 0) Eine Referenz auf die Seite aus pages, welche beim Öffnen des Popups angezeigt werden soll. Dies kann eine Zahl sein, welche dem Index innerhalb der Liste pages entspricht, ein String, welcher dem Namen der Seite entspricht oder ein Skript, welches die Seite als Zahl oder String zurückgibt. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Existiert die definierte Seite nicht, so wird die erste Seite angezeigt. Eine Änderung von initialPage wirkt sich erst beim nächsten Öffnen des Popups aus. (ab Symcon 9.1)
items Auflistung von Formularfeldern im Popup (nicht änderbar). Alternativ kann PHP-Code als String oder Array aus Strings angegeben werden, welcher die Liste der Formularfelder per return zurückgibt (ab Symcon 9.1). Bei Nutzung von pages dient items als Standard für Seiten ohne eigene items und kann entfallen
pages (optional) (default: []) Eine Liste von Seiten des Popups welche miteinander verkettet werden können und so die Funktionalität eines Wizards zu ermöglichen. Ist die Liste leer, so wird der regulär definierte Inhalt angezeigt. Siehe Wizard (ab Symcon 9.1)
width (optional) (default: "") Initiale Breite des Popups in Pixel oder % als String, z.B. "40%" oder "250px". Prozentangaben beziehen sich auf die Breite des Browserfensters. Ist der Wert nicht gesetzt oder "", wird die Standardbreite verwendet (ab Symcon 9.0)

Parameter für pages

Das Feld pages beinhaltet eine Liste von Objekten, welche jeweils eine Seite beschreiben. Enthält die Liste mindestens zwei Seiten, so werden bei den Buttons ganz rechts zusätzlich "Zurück" und "Weiter" bzw. "OK" angezeigt, worüber die Seiten gewechselt werden können. Der Schließen-Button ist dann standardmäßig mit "Abbrechen" beschriftet. Für den zweiten Button wird "Weiter" angezeigt, falls die über nextPage bestimmte Seite existiert, ansonsten "OK", welches das Popup schließt. "Zurück" ist aktiv, falls die aktuelle Seite über "Weiter" erreicht wurde. Wurde dabei eine Seite verlassen, welche ein Skript für "onConfirm", aber keines für "onUndo" definiert hat, so ist "Zurück" deaktiviert und keine der vorherigen Seiten kann wieder erreicht werden. Enthält die Liste nur eine Seite, so wird diese ohne "Zurück" und "Weiter" wie ein reguläres Popup angezeigt. Anwendungsfälle, der genaue Ablauf und Beispiele sind im Abschnitt Wizard sowie ausführlich beim PopupButton beschrieben. Jedes dieser Objekte kann die folgenden Parameter nutzen:

Parameter Beschreibung
buttons (optional) (default: buttons von popup) Eine Liste von Buttons, welche angezeigt werden, solange diese Seite aktiv ist
caption (optional) (default: caption von popup) Sichtbarer Titel des Popups, solange diese Seite aktiv ist
items (optional) (default: items von popup) Auflistung von Formularfeldern der Seite. Alternativ kann PHP-Code als String oder Array aus Strings angegeben werden, welcher die Liste der Formularfelder per return zurückgibt. Der Code wird ausgeführt, wenn auf die Seite gewechselt wird, und kann so Inhalte abhängig von vorherigen Eingaben erzeugen. Siehe Werte und Skripte
name (optional) Ein eindeutiger Name zur Referenzierung, typischerweise für nextPage oder initialPage
nextPage (optional) (default: nächste Seite) Eine Referenz auf die Seite, welche bei Klick auf "Weiter" gezeigt werden soll. Dies kann eine Zahl sein, welche dem Index innerhalb der Liste pages entspricht, ein String, welcher dem Namen der Seite entspricht oder Skript, welches die nächste Seite als Zahl oder String zurückgibt. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Existiert die definierte Seite nicht, z.B. bei -1, so wird "OK" angezeigt und der Klick darauf schließt das Popup. Ein String, der keinem Namen einer Seite entspricht, wird als Skript ausgeführt. Ein Index muss vom Skript als Zahl zurückgegeben werden, ein zurückgegebener String wird immer als Name interpretiert. Das Skript wird beim Anzeigen der Seite und nach jeder Änderung eines Wertes erneut ausgeführt, damit die Beschriftung "Weiter" bzw. "OK" immer passt. Wird das Skript erneut gestartet, bevor eine vorherige Ausführung beendet ist, so gilt nur das Ergebnis der zuletzt gestarteten Ausführung
onConfirm (optional) (default: "") Skript das bei Betätigung von "Weiter" bzw. "OK" ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Sollte der Seitenwechsel durch validate verhindert werden, so wird onConfirm nicht ausgeführt. Eine Ausgabe des Skriptes wird als Meldung angezeigt, der Seitenwechsel findet trotzdem statt. Ist onConfirm ohne onUndo definiert, so ist nach dem Verlassen der Seite kein "Zurück" mehr möglich
onUndo (optional) (default: "") Skript das bei Rückkehr auf diese Seite über "Zurück" ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Es sollte die Änderungen des onConfirm dieser Seite rückgängig machen. Die Formularfelder der Seite stehen dabei mit den Werten zur Verfügung, die sie beim Verlassen der Seite hatten. Nur ein nicht-leeres onUndo ermöglicht die Rückkehr auf eine Seite mit onConfirm. "onUndo": "" verhält sich wie ein fehlendes onUndo. Gibt es nichts rückgängig zu machen, soll "Zurück" aber möglich bleiben, so genügt ein Kommentar, z.B. "onUndo": "// Nichts rückgängig zu machen"
validate (optional) (default: "") Skript das bei Betätigung von "Weiter" bzw. "OK" ausgeführt wird, nachdem die Formularfelder der Seite gültig sind, z.B. entsprechend validate einer ValidationTextBox. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Gibt das Skript per return einen nicht-leeren String zurück, so wird dieser als Fehler angezeigt und es findet kein Seitenwechsel statt und onConfirm wird nicht ausgeführt. Der String wird über die Übersetzungen des Moduls übersetzt. Das Skript darf keine Ausgabe, z.B. per echo, machen

Die Parameter closeCaption und width gelten immer für das gesamte Popup und können nicht je Seite festgelegt werden.

Parameter für buttons

Parameter Beschreibung
caption Sichtbare Beschriftung des Buttons
onClick Skript, welches bei einem Klick auf den Button ausgeführt wird. Sofern das Skript aus mehreren Zeilen besteht, können die einzelnen Zeilen auch als Array übergeben werden. Es sind keine PHP-Tags erforderlich. Es hat die gleichen Eigenschaften wie onClick des Button. Sofern das Skript keine Ausgabe macht, wird das Popup nach Abarbeitung des Skriptes geschlossen. Ansonsten wird die Ausgabe als rote Fehlermeldung unten im Popup angzeigt. Eine Ausnahme besteht hier wenn die Rückgabe mit dem Präfix "MESSAGE:" beginnt. In diesem Fall wird das Popup geschlossen und die Rückgabe hinter dem Präfix in einem Meldungsdialog angezeigt.
enabled (optional) (default: true) Bei true kann der Button verwendet werden, ansonsten wird er deaktiviert dargestellt

Wizard

Über den Parameter pages wird aus dem Popup ein Wizard (Assistent), welcher den Benutzer Schritt für Schritt durch einen Vorgang führt (ab Symcon 9.1). Die Seiten verhalten sich beim PopupAlert genauso wie beim PopupButton. Anwendungsfälle, der Ablauf beim Weiter, Zurück und Abbrechen, die verfügbaren Variablen, das Steuern des Seitenwechsels, Hinweise und weitere Beispiele sind beim PopupButton beschrieben.

Im Unterschied zum PopupButton wird der PopupAlert ohne Klick des Benutzers geöffnet:

  • Ist visible beim Laden des Konfigurationsformulars true, so wird der Wizard sofort geöffnet. Setzt GetConfigurationForm visible abhängig von der Konfiguration, so erscheint der Wizard genau dann, wenn die Instanz noch eingerichtet werden muss.
  • Das Modul kann den Wizard jederzeit per UpdateFormField über visible öffnen, z.B. über einen Button "Einrichtung starten", und mit false schließen. Der Wizard beginnt dabei jeweils auf der Seite, die über initialPage bzw. popup.initialPage festgelegt ist. Das gilt auch, wenn der Wizard bereits geöffnet ist: Setzt das Modul zuerst popup.initialPage und anschließend visible auf true, so wechselt der Wizard auf diese Seite, z.B. per $this->UpdateFormField('SetupWizard', 'popup.initialPage', 'settings') und $this->UpdateFormField('SetupWizard', 'visible', true). Die Eingaben bleiben erhalten, "Zurück" ist danach deaktiviert.

Einrichtungsassistent

Ein bewährtes Muster für die Einrichtung eines Moduls:

  • Der Wizard steht unter actions und wird in GetConfigurationForm sichtbar geschaltet, solange eine benötigte Eigenschaft nicht gesetzt ist.
  • Die erste Seite begrüßt den Benutzer und fragt über eine RadioButtonGroup, wie die Einrichtung erfolgen soll. Die Werte der Optionen entsprechen den Namen der folgenden Seiten, sodass nextPage die Auswahl direkt zurückgeben kann. Eine Option erlaubt es, die Einrichtung zu überspringen.
  • Eine Seite zeigt das Ergebnis einer Suche an. Ihre items werden per PHP-Code vom Modul erzeugt, sodass die Suche bei jedem Wechsel auf die Seite erneut ausgeführt wird.
  • Das onConfirm der letzten Einstellungsseite schreibt die Werte per UpdateFormField in die Felder des Konfigurationsformulars. Der Benutzer sieht das Ergebnis und speichert es mit "Änderungen übernehmen". Das onUndo setzt die Felder wieder auf die gespeicherten Werte zurück.
  • Am Ende der Liste stehen Abschlussseiten, welche über ihren Namen angesprungen werden: eine Zusammenfassung und ein Hinweis beim Überspringen. Die Zusammenfassung beendet den Wizard per "nextPage": -1, da die Seite zum Überspringen noch folgt.
  • Ein Button unter actions öffnet den Wizard erneut.

Beispiel: Einrichtungsassistent für ein Gerät im Netzwerk. Solange die Eigenschaft Host leer ist, öffnet sich der Wizard beim Öffnen der Instanzkonfiguration.

// Beispiel: form.json
{
    "elements": [
        { "type": "ValidationTextBox", "name": "Host", "caption": "Host" },
        { "type": "NumberSpinner", "name": "Interval", "caption": "Aktualisierungsintervall", "suffix": "Sekunden", "minimum": 10 }
    ],
    "actions": [
        {
            "type": "Button",
            "caption": "Einrichtung starten",
            "onClick": "SET_UIOpenWizard($id);"
        },
        {
            "type": "PopupAlert",
            "name": "SetupWizard",
            "visible": false,
            "popup": {
                "caption": "Einrichtung",
                "width": "600px",
                "pages": [
                    {
                        "caption": "Willkommen",
                        "items": [
                            { "type": "Label", "caption": "Dieser Assistent richtet die Verbindung zum Gerät ein." },
                            {
                                "type": "RadioButtonGroup",
                                "name": "WizardStart",
                                "caption": "Wie soll das Gerät gefunden werden?",
                                "value": "search",
                                "options": [
                                    { "caption": "Im Netzwerk suchen", "value": "search" },
                                    { "caption": "Adresse manuell eingeben", "value": "manual" },
                                    { "caption": "Einrichtung überspringen", "value": "skip" }
                                ]
                            }
                        ],
                        "nextPage": "return $WizardStart;"
                    },
                    {
                        "name": "search",
                        "caption": "Gefundene Geräte",
                        "items": "return json_decode(SET_UIGetSearchItems($id), true);",
                        "validate": "if (($WizardFoundHost ?? '') == '') { return 'Bitte ein Gerät auswählen'; }",
                        "nextPage": "settings"
                    },
                    {
                        "name": "manual",
                        "caption": "Adresse",
                        "items": [
                            { "type": "ValidationTextBox", "name": "WizardManualHost", "caption": "Host", "validate": "^[a-zA-Z0-9.:-]+$" }
                        ]
                    },
                    {
                        "name": "settings",
                        "caption": "Einstellungen",
                        "items": [
                            { "type": "NumberSpinner", "name": "WizardInterval", "caption": "Aktualisierungsintervall", "suffix": "Sekunden", "value": 60 }
                        ],
                        "validate": "if ($WizardInterval < 10) { return 'Das Intervall muss mindestens 10 Sekunden betragen'; }",
                        "onConfirm": "SET_UIApply($id, ($WizardStart == 'search') ? ($WizardFoundHost ?? '') : $WizardManualHost, $WizardInterval);",
                        "onUndo": "SET_UIRevert($id);",
                        "nextPage": "summary"
                    },
                    {
                        "name": "summary",
                        "caption": "Fertig",
                        "items": [
                            { "type": "Label", "caption": "Die Einstellungen wurden in das Konfigurationsformular eingetragen. Bitte mit \"Änderungen übernehmen\" speichern." }
                        ],
                        "nextPage": -1
                    },
                    {
                        "name": "skip",
                        "caption": "Einrichtung übersprungen",
                        "items": [
                            { "type": "Label", "caption": "Ohne Host ist die Instanz nicht funktionsfähig. Die Einrichtung kann jederzeit über \"Einrichtung starten\" fortgesetzt werden." }
                        ]
                    }
                ]
            }
        }
    ]
}
// Beispiel: module.php
<?php

declare(strict_types=1);

class SetupWizardDevice extends IPSModule
{
    public function Create()
    {
        //Never delete this line!
        parent::Create();

        $this->RegisterPropertyString('Host', '');
        $this->RegisterPropertyInteger('Interval', 60);
    }

    public function GetConfigurationForm()
    {
        $form = json_decode(file_get_contents(__DIR__ . '/form.json'), true);
        // Der Wizard öffnet sich automatisch, solange die Instanz nicht eingerichtet ist
        $form['actions'][1]['visible'] = ($this->ReadPropertyString('Host') == '');
        return json_encode($form);
    }

    // Button "Einrichtung starten"
    public function UIOpenWizard()
    {
        $this->UpdateFormField('SetupWizard', 'visible', true);
    }

    // items der Seite "search": Wird bei jedem Wechsel auf die Seite ausgeführt
    public function UIGetSearchItems(): string
    {
        // In einem echten Modul werden die Geräte hier z.B. per DNS-SD gesucht
        $devices = ['192.168.1.20' => 'Gerät im Wohnzimmer', '192.168.1.21' => 'Gerät im Keller'];

        if (count($devices) == 0) {
            return json_encode([
                ['type' => 'Label', 'caption' => 'Es wurde kein Gerät gefunden. Bitte zurückgehen und die Adresse manuell eingeben.']
            ]);
        }
        $options = [];
        foreach ($devices as $host => $name) {
            $options[] = ['caption' => $name . ' (' . $host . ')', 'value' => $host];
        }
        return json_encode([
            ['type' => 'Select', 'name' => 'WizardFoundHost', 'caption' => 'Gerät', 'options' => $options, 'value' => $options[0]['value']]
        ]);
    }

    // onConfirm der Seite "settings": Trägt die Werte in das Konfigurationsformular ein
    public function UIApply(string $Host, int $Interval)
    {
        $this->UpdateFormField('Host', 'value', $Host);
        $this->UpdateFormField('Interval', 'value', $Interval);
    }

    // onUndo der Seite "settings": Stellt die gespeicherten Werte wieder her
    public function UIRevert()
    {
        $this->UpdateFormField('Host', 'value', $this->ReadPropertyString('Host'));
        $this->UpdateFormField('Interval', 'value', $this->ReadPropertyInteger('Interval'));
    }
}

Beispiel

{
    "type": "PopupAlert",
    "popup": {
        "closeCaption": "I understand",
        "items": [
            {
               "type": "Label",
               "caption": "Be careful when configuring this instance. Even small changes can have significant impact!"
            }
        ]
    }
},
{
    "type": "PopupAlert",
    "popup": {
        "items": [
            {
                 "type": "SelectVariable",
                 "name": "VariableActionTest",
                 "caption": "Some Action Variable"
            }
        ]
    }
},
{
    "type": "PopupAlert",
    "popup": {
        "caption": "Ein Titel, der nie gesehen wird, da jede Seite ihn überschreibt",
        "closeCaption": "Schließe Dialog",
        "items": [
            {
                "type": "Label",
                "caption": "Dieses Element wird nie gesehen, da jede Seite ihre eigenen items hat"
            }
        ],
        "pages": [
            {
                "caption": "Start",
                "items": [
                    {
                        "type": "Label",
                        "caption": "Nächste Seite: Auswahl"
                    }
                ],
                "nextPage": 2
            },
            {
                "caption": "Nie sichtbar",
                "items": [
                    {
                        "type": "Label",
                        "caption": "Diese Seite wird nie angezeigt, da die Startseite direkt auf die Seite mit Index 2 springt, die Auswahl"
                    }
                ]
            },
            {
                "caption": "Auswahl",
                "items": [
                    {
                        "type": "Select",
                        "name": "NextPage",
                        "options": [
                            {"value": "page1", "caption": "Gehe zu Seite 1"},
                            {"value": "page2", "caption": "Gehe zu Seite 2"},
                            {"value": "close", "caption": "Fertig, schließen"}
                        ],
                        "caption": "Wähle nächste Seite"
                    }
                ],
                "nextPage": "return $NextPage;"
            },
            {
                "name": "page1",
                "caption": "Seite 1",
                "items": [
                    {
                        "type": "Label",
                        "caption": "Dies ist Seite 1 mit 'Undo'"
                    }
                ],
                "onUndo": "echo 'Seite 1 rückgängig machen';",
                "onConfirm": "echo 'Seite 1 bestätigen';"
            },
            {
                "name": "page2",
                "caption": "Seite 2",
                "items": [
                    {
                        "type": "Label",
                        "caption": "Dies ist Seite 2, es gibt kein 'Undo'. Dies ist auch die letzte Seite des Wizards."
                    }
                ],
                "onConfirm": "echo 'Seite 2 bestätigen';"
            }
        ]
    }
}
Haben Sie noch Fragen?