[gelöst] onClick | FW_cmd - call PERL sub with values -> perl-html-javascript

Begonnen von HomeAuto_User, 10 Mai 2019, 17:29:04

Vorheriges Thema - Nächstes Thema

amenomade

Zitatonclick="FW_cmd(FW_root+'?cmd={Entleerung(1,"2")}&XHR=1')"
Da gibt es m.M.n. noch etwas, was in der Verschachtelung nicht stimmt
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

#16
Zitat von: amenomade am 12 Mai 2019, 19:37:46
Da gibt es m.M.n. noch etwas, was in der Verschachtelung nicht stimmt

Gibt es die Möglichkeit noch "besser" zu debuggen.
Ich habe schon mir nur das Stück vorgenommen aber komme immer zum Fehler.

Sobald ich die Variable Text maskieren möchte tritt der Fehler auf.

EDIT:

Selbst wenn ich alles umschreibe von " auf das ' Zeichen

$buttons = '<INPUT type="reset" onclick="FW_cmd(FW_root+\'?cmd={Entleerung(';
$buttons .= $var1; # variable 1 Zahl
$buttons .= ','; # Trennung
$buttons .= ''; # eventuelles Zwischenzeichen - Maskierung
$buttons .= $var2; # variable 2
$buttons .= ''; # eventuelles Zwischenzeichen - Maskierung
$buttons .= ')}&XHR=1\')" value="update_Data" %s/>';


geht es nicht, sobald ich definieren möchte mit der Maskierung das es Text ist.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Das ist schwierig: Du hast in einer Konkatenation von Perl Strings eine Konkatenation von Javascript Strings... und jede Art muss quotes und double quotes escapen.
Ich würde in einem online Perl Tester, z.B. https://www.tutorialspoint.com/execute_perl_online.php zuerst zu eine Variable kommen, die eine rightige Javascript String enthält (diese mit einem intelligenten Editor mit javascript Syntaxhervorhebung kontrollieren)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 12 Mai 2019, 20:03:31
Das ist schwierig: Du hast in einer Konkatenation von Perl Strings eine Konkatenation von Javascript Strings... und jede Art muss quotes und double quotes escapen.
Ich würde in einem online Perl Tester, z.B. https://www.tutorialspoint.com/execute_perl_online.php zuerst zu eine Variable kommen, die eine rightige Javascript String enthält (diese mit einem intelligenten Editor mit javascript Syntaxhervorhebung kontrollieren)

Hm, das wird natürlich eine sehr sehr große Herausforderung.

