Listen in PHP-Modulen

Wir haben für IP-Symcon 4.2 angefangen Listen in PHP Modulen zu entwickeln.

Folgende Funktionen sind bisher damit abgedeckt:

  • Listen mit beliebig vielen Spalten
  • Pro Spalte kann die Editierbarkeit definiert werden. Zum Editieren sind die bereits bekannten Elemente vorgesehen.
  • Editierbare Elemente werden in den Modul-Eigenschaften abgespeichert als JSON-Array mit JSON-Objekten
  • Nicht-Editierbare Elemente können vom Modul aus gespeist werden. (GetConfigurationForm() liefert dynamisch „values“)
  • Neue Elemente können hinzugefügt werden
  • Elemente können gelöscht werden
  • Spaltenbreite in Pixeln (auto = Restbreite, Maximal bei einer Spalte möglich!)
  • Sortierung (ich vermute hier würden wir jeweils nach Zahlen/Text sortieren)
  • Interaktion mit Button (onClick) und somit der Export als PHP-Variable (insbesondere die ausgewählte Zeile)
  • Benötigte Spalten (z.B. ID) welche nicht editierbar sind, aber doch in die Persistenz müssen
  • Unsichtbare Spalten die weitere Daten zur Verfügung stellen (Nützlich für Konfiguratoren)

Noch nicht spezifiziert:

  • Tree Funktionalität (Wird irgendwann ein eigener Type)

Link zur Dokumentation: List — IP-Symcon :: Automatisierungssoftware

Beispiel A: SymconTest/ListBasic at master · paresy/SymconTest · GitHub
Beispiel B: SymconTest/ListAction at master · paresy/SymconTest · GitHub

paresy

Klingt sehr cool :smiley:

Gesendet von iPhone mit Tapatalk

Die Vorschläge kommen bestimmt beim testen.
Leider liefert Symcon noch immer keine Tüte Zeit :smiley:
Michael

Sehr sehr cool. :slight_smile:
Ich freu mich drauf.
Das würde mir zur Zeit ganz schön viel Arbeit abnehmen. :smiley:

Grüße,
Kai

wnn dürfen wir mal testen :rolleyes:

Wir haben den Draft mal aktualisiert. Somit sollten eigentlich alle gewünschten Funktionen abgebildet sein. Die Implementation wird leider noch etwas dauern… Wir müssen erst PHP7 bezwingen :slight_smile:

paresy

columns:
width Breite der Spalte in Pixeln, als CSS-String (z.B. „100px“); eine einzige Spalte darf den Wert „auto“ haben, wodurch die Breite dieser Spalte den restlich verfügbaren Platz nutzt

Vorschlag: resize = so schmal wie es der Inhalt zulässt. Und auto für die Spalte welche den restlichen Platz zu 100% füllt.
Sonst muss man x-mal testen nur um die richtige Breite zu bekommen ohne das Text abgeschnitten wird.
Oder ist z.B. 100px ein Minimalwert ?

Michael

Ich kann die Breite leider nicht automatisch bestimmen. Somit musst du einen guten Wert bestimmen :slight_smile:

paresy

Was wenn er zu klein ist?
Wird abgeschnitten?
Michael

Ich nutzte die Liste aktuell nicht um Einstellungen zu speichern, sondern als Konfigurator.

Dazu habe ich die Liste im actions-Bereich deklariert und die Values werden durch GetConfigurationForm befüllt.
Funktioniert soweit perfekt.

Mit dem Beispiel aus der Doku


{
            "type": "Button",
            "label": "Erstellen",
            "onClick": "print_r($devices);"
        }

Möchte ich dann die ausgewählte Zeile eine Instanz erzeugen lassen.
Allerdings wird print_r schon nicht mehr aufgerufen, wenn in den Values ein String mit einem \ (also maskierten Backslash) enthalten ist. Andere Sonderzeichen habe ich nicht geprüft.

Da ich IPS_GetLocation nutze um den Namen in den Values zu füllen, funktioniert somit aktuell nichts :frowning:

Außerdem wäre es schon wenn man Button auch Icons mitgeben kann ( Plus und Minus für hinzufügen und löschen).

Dann wollte ich das beim löschen einer Zeile eine Aktion ausgelöst wird (Instanz löschen), da ich keine andere Möglichkeit gefunden habe, das hier ausprobiert:

                    "edit": {
                        "type": "Button",
                        "label": "löschen",
                        "onClick": "print_r($devices2);"
                    }

Kommt erstmal eine AV

Zugriffsverletzung bei Adresse 008E8C93 in Modul 'ips_console.exe'. Schreiben von Adresse 0000000C.

Dann kommt beim Klick auf den Button ‚$devices2 ist nicht deklariert‘ , die Zeile ist also in diesem Fenster nicht mehr bekannt.
Überhaupt kommen bei den Listen noch sehr viele AVs wenn das JSON nicht korrekt ist.

Ebenso wollte ich oberhalb der Liste einen Button als ‚Neu laden‘ nutzen, diese Möglichkeit ist aktuell auch nicht gegeben, oder ?

Um eine Liste in einem Konfigurator sinnvoll zu verwenden, fehlen aktuell:

  • Action beim löschen einer Zeile (Aktueller Workaround ist ein Button)
  • Action beim hinzufügen einer Zeile (Aktueller Workaround ist ein Button)
  • Reload der Form durch einen Button

Vielleicht wäre es sogar günstiger hier einen neuen Typ von Listen für die Konfiguratoren einzuführen.
Welche so aussehen und funktionieren wie bei Onewire oder HM.
Man benötigt ja eh immer die gleichen Funktionen und Buttons :wink:

Michael

PS: Die ganze Liste ist außerdem immer zu klein, sie passt sich nicht der Fensterbreite an.

Hallo,

ein paar Fragen zu Listen in Konfigurationsformularen:

1. Select Elemente

Lt. Dokumentation kann ich keine Select-Elemente in Listen verwenden. Es funktioniert aber scheinbar trotzdem.
Stimmt hier die Dokumentation evtl. nicht?

2. Translations bei Selects

Was nicht funktioniert, sind Translations für die Labels von Listeneinträgen.
Kann man das ggf. noch ergänzen?

3. Wert von Selects (egal welche)

In der Liste werden die Werte von Selects (Select, SelectObject, …), nicht aber die Labels angezeigt.
Kann man das ändern?

4. Editieren von Listeneinträgen

Aktuell scheint es ja so zu sein, als müsste man jedes Element eines Listeneintrages separat editieren.
Das Fenster, das sich öffnet, ist aber recht groß.
Ist es evtl. geplant, später alle editierbaren Elemente eines Eintrages in einem Fenster anzuzeigen?

Danke schon einmal für die Antwort :slight_smile:

Gruß,
Florian

  1. Jupp. Ist ein Doku Fehler.
  2. Ja, ich muss ich das mal ansehen
  3. Nein. Das wäre auch nicht sinnvoll. Falls du den Wert anzeigen willst, müsstest du den Wert einfach im Label einbetten.
  4. Der Platz kommt noch weg. Ein Editieren der ganzen Liste ist nicht vorgesehen.

paresy

Zu 3) Wieso? Ich verwende als Select Einträge Klartext der (wenn 2 gefixed ist) übersetzt wird. Als Value eine Zahl oder einen Key. Dieser Key wird in der Liste angezeigt. Würde ich Value = Label setzen, würde es zwar gut aussehen, dann würde aber (aktuell) der übersetzte Wert im JSON landen, was ich nicht für optimal halte. Oder verstehe ich dich falsch?

Zu 4) Ok. Für den User wäre es sicher praktischer, die ganze Zeile auf einmal editieren zu können. Was spricht denn dagegen? Bzw. evtl. Inline editing angedacht?

So hätte ich mir das auch vorgestellt. Ähnlich wie im Webfront-Konfigurator die Spalte ‚Konfiguration‘.

Ich klicke auf den Stift und bekomme alle ‚Edit‘ Elemente angezeigt.
Dann braucht der Stift auch nur einmal am Ende jeder Zeile angezeigt werden und nicht pro Element.

Michael

Genau so meinte ich es auch.

Noch zwei Sachen:

  1. Bei CheckBox Elementen wird in der Liste immer „true“ oder „false“ angezeigt.
    Hier wäre es schön, wenn man den Text frei vergeben könnte.

  2. Values werden nicht translated.
    Ich würde gerne als Value „Yes“ und „No“ setzen mit Translation „Ja“ und „Nein“.
    (@paresy, im Übrigen ein Grund, wieso ich die Sprache von IPS ermitteln möchte, denn damit kann ich das Problem Workarounden und abhängig von der Systemsprache den lokalisierten Text anzeigen)

@paresy: Das Thema der Konsole mit den ganzen AVs und Problem mit maskierten \ hast du auf dem Schirm?
Michael

Ne. Völlig übersehen. Ich kümmere mich drum!

@patami:

  1. Ich glaub ich muss mir das mal ansehen. Ich glaube du hast vollkommen Recht und das ist ein Fehler!
  2. Ich würde gerne pro Zeile ein rekursives Editieren erlauben wollen, sodass quasi mehrere Parameter hinter einer Zeile stecken können. Das halte ich für wesentlich mächtiger.

paresy

Zu 4)
Meinst du ähnlich wie jetzt schon die DropdownBox wo ein Eintrag mehrere Settings-Werte darstellen kann?
Und dann pro Zeile oder Zelle?
Michael

Zu 4) Ich verstehe die Antwort nicht :slight_smile: