LoxBerry HTML Template System

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Prof.Mobilux
    Supermoderator
    • 25.08.2015
    • 5043

    #1

    LoxBerry HTML Template System

    Hallo zusammen,

    ich habe gesehen, dass Christian Fenzl im Wiki einen Artikel zum HTML-Templatesystem angefangen hat (Danke für Deine unermüdliche Arbeit das LoxBerry-Chaos zu dokumentieren ). Ich habe mir dazu nochmal Gedanken gemacht und überlege das Templatesystem nochmal grundlegend neu zu gestalten:

    Aktuell gibt es ja zwei Varianten:
    • Die erste Variante, die ich begonnen hatte, benutzt ein gemischtes Template-File mit Struktur und Daten (Sprache). Variablen werden mit <!-- $variable --> eingebaut.
    • Die zweite Variante ist die, die Christian Fenzl "erfunden" hat: Es wird strikt zwischen Struktur und Daten getrennt. Variablen werden mit <!-- $variable --> eingebaut.
    In beiden Varianten nervt das Zusammenbauen der Forms erheblich (Thema: selected=selected). Wenn ich auf meine letzten Plugins zurückgeblicke, dann ist die Funktion meist in 30% der Zeit fertig und ich benötige 70% für die WebGUI...

    Daher möchte ich folgendes Vorschlagen:

    Erstens:

    Ich wäre dafür das LoxBerry-Grundsystem auf eine einheitliche Variante umzubauen und diese als "offiziell" zu verwenden und zu supporten. Alles andere würd eich nicht dokumentieren (keep it simple). Das hindert ja niemanden daran, sich trotzdem sein eigenen Templatesystem zu bauen. Und auch alle vorhandenen Plugins sollten (mit vielleicht wenig Anpassungen bzgl. der Einbindung der header.html weiter funktionieren).

    Wenn ich mich jetzt entscheiden müsste würde ich Christian Fenzl Variante bevorzugen. Insbesondere wenn man viel Javascript benutzt (zum Hinzufügen einer Zeile zu einer Tabelle z. B.) ist das viel Übersichtlicher und einfacher.

    Zweitens:

    "Mein" Templatesystem, auf dem wiederum Christian Fenzl basiert, ist auch so eine Altlast, welche ich in allen meinen CGI-Anwendungen seit Jahren mit mir rumschleppe (den Tipp mit dem Einbinden der Variablen habe ich irgendwann vor 15 Jahren mal im Web gefunden...).

    Es gibt aber auch ein sehr ausgereiftes Perl-Modul dazu: HTML::Template. Das Modul in Kombination mit CGI::Session (das benutzt z. B. der Einrichtungsassistent sowie das Stats4Lox schon) und CGI (benutzen wir alle auch schon zum Einlesen der Formulardaten) wäre in meinen Augen perfekt! HTML::Template bietet If..Else und Loop-Funktionen, womit man meiner Meinung nach das "selected=selected" Problem recht leicht beheben könnte. Zudem arbeiten HTML::Template und CGI::Session perfekt zusammen (siehe Doku zu CGI::Session). CGI bietet auch etwas bzgl. "selected=selected", was ich aber noch nicht ausprobiert habe: Creating Fill-out forms

    Zudem gibt es im CGI-Modul saubere Lösungen zum Mixen von URL- und POST-Parametern (meine "andere" Altlast ​​​​​​​): Siehe Link oben "Mixing post and url parameters".

    Wenn wir jetzt schon soviel am LoxBerry anfassen, dann vielleicht auch richtig? Dann wird's halt nicht LoxBerry 0.3.0 sondern vielleicht 1.0.1 oder so...
    🇺🇦 Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine


    LoxBerry - Beyond the Limits

  • svethi
    Lebende Foren Legende
    • 25.08.2015
    • 6344

    #2
    Das Zeug muss ich mir erst einmal ansehen :-) sooo schlimm fand ich das jetzt nicht. Ich habe bezüglich der Comboboxen die Options immer im CGI fertiggemacht und in eine Variable geschrieben und diese dann im Template nur eingefügt.
    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

    Kommentar

    • Christian Fenzl
      Lebende Foren Legende
      • 31.08.2015
      • 11250

      #3
      Das mit HTML::Template schau ich mir auch mal an. Ich hab als Perl-Neuling vom Guru (Michael) übernommen, ohne zu wissen, was ich da tu. Und als das Squeezelite halbwegs ein brauchbares Template hatte, war es mir zu blöd, jede Änderung in mehreren Sprach-Templates zu machen. Die Not macht erfinderisch :-)

      Die "lästigen" Dinge, wo das LB-Framework helfen kann, soll so abstrahiert sein, dass ein Perl-Neuling sich nicht mit der LB-Struktur (Configfiles, Header/Footer...) befassen muss.
      Oliver ist beim Sonos-Plugin genau da drüber gestolpert, und ich kann bestätigen, dass es frustrierend ist, wenn man hängt bei Sachen, die gar nicht zur eigentlichen Funktionalität gehören.

      Die Mehrsprachigkeit ist auch so ein "lästiges Übel" - das muss so einfach sein, dass man als Entwickler keinen Frust bekommt, und man die Übersetzung auch auslagern kann.

      Oder Logfiles. Ich selbst habe jetzt schon zwei unterschiedliche Logfile-Routinen gebaut, aber beide noch nicht durchgängig (z.B. kein Viewer). Das ist auch was, was in die LB-Basis gehört, mit allem Drum und Dran.

      Mein Ziel wäre, ein neues Sample-Plugin zu machen (z.B. GPIO), dass alles LB-spezifische so versteckt, dass die Systemsachen nur wenige Zeilen Code brauchen. Und alles auf dem Weg dorthin packe ich in die Module.

      Lg, Christian


      Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

      Kommentar

      • svethi
        Lebende Foren Legende
        • 25.08.2015
        • 6344

        #4
        Genau diese Mehrsprachigkeit ist ein Übel *g* bin ich beim Fritz.Lox ja auch erst wieder drüber gestolpert ;-) Ich bin dafür das Deutsch als einzigste Sprache auf der Welt etabliert wird :-). Dann müsste sich auch Trump neu lernen auszudrücken :-) So einfach wie möglich bei der Entwicklung von Plugins, das wäre schön nicht schlecht. Man muss sich das alles mal ansehen und die Möglichkeiten abwägen. Letztlich isses ja so, dass um so einfacher es für die User ist, desto komplizierter isses ja für die Hintergrundprogrammierung. Ich bewundere Euch Beide. Ich kann nicht so viel Zeit für derartiges Abtreten. Nicht dass das Ganze ein Projekt für die Unendlichkeit wird ;-)
        Wie gesagt, einfacher ist sicher besser und anhand der noch offenen Wünsche stellt sich die Frage, ob man nicht erst einmal dann den LB in Next-Level hebt bevor zum Schluss zu viel an den dann bereits bestehenden Plugins gemacht werden muss. Abwärtskompatibilität wäre hier natürlich auch schön :-)
        Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

        Kommentar

        • Christian Fenzl
          Lebende Foren Legende
          • 31.08.2015
          • 11250

          #5
          Wenn jetzt nicht gerade die Ordnerstruktur über den Haufen geworfen wird, oder die Config sich ändert, bleibt alles abwärtskompatibel. Da würde ich nicht schrauben.

          Ich finde meine Zeit aber besser investiert in Systemmodule und die zugehörige Doku, als in weiteren Plugins immer wieder alles neu zu erfinden.
          Z.B. beim LMS Gateway im Squeezelite Plugin habe ich in drei Scripts die gleichen Funktionen für das UDP- und HTTP-Senden an den MS --> pack ich in LoxBerry::System (oder LoxBerry::IO?). Non-Blocking Kommunikation mit dem LMS --> LoxBerry::IO (@Prof.Mobilux apropos, wenn du dir den Squeezelite dev-Branch ziehst, da hab ich die Kommunikation nochmal verbessert - jetzt kannst in iPeng den Volume-Slider ziehen, und siehst wirklich praktisch in Echtzeit die Änderung am MS).

          Ich hab die Hoffnung, dass sich diejenigen, die bisher gesagt haben, "ich kann entwickeln aber kenn micht mit Perl/LB nicht aus", sich selbst heranwagen und probieren. Dann bleibt auch nicht alles auf unserer Hand voll LB-Entwickler liegen, und Michael hat mehr Zeit, die LB-Basis zu entwickeln.

          Ich brauch jedenfalls einen zusätzlichen Raspberry. Ein produktiver Pi1 hat heute den Geist aufgegeben, und Testen ist ohne zusätzlicher Hardware auch ganz schlecht.

          Lg, Christian

          Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

          Kommentar

          • svethi
            Lebende Foren Legende
            • 25.08.2015
            • 6344

            #6
            Wenn Du schon das Thema Perl ansprichst, viele, so habe ich den Eindruck, scheuen vor dem Perl zurück. Dann müsste man auch konsequent sein und ebenso PHP-Libraries zur Verfügung stellen, die die selben Funktionen haben.
            Es ist genau wie Du sagst, die Wunschliste wird immer länger und nur ein paar wenige machen selbst was. Meine Hoffnung wäre auch, dass sich dann mehr beteiligen würden.
            Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

            Kommentar


            • hismastersvoice
              hismastersvoice kommentierte
              Kommentar bearbeiten
              Ich bin einer von diesen
              Mit PHP könnte ich arbeiten, aber Perl ist und bleibt ein rotes Tuch für mich.

            • svethi
              svethi kommentierte
              Kommentar bearbeiten
              sind letztlich alles nur Nullen und Einsen :-)

              PHP geht aber auch jetzt schon. Ich habe auch einiges in PHP gemacht

            • hismastersvoice
              hismastersvoice kommentierte
              Kommentar bearbeiten
              Das ist wie überall, hat man mal angefangen geht es...
              ...aber ich scheue mich schon vor dem anfangen.
          • Christian Fenzl
            Lebende Foren Legende
            • 31.08.2015
            • 11250

            #7
            PHP macht auch Sinn. Erst Perl halbwegs fertig machen, und dann die PHP-API aufrufsgleich für PHP, würd ich sagen.
            Obwohl, wenn man die Regex-Sachen von Perl nicht betrachtet, es nicht so viel anders wie PHP ist.
            Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

            Kommentar


            • svethi
              svethi kommentierte
              Kommentar bearbeiten
              Sehe ich auch so.
          • Prof.Mobilux
            Supermoderator
            • 25.08.2015
            • 5043

            #8
            Die LoxBerry-Module finde ich eine super Idee, das wird auf jeden Fall die Einstiegshürde nehmen und auch uns "erfahrenen" Pluginentwicklern sehr viel Standardwork abnehmen. Ich glaube aber, dass unabhängig davon PHP bei den meisten Leuten bevorzugt wird (auch wenn es sich vielleicht nicht großartig unterscheidet). Es ist einfach die bekanntere Scriptsprache und verzeiht vermutlich auch mehr "unsaubere" Programmierung als Perl das tut. Daher finde ich die Idee super, die Module dann später auch auf PHP zu portieren. Und ich habe mir sowieso schon vorgenommen, dass in der nächsten LoxBerry-Version PHP ebenbürtig zu Perl verwendet werden kann. Etwas umständlich geht das heute schon, aber richtig smart wird es, wenn die PHP-Skripte auch ins CGI-Verzeichnis abgelegt werden können und man sich aussuchen kann, ob beim Klick im Hauptmenü nun index.cgi oder index.php aufgerufen wird. Das wird definitiv kommen.

            Unabhängig davon glaube ich, dass wir mit HTML::Template in Kombination mit Christian Fenzl Multilanguage-Konzept ganz gut bedient sind. Ich bin mir nicht sicher, ob es uns gelingt diese "selected=selected"-Geschichte in ein Modul auszulagern (wüsste im Moment noch nicht, wie das allgemeingültig funktionieren kann). Und da bietet HTML::Template eine sehr einfache Möglichkeit (glaube ich ). Es gibt dazu im Übrigen auch eine PHP-Version mit exakt gleicher Syntax (was zu prüfen wäre): https://sourceforge.net/projects/phphtmltemplate/

            Ich werde das jetzt bei der Grafikengine im Stats4Lox mal testen.
            🇺🇦 Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine


            LoxBerry - Beyond the Limits

            Kommentar

            • svethi
              Lebende Foren Legende
              • 25.08.2015
              • 6344

              #9
              Hmm, ich habe mir mal das HTML::Template angesehen. Ich weiß nicht ob ich etwas übersehen habe, für mich stellt sich das doch genauso dar wie das, was wir eh schon machen. Du musst ein HTML-File bauen, musst dort spezielle Tags hinterlegen, die dann ersetzt werden und bei den Loops musst Du auch im CGI erst ein Array füllen um dieses dann an das konfigurierte Loop zu übergeben. Ich dachte eher, dass da sowas dabei ist wie hier hast Du ein Array, baue mir davon ein Select und wähle das erste aus. Irgendwie sieht das für mich genauso kryptisch aus.Christian Fenzl sag Du doch auch mal was ;-)
              Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

              Kommentar

              • Christian Fenzl
                Lebende Foren Legende
                • 31.08.2015
                • 11250

                #10
                svethi Ich hab's mir noch nicht angesehen! :-)
                Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                Kommentar

                • Prof.Mobilux
                  Supermoderator
                  • 25.08.2015
                  • 5043

                  #11
                  Es müsste doch gehen die Werte in ein Array zu packen und mit Loop durchzuarbeiten. Innerhalb vom Loop dann mit if-then das selected=selected zu setzen. Oder so ähnlich :-)
                  🇺🇦 Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine


                  LoxBerry - Beyond the Limits

                  Kommentar

                  • svethi
                    Lebende Foren Legende
                    • 25.08.2015
                    • 6344

                    #12
                    Hmm, also ich mache das zur Zeit ja so.
                    ...
                    <select>
                    <!--$options-->
                    </select>

                    das sieht für mich einfacher aus als Loop- und Variablendefinitionen.
                    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                    Kommentar

                    • Christian Fenzl
                      Lebende Foren Legende
                      • 31.08.2015
                      • 11250

                      #13
                      In der PHP-Welt macht man's mit Schleife und die Bedingung ist direkt an der entsprechenden Stelle. Da ist es halt anders, weil man bei PHP praktisch schon im Template sitzt.

                      Hmm.

                      Code:
                      <option value="Verbrauchszähler" selected="selected">Verbrauchszähler</option>
                      Drei Variablen:
                      Code:
                      <option value="<--$value[$nr]-->" <!--$selected[$nr]-->><!--$val_language[$nr]--></option>
                      Mit'n Perl-Hash?

                      Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                      Kommentar

                      • svethi
                        Lebende Foren Legende
                        • 25.08.2015
                        • 6344

                        #14
                        Hast Du, glaube ich, falsch verstanden. Ist ein Auszug aus einem Template. $options stellt einen Variable im Perlscript dar, die mit den options gefüllt ist und durch das perlscript ersetzt wird
                        Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                        Kommentar

                        • Christian Fenzl
                          Lebende Foren Legende
                          • 31.08.2015
                          • 11250

                          #15
                          Hab dich schon verstanden. Das entledigt dich ja nicht, das $options zusammenzubauen. Darüber denk ich nach.

                          Hab jetzt ein Tutorial für HTML::Template gelesen. Ähnlich, und die Stärke spielt es aus, wenn's komplex wird. Wenn's um Loops oder Array-Listen die auf Hashes zeigen, da steig ich und jeder aus.

                          PHP-Code:
                          # prepare the DS for the rows
                          my $i;
                          my $rows = [
                             map {
                                my $row = $_;
                                (++$i % 2)
                                   ? { ODD  => [ map { {VALUE => $_} } @{$row} ] }
                                   : { EVEN => [ map { {VALUE => $_} } @{$row} ] }
                             } @{$data}
                          ];
                          # remove excess blood from ears after that last expression 
                          
                          Der Autor hat's eh ganz gut zusammengefasst.

                          Ist natürlich cool, wenn man's dann so ausgeben kann:
                          PHP-Code:
                          $template->param(
                             ROWS    => $rows,
                          );
                          print $template->output(); 
                          
                          Ist ein Extrembeispiel - aber es bringt schon eine Datenkomplexität (Array mit Hashes) hinein, damit's gut funktioniert.
                          Dass Felder in Zusammenarbeit mit CGI automatisch wieder vorbefüllt werden, ist dafür auch eine riesen Stärke!
                          Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                          Kommentar

                          Lädt...