Kann es sein, das vielleicht auch schon der Fehler in der sub _FW_Detail steckt wo das Script zum aufrufen verankert ist?
ODER
kommt nur meine Sub in Frage welche aufgerufen wird. (also diese wo der Code zum HTML Bau verankert ist?
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Funktioniert es, wenn Du fix (ohne Variable) folgendes in deinem Modul einträgst:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\"123e4\")}&XHR=1\')\" value=\"Text\" %s/>";
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 12 Mai 2019, 20:58:48
Funktioniert es, wenn Du fix (ohne Variable) folgendes in deinem Modul einträgst:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\"123e4\")}&XHR=1\')\" value=\"Text\" %s/>";

Nein leider nicht. Nach fester Verankerung kommt

Zitatstring literal contains an unescaped line break
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Und mit:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\\\"123e4\\\")}&XHR=1\')\" value=\"Text\" %s/>";
?
(ein escaped backslash in Perl, um das double quote in Javascript zu escapen)...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 12 Mai 2019, 21:36:55
Und mit:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\\\"123e4\\\")}&XHR=1\')\" value=\"Text\" %s/>";
?
(ein escaped backslash in Perl, um das double quote in Javascript zu escapen)...

Da erhalte ich

ZitatSyntaxError: '' literal not terminated before end of script
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Naja, wir haben " ' " " ' ". Wäre eine dreifache Verschachtelung perl-html-javascript... geht aber nicht : der zweite " schliesst den ersten.

Ich weiss nicht wirklich, was Du machen könntest.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 12 Mai 2019, 22:58:39
Naja, wir haben " ' " " ' ". Wäre eine dreifache Verschachtelung perl-html-javascript... geht aber nicht : der zweite " schliesst den ersten.

Ich weiss nicht wirklich, was Du machen könntest.

Kann es innerhalb FHEM ein Verarbeitunsfehler sein oder hat nur intern das Modul die Verarbeitung zu leisten?
Ich frage daher, weil Bsp: FW_cmd hier als FHEM Funktionen beschrieben werden.

Das komische bleibt ja, via Kommandozeile in FHEM klappt es.

Ein Umweg wäre nur, das ich über eine "Globale Variable" daran komme, was ich aber vermeiden wollte.

Bei der Verarbeitung
->FW_detailFn ->Script -> Sub
geht es ja

nur bei
->FW_detailFn ->Script -> Sub -> Sub
nicht
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

FW_cmd ist eine Javascript Funktion aus fhemweb.js
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Vielleicht ist die Lösung ganz anders. Mit deiner Funktion willst Du eine String bauen, die HTML Code mit Buttons & Co enthält. Was willst Du dann mit dieser Funktion machen? Wofür wird die String dann benutzt?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

bismosa

Hallo!

Ich hatte dies Problem auch gerade erst...ich habe gerade nochmal ein wenig getestet...bin mir aber nicht sicher, ob ich das Problem auch richtig verstanden habe:
my $changecmd = "{MAX_Temperatur_TEST(&quot;HUHU&quot;)}";";
$html.="<a style=\"cursor: pointer;\" onClick=\"FW_cmd(FW_root+'?cmd=$changecmd&XHR=1')\">TESTXXX</a>";

Aufgerufen wird hier "MAX_Temperatur_TEST" mit der "Variablen" "HUHU". Die Sub sieht zum testen so aus:
sub MAX_Temperatur_TEST($){
  my $Value = shift;
  Log3 "TEST",1,"TEST, $Value";
  return "huhu";
}


Ich habe es nur geschafft, indem ich die Anführungszeichen als "&quot;" angegeben habe. Alles andere klappte nicht.

Möchtest Du dann auch mit dem Rückgabewert der Funktion arbeiten? Dann:
my $changecmd = "{MAX_Temperatur_TEST(&quot;HUHU&quot;)}";";
$html.="<a style=\"cursor: pointer;\" onClick=\"FW_cmd(FW_root+'?cmd=$changecmd&XHR=1',function(data){FW_okDialog(data)})\">TESTXXX</a>";


Ich habe aber insgesamt für mich festgestellt, das es u.U. wesentlich einfacher ist ein SET Command auszuführen:
my $cmd = "cmd.$name=set $name start";
$html.="<a style=\"cursor: pointer;\" onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmd',function(data){FW_okDialog(data)})\">$img</a>";

Hier könnte man ja noch weitere Werte übergeben. Das lässt sich auch so im Modul auswerten, das der SET-Command nicht weiter vom USER bedient werden kann...

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

amenomade

ZitatIch habe es nur geschafft, indem ich die Anführungszeichen als "&quot;" angegeben habe.
Ah schön! Das bringt uns das dritte Verschachtelungslevel! Prima
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 13 Mai 2019, 09:09:10
Ah schön! Das bringt uns das dritte Verschachtelungslevel! Prima

Dann muss ich das mal testen und den String mir zusammenbauen.

Schwieriger dazu wird, bei allen Versuchen die letzte Variante wieder zu finden :D

Edit:
Vermutlich muss ich hier ansetzen

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\\\"123e4\\\")}&XHR=1\')\" value=\"Text\" %s/>";

Gesendet von iPhone mit Tapatalk Pro
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet