Werte eines Formularfeldes ändern ohne ApplyChanges

Hi,

ich habe in einem Modul ein Listelement, in dem der Anwender Einträge auswählen kann (Active=j/n):

Nun möchte ich gerne, dass der Anwender sich zur leichteren Entscheidung auch aktuelle Werte einblenden lassen kann. Da das Holen der Werte zeitintensiv ist, gibt es dafür einen Button (Read Values) und dann werden die Werte in der Spalte Values (mit „save“: false) über UpdateFormField() angezeigt.

Leider geht durch die Aktion die Instanz immer in den Änderungsmodus, den ich aber gerne vermeiden möchte, da sich ja an den zu speichernden Werten nichts geändert hat.

Gibt es da eine Möglichkeit, das ApplyChanges zu verhindern?

Burkhard

Liste unter der „action“ Sektion erstellen.
Gruß Michael

Wie gesagt, die Liste beinhaltet auch Werte, die der Anwender bearbeiten kann.
Daher muss die Liste schon im Elements Bereich bleiben.

Dann geht das nicht.
Aber was spricht gegen Attribute und der Liste im Actions Bereich?
Michael

Attribute und eine Liste im Actions-Bereich wäre die Lösung. Seit der 5.3 kannst du ja auch auf onAdd, onEdit, onDelete reagieren.

paresy

Ok. Dann beschäftige ich mich mal mit dem Weg näher.

Muss ich dann zur Übernahme der Daten einen eigenen ApplyChanges Button anbieten?

Nein, musst Du nicht. Ich habe es ebenfalls mit WriteAttribute gelöst.

Kann ich mir dein Modul mal ansehen? Ich würde gerne mal sehen, wie sich das aus Anwendersicht darstellt und wie du es gelöst hast.

Burkhard

Unabhängig von den neuen onEvents…
Kann man inzwischen auch die ganze Liste als PHP-Variable nutzen? Oder immer noch nur die selektierte Spalte?
Michael

Ja. Das geht aber der 5.3. du kannst mit foreach ja mal über die Listen Variable iterieren.

paresy

Vorher war enthielt die Variable ja ein Array des selektierte Eintrages.
Und jetzt dann alle?
Ist das ein BC?
Michael

Ist kompatibel. Wir haben daraus eine nette magische Klasse gemacht. Wenn du es wie ein Array nutzt, gehst du über alle Elemente. Wenn du es wie ein Objekt/Assoziatives Array nutzt ist es wie immer. BC ist aktuell für alle uns bekannten Fälle gegeben.

paresy

Bin unterwegs und kann es Dir erst am Wochenende schicken

Im Actions Bereich meines Formulars habe ich nun eine Liste


 "actions":  [
    {
      "type":    "List",
      "name":    "VariableList",
      "caption": "List of Variables",
      "columns": [
        {
          "name":    "column1",
          "width":   "200px",
          "caption": "MQTT Message",
          "save":    true
        },
...

und einen Button, mit dem ich die Liste verarbeiten möchte:


        {
          "type":    "Button",
          "caption": "CreateVariables",
          "onClick": "EBM_CreateVariables($id, json_encode($VariableList));"
        }

Leider ist $VariableList immer null. Ist mein Ansatz falsch?

Burkhard

Die $VariableList ist nicht json-codiert, sondern kann direkt verwendet werden. Daher kommt wohl null zurück, da das Eingabeparameter gar kein String ist.

$VariableList ist ein Objekt (IPSList) mit den Elementen „position“, „selected“ und „array“.
Aber wie greift man darauf zu? Oder ist da noch ein Fehler drin?

Edit:

Habe es jetzt erst einmal gelöst/umgangen mit:


"onClick": "EBM_CreateVariables($id, (array_values((array) $VariableList))[2]);"

Greifst du direkt mit den Spaltennamen auf das Objekt zu, erhälst du ganz wie gewohnt den Spaltenwert der ausgewählten Spalte. Greifst du mit einem numerischen Index zu, greifst du auf die entsprechende Zeile der Liste zu und kannst weiter auf die Spaltenwerte zugreifen, z.B. $VariableList[2][‚address‘]. Da man ja aber nicht immer weiß, wie viele Zeilen so eine Liste hat, kann man sie auch einfach per foreach iterieren:


foreach ($VariableList as $line) {
  $position = $line['position'];
}

Ah, verstehe. Es lässt sich iterieren.

Ist das ein Novum in der IPS-Welt? Bislang hatte ich es noch nie mit einem Objekt IPSList zu tun.
Man muss nur wissen, dass man das Objekt nicht anderweitig (json_encode etc. )verarbeiten kann.

Ja, das Objekt ist an der Stelle Neuland, damit sowohl alte Module weiter funktionieren, als auch neue Module auf alle Zeilen zugreifen können. Das Objekt könnte man theoretisch auch noch erweitern, so dass z.B. json_encode etwas sinnvolles zurückgibt. Das mache ich gerne, wenn jemand einen entsprechenden Anwendungsfall hat.

Ich würde gerne auf den kompletten Inhalt der Liste als Array zugreifen können. Denn ich möchte ihn als Attribut speichern und später wieder mit UpdateFormField ausgeben.

Burkhard

Edit:

auch wäre schön, wenn ich die Variable irgendwie an IPS_RequestAction übergeben könnte, denn


          "onClick": "$module = new IPSModule($id); IPS_RequestAction($id, 'CreateVariables', $VariableList);"

funktioniert nicht.