FW_detailFn für einfachen Funktionsaufruf erstellen

Begonnen von Adimarantis, 08 April 2022, 19:24:05

Vorheriges Thema - Nächstes Thema

Adimarantis

Hallo,
Ich möchte über die detailFn im oberen Bereich des Moduls einen anklickbaren Text oder Button mit einem langen Textfeld anzeigen.
Per Klick wird dann der Inhalt des Textfelds an das Modul übermittelt um damit weitere Aktionen auszuführen.
Motivation ist das wichtigeste "set" gesondert zur Verfügung zu stellen, damit man schneller drankommt und es nicht mmer in der Liste suchen muss.

Ich bin soweit, dass ich mit
$data{FWEXT}{"/Signalbot_sendMsg"}{CONTENTFUNC} = "Signalbot_sendMsg";

den Callback definiere.
In der FW_detailFN erzeuge ich die Felder
  $ret.="<form id='Signalbot' method='$FW_formmethod' autocomplete='off' ".
              "action='$FW_ME/Signalbot_sendMsg'>";
  $ret .= "<table class=\"block wide\">";
  $ret .= "<td>";
  $ret .= FW_submit("submit", "send message ")."<input type=\"text\" name=\"send\" size=\"80\" value=\"\"/>";
  $ret .= "</table></form>";

und wenn ich auf "send message" klicke wird tatsächlich meine Funktion mit den Werten des Textfelds aufgerufen:
sub Signalbot_sendMsg($@) {
my ($arg) = @_;
FW_digestCgi($arg);
print "send:".$FW_webArgs{send}."\n";

my $hash = $defs{$FW_detail};
[....]
return 0;
}


Das ganze habe ich vom SVG Modul abgekupfert. Meine Probleme:
1. $FW_detail ist bei mir nicht gesetzt. Auch in $FW_webArgs{detail} steht nichts. Ich komme also nicht an den $hash von meinem Modul dran. Was mache ich falsch?
2. Nach dem Aufruf der Funktion wird der Detailbereich leer. Ich hätte eigentlich gerne, dass die Moduldetails weiter angezeigt werden und würde nur den Inhalt des Textfeldes (als Rückmeldung) löschen wollen. Geht das? SVG kriegt es irgendwie hin ein Popup Fenster anzuzeigen ohne den Inhalt des Hauptfensters zu verändern.

Wäre für Hinweise dankbar.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

justme1968

#1
wenn die url die du aufrufen willst fest ist (d.h. keine dynamischen parameter hat) brauchst du eigentlich keine contentfunc. du kannst einfach ein cmd=set... an fhem senden und mit einem zusätzlichen &XHR=1 den refresh deaktivieren.

wenn du trotzdem über die contentfunc gehen willst: schick dir den device namen und alles was du sonst brauchst als parameter in der url mit. xhr wie oben.

ups. hatte das textfeld übersehen. das ist variante 1 mit dem set natürlich unsinn. aber variante 2 sollte dir helfen.

ps: noch eine idee: wenn du dir abschaust wie fhemweb das set generiert kannst die vermutlich genau den gleichen code aufrufen um ein identisches set mit nur einem kommando zusätzlich zu erzeugen und alles was fhemweb sowieso schon implementiert hat wieder verwenden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Adimarantis

Danke. Nach etwas Spicken im developer mode vom Browser hab ich verstanden wie ich was mitgeben kann.
Hab jetzt einfach noch ein
  $ret .= "<input type=\"hidden\" name=\"detail\" value=\"$hash->{NAME}\">";
eingefügt, womit ich mit
my $mod=$FW_webArgs{detail};
meinen Modulnamen kriege und entsprechend den Hash bekomme.

Seltsamerweise macht er jetzt einfach nur einen Refresh vom Bildschirm - was eigentlich genau das ist, was ich brauche.
Schaut soweit gut aus und funktioniert - siehe Screenshot.

Danke
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)