Parse Error nach ReloadForm im Konfigurator

Hallo zusammen,

ich scheitere an einem Parse Error bei der Nutzung von ReloadForm im Konfigurator und hoffe, ihr könnt mir einen Schubs in die richtige Richtung geben.

Ziel: Ein Select-Feld soll sich dynamisch füllen, sobald in einem SelectVariable-Feld eine Variable ausgewählt wird.

Problem: Sobald ich eine Variable auswähle, löst onChange: „ReloadForm“ aus und das Formular bricht mit Parse error: syntax error, unexpected end of file in /- on line 5 zusammen. Das deutet darauf hin, dass GetConfigurationForm() ein fehlerhaftes JSON zurückgibt, aber ich sehe den Fehler im Code einfach nicht.

Hier ist mein minimales Test-Setup, das den Fehler reproduziert:

form.json

{
    "elements": [
        {
            "type": "SelectVariable",
            "name": "SourceVariableID",
            "caption": "Quell-Variable",
            "onChange": "ReloadForm"
        },
        {
            "type": "Select",
            "name": "TriggerType",
            "caption": "Auslöser-Art",
            "options": []
        }
    ]
}

module.php

<?php
declare(strict_types=1);
class DelayedEvent extends IPSModule
{
    public function Create()
    {
        parent::Create();
        $this->RegisterPropertyInteger('SourceVariableID', 0);
        $this->RegisterPropertyInteger('TriggerType', 0);
    }

    public function ApplyChanges()
    {
        parent::ApplyChanges();
    }

    public function GetConfigurationForm()
    {
        $form = json_decode(file_get_contents(__DIR__ . '/form.json'), true);
        $sourceID = $this->ReadPropertyInteger('SourceVariableID');
        
        $options = [];
        if ($sourceID > 0 && @IPS_ObjectExists($sourceID)) {
            $options[] = ['label' => 'Variable ausgewählt!', 'value' => 1];
        } else {
            $options[] = ['label' => 'Bitte zuerst eine Variable wählen', 'value' => 0];
        }

        foreach ($form['elements'] as &$element) {
            if (isset($element['name']) && $element['name'] === 'TriggerType') {
                $element['options'] = $options;
                break;
            }
        }
        unset($element);

        return json_encode($form);
    }
}

Ich habe dazu einiges im Forum gelesen und auch in der Doku und komme leider selbst nicht auf den Trichter.

Was übersehe ich bei der korrekten Verwendung von ReloadForm in Kombination mit GetConfigurationForm?

Danke für eure Hilfe!

Das ist kein gültiges PHP. In onChange muss ein gültiges PHP-Skript stehen.
Und ReloadForm ist auch kein gültiger Befehl.
Die Methode ReloadForm vom SDK bewirkt das neu laden der Form, ist aber nur innerhalb deiner Modul Klasse verfügbar und nicht im globalen Kontext der Konsole.

Michael

Danke.
Deine Posts dazu und Austausche hatte ich gefunden :wink:

Das war aber nur ein Versuch.
Ich hatte das auch schon so probiert:

form.json

"onChange": "DE_UpdateForm()"

wobei DE der Modulbezeichner ist.

module.php

public function UpdateForm()
{
    $this->ReloadForm();
}

Das hat auch nicht funktioniert.

Ja, weil der Code im onChange noch immer kein gültiges PHP ist.
Es fehlt:

  • die Instanz auf welche der Befehl angewand werden soll
  • das Semikolon am Ende der Zeile

Davon abgesehen wird dich das kein Stück weiter bringen, weil die $sourceID sich nie ändern wird, da die Property noch immer die alte ist.

Michael

Das geht auch nicht

"onChange": "DE_ReloadConfig($id, $SourceVariableID);"

    public function ReloadConfig(int $id, int $SourceVariableID): void
    {
        $this->UpdateFormField('SourceVariableID', 'value', $SourceVariableID);
        $this->ReloadForm();
    }

Ein UpdateFormField reicht.
Lass das ReloadForm weg.

Dennoch macht dein Code keinen Sinn, weil sowohl Quelle als auch Ziel das gleiche Element der Form sind.
Wenn sich also SourceVariableID in der Form ändert, dann wird Value von SourceVariableID gesetzt.
Aber das macht die Konsole doch von sich aus… Dazu braucht es null Code.
Michael

1 „Gefällt mir“

So geht’s.
Danke für deine geduld! :wink: