Liste, Spalte mit "Select" type und onChange $id = 0?

Hallo,

ich habe nachfolgende Liste:


{
      "type": "List",
      "name": "TriggeringVariables",
      "rowCount": 10,
      "add": true,
      "delete": true,
      "sort": {
        "column": "TriggeringVariable",
        "direction": "ascending"
      },
      "columns": [
        {
          "caption": "Use",
          "name": "Use",
          "width": "100px",
          "add": true,
          "edit": {
            "type": "CheckBox"
          }
        },
        {
          "caption": "Triggering Variable",
          "name": "TriggeringVariable",
          "width": "600px",
          "add": 0,
          "onClick": "echo 'ID: ' . $TriggerVariables['ID'];",
          "edit": {
            "type": "SelectVariable"
          }
        },
        {
          "caption": "Trigger",
          "name": "Trigger",
          "width": "230px",
          "add": 0,
          "edit": {
            "type": "Select",
            "onChange": "echo $id;",
            "options": [
              {
                "caption": "On Change",
                "value": 0
              },
              {
                "caption": "On Update",
                "value": 1
              },
              {
                "caption": "On Specific Value",
                "value": 2
              }
            ]
          }
        },
        {
          "caption": "Value",
          "name": "Value",
          "width": "180px",
          "add": 0,
          "visible": false,
          "edit": {
            "type": "Select",
            "visible": false,
            "options": [
              {
                "caption": "0 | false",
                "value": 0
              },
              {
                "caption": "1 | true",
                "value": 1
              },
              {
                "caption": "2",
                "value": 2
              },
              {
                "caption": "3",
                "value": 3
              }
            ]
          }
        }
      ]
    }

Es geht um die Spalte „name“: „Trigger“ mit „type“: „Select“, bei onChange soll die nachfolgende Spalte „name“: „Value“ ein oder ausgeblendet werden.

$id gibt mir aber immer 0 aus, so dass ich die Methode nicht aufrufen kann.

Ist es überhaupt möglich im „Listenelement bearbeiten“ Spalten ein und auszublenden über „visible“ ?

Uli

Hallo Uli

Habe bei mir den selben Fehler mit einer Liste auf der ich onCreate/onEdit aufrufe die wiederum in einer anderen Liste eingebettet ist. Anscheinend ist dies ein bekanntes Problem:

Formfeld „Select“ - Option „onChange“ in Listenelement

Dann warten wir mal ab, was paresy oder Dr. Niels dazu sagen…

Oder hast du dir ein Workarround erstellen können?

Uli

Wie im oben verlinkten Post konnte ich die Funktion aufrufen wenn ich die $id im GetConfigurationForm() ersetze.
Bei dir sollte das wohl in etwa so gehen:

		public function GetConfigurationForm()
		{
			// get existing form from form.json
			$config_form = file_get_contents(__DIR__.'/form.json');
			$config = json_decode($config_form);

			// PROVISIONAL $id 0 FIX
			$config->elements[0]->columns[2]->edit->onChange = 'MeineFunktion('.$this->InstanceID.');';

			// return form
			$config_form = json_encode($config);
			return $config_form;
		}

Gruss
Dario

Hi Dario,

und danke, probiere ich mal aus…

Uli

Ich hatte gestern Abend mit Niels noch kurz darüber gesprochen und er meinte auch, dass dies ein Fehler wäre.

paresy

Dann wünsche ich mir mal im Adventsklender Tür Nr. 11 einen Fix :smiley:

Ich versuche gerade das gerade über GetConfiguration zu bauen:


$formData['elements'][10]['columns'][2]['edit']['onChange'] = 'BOSEAN_UpdateTrigger(' . $this->InstanceID . ');';

Das mit der ID klappt, stecke aber gerade fest, wie ich zusätzlich den aktuellen Wert noch mit übergeben kann, den der User ausgewählt hat:


$formData['elements'][10]['columns'][2]['edit']['onChange'] = 'BOSEAN_UpdateTrigger(' . $this->InstanceID . ', ' . $value . ');';

$value ist jetzt nur als Platzhalter zu sehen.

Noch einen Tip?

Uli

Bin ich blind, oder ist da eine falsche Variable beim Echo?
Die Liste heißt doch TriggeringVariables
Und im Echo steht $TriggerVariables
Michael

Zusätzlichen Parameter musst du so angeben (als text):

'BOSEAN_UpdateTrigger(' . $this->InstanceID . ',$value);'

da die $value variable wieder im anderen Skript geparsed wird.

Hi Michael,

du bist nicht blind, das war oben nur ein erstes Beispiel.

Ich will auch nix mit echo ausgeben, sondern bei onChange eine Methode aufrufen, die den aktuellen ausgewählten Wert mitgibt.

Da ja in der form.json das $id nicht funktioniert, versuche ich das über GetConfigurationForm zu erstellen.

Wie komme ich jetzt an den Wert?

Uli

Danke für den Tip, versuche ich mal…

Uli

Danke, das war der entscheidende Tip:


$formData['elements'][10]['columns'][2]['edit']['onChange'] = 'BOSEAN_UpdateTrigger(' . $this->InstanceID . ', $Trigger);';

Uli

Ah, die Instanz ID ist das Problem. Ich dachte die Spalte ID und das Echo auf das Array mit Index ID.
War ich doch blind.

Michael

So noch eine Anschlußfrage…


UpdateFormField (String $Feld, String $Parameter, Variant $Wert)

benötigt ja bei:


Bei komplexen Parameter, also Listen oder Objekte, muss der neue Wert JSON-codiert übergeben werden.

Das ist momentan bei mir noch leider erfolglos:


$this->UpdateFormField('TriggeringVariables', '{"columns": [{"name": "Value","edit": {"visible": true}}]}', true);

Hat jemand mal ein Beispiel?

Es soll im „Listenelement bearbeiten“ ein weiteres Feld eingeblendet werden, das ist in meiner Liste „TriggeringVariables“ die Spalte „Value“ und der edit type „Select“ soll dann „visible“ true or false setzten…

Uli

Aus der Dokumentation:
https://www.symcon.de/service/dokumentation/entwicklerbereich/sdk-tools/sdk-php/module/updateformfield/

void UpdateFormField (String $Feld, String $Parameter, Variant $Wert)

d.h.

UpdateFormField("TriggeringVariables", "columns", $columns)

und $columns ist halt der gesamte json-string der bei dir unter columns drinn steht.
Am einfachsten liest du den bestehenden string aus, änderst den gewünschten Wert auf true und schreibst ihn dann mit oben genannter Funktion wieder zurück.

Auslesen, ändern und wieder ein JSON string daraus machen den d dann zrückschreibst funktioniert wieder ähnlich wie vorher beim GetConfigurationForm(), nur musst du dir halt den teil unter cloumns rauspicken.

Bei mir sieht das ungefähr so aus:


// get configuration form
$config = json_decode($this->GetConfigurationForm());
// get desired part to write back in the UpdateFormField() function
$columns = $config->elements[$this->stateElementIndex]->columns;
// edit the desired value
$columns[2]->edit->columns[0]->add = $incrementedIndex;
// encode and write back
$this->UpdateFormField("States", "columns", json_encode($columns));

Dario

Hi Dario,

nochmals danke. Probiere ich nachher mal aus.

Uli

Gesendet von iPhone mit Tapatalk

Es geht voran…

Das ein- und ausblenden von Spalten im „Listenelement bearbeiten“ funktioniert nun.

Es gibt insgesamt 6 Spalten. Den „onChange“ für ich erst bei Spalte 3 aus, wenn der User eine gewisse Auswahl trifft. Es werden dann mittels UpdateFormField die Spalten 4 und 5 ein-, bzw. ausgeblendet.

Leider gehen dann die bereits eingegeben Werte der Spalten 1 und 2 verloren… Ich habe jetzt schon etwas experimentiert, irgendwie fehlt mir der Ansatz. :confused:

Uli

Hallo Uli

Habe gerade das selbe Problem bei mir.
Bin noch am schauen an was das liegt. Zuerst dachte ich es liegt daran, dass die „values“ werte aus der config leer sind und diese auch geschrieben werden. Ohne die value werte zu Überschreiben ist das Formular aber auch wieder leer nach einem event aufruf. Ich melde mich sobald ich mehr weiss.

Hi Dario,

danke für den Hinweis, vielleicht kann das Symcon HQ uns unterstützen, vielleicht geht das auch gar nicht?!?!

Uli

Ja es seht sehr schwierig aus.
Was man definitiv sagen kann ist:

  1. Das die „listener“ funktionen in einer Liste drinn keine $id bekommen.
  2. Wenn man es mit dem workaround macht die UpdateFormField() Funktion dafür auch nicht funktioniert wie sie soll.

Diese Beiden Punkte sollten meiner Meinung nach definitiv in einer Zukünftigen SymOS version gelöst werden.
Ich hoffe das Symcon diese Sache in die Liste aufnehmen wird.