• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] Button value als Variable möglich?

colaholiker

Mitglied
Hallo,

zum löschen von Dateien möchte ich eine Sicherheitsabfrage per Dialogbox durchführen.
Der Delete-Button soll dann an "/dir" das Argument "delete_" zusammengesetzt mit der Variablen "fileName" an mein C++-Programm schicken.

Code:
    <aside class='aside'>
        <dialog id='dialog' value= fileName>
            Datei <span id='fn'></span> wirklich l&ouml;schen?
            <FORM action='/dir' method='post'>
            <button class = '3' id= '3' type='submit' name='delete' value='delete_oldFile'>ja</button><button id='close-dialog'>nein!</button>
        </dialog>
    </aside>

Die Variable 'fileName' kommt bereits in der Dialogbox an und wird per <span> in die Abfrage über die Buttons eingesetzt.

Wie kann ich beim Delete- Button value='delete_' + fileName erreichen?
(das "value='delete_oldFile'" wäre die gewünschte Variable xVal bestehend aus "delete_" + fileName, hab ich mal zum Verständnis "so" reingeschrieben)
Die Ausführung sollte natürlich erfolgen ehe der Delete-Button betätigt wird.

Im Netz habe ich zu dieser Sache nur
https://stackoverflow.com/questions/52685518/store-value-from-button-in-variable-using-javascript
gefunden. Versuche mit diesen Beispielen haben nur die Variablenbezeichnung übertragen, nicht deren Inhalt.

Ist es überhaupt machbar, das value eines Buttons als Variable zu deklarieren?
vielen Dank.
 

colaholiker

Mitglied
...tja, sowas scheint nicht zu gehen.

Aber ich arbeite auf einen Workaround hin:

Da ich bei Nutzung anderer Buttons bereits die Webseite mit C++ jedesmal neu erstellen lasse, habe ich mir gedacht, sowas auch mit dem Button so zu machen der den Dialog startet.
Dabei wird der HTML-Code der Dialogbox neu geschrieben, und der Delete-Button dort mit einem 'value' das vom Aufruf- Button erzeugt wird, der in C++ ausgewertet wird.

Mein Problem ist jetzt, daß die Dialogbox aufgeht bevor die Webseite neu geladen ist und damit sofort wieder zuklappt.

Ich hätte die Box gerne erst geöffnet nachdem die Webseite neu geladen wurde.

Geht es, das 'value' eines Buttons abzufragen? Das könnte ein Auslöser werden, die Dialogbox in der neuen Webpage zu öffnen...
 

Sclero2004

Mitglied
Ich bin ziemlich sicher, dass auch dein ursprünglicher Ansatz geht. Allerdings hast Du nur das HTML des dialog-Elementes gepostet. Wie wird dieser Dialog denn geöffnet? Ich vermute, er ist nicht dauerhaft offen sondern wird bei Bedarf durch Klick auf einen Button geöffnet. Du schreibst:
Die Variable 'fileName' kommt bereits in der Dialogbox an und wird per <span> in die Abfrage über die Buttons eingesetzt.
Was bedeutet das und wie ist da genau der Ablauf? In dem HTML des Dialogs kann ich kein span finden.
 

colaholiker

Mitglied
Hi Schero2004,

Mein Code oben Zeile3? Datei <span id='fn'></span>...

Dieses Value: <dialog id='dialog' value= fileName> ist voch von früheren Versuchen übrig, ich sehe es erst jetzt. Stört nicht, kann evtl. aber weg.

Ich werde unten den ganzen relevanten Code zeigen.
Der Button class1 kommt öfter vor und meldet bei Klick an C++, welches File gelöscht werden soll.
Der im Beispiel unten würde meine Startseite melden. Da ist so eine Sicherheitsabfrage schon wichtig.

...und so klappt es:

- Hürde 1, das angepaßte Button-value wird über C++ erzeugt, die Webseite neu geladen. Beispiel: value='delete_ollesFile'
- Hürde 2, Start der Dialogbox nach Laden der Webseite, beginnt mit:
<body onload='abfrDialog()'>
- Hürde 3, das Auslesen des besagten 'value"- Inhalts (Button ID5):
var delVal =document.getElementById(5).getAttribute('value').substring(2);

delVal enthält bereits nur noch den Filenamen (substring). Ist dieser vorhanden startet die Dialogbox. Ohne Löschvorgang enthält der Delete-Button nur value='delete_', die Box bleibt zu.
'fn' wird gebraucht, um den Filenamen in der Box anzuzeigen.

Hier noch mein Code für andere Anfänger:
Code:
...
<body onload='abfrDialog()'>
    <h1>Directory</h1>
        <aside class='aside'>
            <dialog id='dialog' value= fileName>
            Datei <span id='fn'></span> wirklich l&ouml;schen?
            <FORM action='/dir' method='post'>
            <button class = '5' type='submit' name='delete' id='5' value='delete_'>ja</button><button id='close-dialog'>nein!</button>
        </dialog>
    </aside>
...
            <button class = '1' type='submit' name='dialog' id='1' value='dialog_001-Anfang.htm'>loeschen</button>
            <br><FORM action='/dir' method='post'>
...
    <script>
        const
        dialog = document.getElementById('dialog');
        document.getElementById('5').addEventListener('click', () => {
            dialog.showModal();
        });
        document.getElementById('close-dialog').addEventListener('click', () => {
            dialog.close();
        });
        function abfrDialog() {
            var delVal =document.getElementById(5).getAttribute('value').substring(2);
            if (delVal.length > 1) {
                document.getElementById('fn').innerHTML = delVal.substring(1);
                dialog.showModal();
            }
        }
    </script>
</body>
Sorry daß die Zeile über </dialog> hier so lang ist. Nur so bekomme ich beide Buttons in der Dialogbox nebeneinander. Deshalb habe ich es hier auch so belassen.

Also im gezeigten Code besteht gerade kein Löschauftrag (value='delete_') und ich kann in Ruhe andere Sachen auf der Website machen wie Downloads und mein nächstes Ziel, Renames.

Was ich bemerkt habe: der Delete-Button (ja) ist hervorgehoben gegenüber dem (nein)-Button. Eine Default-Sache? Sollte andersrum. Hab dazu aber noch nicht recherciert.

Das Löschprozedere kommt mir selbst ziemlich holprig vor, das Neuladen der Seite wollte ich vermeiden. Bei vielen Files kann man schon warten bis die Box aufgeht.
Na egal, jetzt kann ich mir das "Renamen" vornehmen.
 
Zuletzt bearbeitet:

colaholiker

Mitglied
Ups, hab mich bei Eurem Pan/Zoom- Thema verlesen. Da kenne ich jetzt meinen Platz :-/

Ja mein Delete- Teil ist erledigt. Das jetzt folgende Renamen traue ich mir auch zu.

Dann käme das Problem, Uploads in Unterordner zu bekommen. Ich hatte irgendwo gelesen, das sei aus Sicherheitsgründen nicht möglich (ist aber alles local bei mir).

Muß ich jetzt mein Thema als erledigt markieren oder machen das Admins? Hab nichts dazu gefunden.
 

Sclero2004

Mitglied
Das Löschprozedere kommt mir selbst ziemlich holprig vor, das Neuladen der Seite wollte ich vermeiden. Bei vielen Files kann man schon warten bis die Box aufgeht.
Das muss auch nicht sein, man kann das bestimmt auch mit fetch machen ohne Neuladen.
Im HTML die Aktion als data-Attribut eintragen:
Code:
<td><button class="add" data-action="add">Add</button></td>
<td><button class="delete" data-action="del">Delete</button></td>

Und dann im Javascript auf die Buttons reagieren. Weitere Erklärungen habe ich als Kommentare im Code eingetragen:
Code:
    <script>
        // Wir registrieren zunächst einen Eventlistener für "window".
        // Dieser feuert wenn irgend wo auf der Seite geklickt wurde.
        window.addEventListener('click', event => {
            // event.target ist das Element das geklickt wurde.
            // Wir prüfen jetzt ob der Button für eine Aktion im
            // Dateisystem gedrückt wurde. Das ist der Fall,
            // wenn es sich um einen Button in einer Tabelle handelt.
            if (event.target.matches('table button')) {
                event.preventDefault();
                const
                    // Vom Button ausgehend die Tabellenzeile ermitteln.
                    // Die Funktion closest sucht aufwärts das erste Element,
                    // das, in diesem Fall, ein Reihe in der Tabelle ist.
                    row = event.target.closest('tr'),
                    // und die Zelle mit dem Dateinamen
                    // dazu müssen wir dieser jeweils im HTML
                    // die Klasse "td-filename" geben
                    nameCell = row.querySelector('.td-filename'),
                    // Jetzt haben wir die Zelle und können daraus den Text auslesen:
                    fileName = nameCell.innerHTML,
                    action = event.target.dataset.action;
                // Jetzt können wir eine Funktion aufrufen und dieser
                // den Namen übergeben.
                handleFileName(event.target, fileName, action);
            }

            // Wurde die Aktion im Dialog bestätigt?
            if (event.target.id == 'confirm-action') {
                event.preventDefault();
                const
                    fileName = document.getElementById('filename-dialog'),
                    action = document.getElementById('action-dialog');
                console.log('confirm file ' + fileName + ' action ' + action);
                // Jetzt haben wir alles beisammen, um den Auftrag für das Löschen
                // an den Server zu senden. Etwa so:
                // fetch('handleFileAction?' + 'feedback-from-fetch=' + fileName + xBtn)
                //     .then(response => { response.text() })
                //     .then(text => {
                //         hier ggf. den Dialog wieder schließen
                //         document.getElementById('feedback-from-fetch').innerHTML = text;
                //     });            }
                // Das habe ich aus #48 in deinem vorigen Thread

                // Wurde die Aktion im Dialog abgebrochen?
            }
            if (event.target.id == 'close-dialog') {
                event.preventDefault();
                document.getElementById('dialog').close();
            }
        });
        // Die Funktion, die aufgerufen wird, müssen wir natürlich auch definieren:
        function handleFileName(btn, fileName, action) {
            // Jetzt steht der Dateiname als Parameter "fileName"
            // und die Aktion zur Verfügung und Du kannst damit arbeiten.
            console.log(fileName);
            // Wir tragen die benötigten Parameter in das div im Dialog ein,
            // damit sie für weitere Aktionen dort zur Verfügung stehen.
            document.getElementById('filename-dialog').textContent = fileName;
            document.getElementById('action-dialog').textContent = action';
            // Den Hinweistext leiten wir aus der Aktion ab:
            switch (action) {
                case 'del':
                    const text = 'Datei wirklich löschen?'
                    document.getElementById('text-dialog').textContent = text;
                    document.getElementById('dialog').showModal();
                    break;
                case 'add':
                    // Hier brauchen wir möglicher Weise keine Bestätigung,
                    // dann können wir auf die Rückfrage verzichten.
                    break;
            }
        }

    </script>
 
Zuletzt bearbeitet:

colaholiker

Mitglied
Ja das kenne ich noch. Interessant wie hier eine Dialogbox eingebunden ist.
Der Code im letzten Thread hat auch alle Daten gut zu meinem C++ gebracht, aber dort konnte ich die Daten nicht so verarbeiten wie ich dachte.

Bei weiterer Netz-Suche fand ich die Methode mit den Buttons wie z.B.

<FORM action='/dir' method='post'>
<button class = '3' type='submit' name='download' value='file.txt'>Download</button>

Da landet jedes Kommando in der C++- Routine /dir, in diesem Fall
mit der Order "download_file.txt". Anderes Beispiel
"dir_b-Daten" um in diesen Ordner zu wechseln.

Die Auswertung in C++ erfolgt z.B. so:

Code:
        if (Order.indexOf("download_")>=0)
        {
          Order.remove(0,9);
          SD_file_download(Pfad, Order); // ausführen
        }

Damit kann ich alle Aktivitäten für meine SD-Karte aus der einen HTTP <FORM action='/dir'... starten, was mir sehr gefällt.

Wenn Du mir sagen könntest, wie ich diesen Button:

Code:
<FORM action='/dir' method='post'>
<button class = '3' type='submit' name='download' value='download_file.txt'>Download</button>

in einer Funktion ersetzen könnte, würde ich gerne mit deinem Dialogbox- Vorschlag und der weiteren Verwendung der Fetch-Methode weitermachen.

Die Option "case 'add':" schreit ja quasi danach, dort eine weitere Dialogbox einzubauen damit ich für das Renaming ein Formular bekomme.
Und wenn ich das richtig sehe, kann ich immer dieselbe Box anpassen.
Das ist gut!
 
Zuletzt bearbeitet:

Sclero2004

Mitglied
Guten Morgen!
Dieses:
Code:
<FORM action='/dir' method='post'>
<button class = '3' type='submit' name='download' value='file.txt'>Download</button>
dürfte sich problemlos durch ein fetch ersetzen lassen:
Code:
// Du musst die Aktion auf den Wert setzen, den der Server braucht,
// z. B. bei deinem letzten Beispiel auf "download"
const
    fileName = document.getElementById('filename-dialog'),
    action = document.getElementById('action-dialog');
console.log('confirm file ' + fileName + ' action ' + action);
// Formdata-Objekt erzeugen:
const params = new FormData();
// Den Parameter, der übertragen werden soll, eintragen
// 1. Parameter ist das was im Formular das name-Attribut ist,
//     also "download"
// 2. Parameter ist das was im Formular das value-Attribut ist,
//     also "file.txt"
params.append(action, fileName);
fetch('/dir', {
        method: 'post',
        body: params
    }).then(response => { response.text() })
    .then(text => {
        hier ggf. den Dialog wieder schließen
        document.getElementById('feedback-from-fetch').innerHTML = text;
    });
Dabei habe ich versucht, den POST-Parameter genau so zu übertragen wie es das Formular tut. Bin jedoch ein wenig am Schwimmen, weil ich wiederum mit der Serverseite im C++ nicht so vertraut bin. Ggf. musst Du da ein wenig debuggen und schauen, was im C++ ankommt.
 
Zuletzt bearbeitet:

colaholiker

Mitglied
Hallo,
die derzeitige Dialogbox:
Code:
    <aside class='aside'>
        <dialog id='dialog'>
            <div id='filename-dialog'></div>
            <div id='action-dialog'></div>
            <div id='text-dialog'></div>
            <button id='confirm-action' data-action='confirm-action'>ja</button><button id='close-dialog'>nein!</button>
        </dialog>
    </aside>

... im Code aus #8 geht es im Event-Listener an dieser Stelle nicht weiter:

Code:
            if (event.target.id == 'confirm-action') {
                event.preventDefault();
                const
                    fileName = document.getElementById('filename-dialog'),
                    action = event.target.dataset.action;
                    console.log('confirm file ' + fileName + ' action ' + action);

Das Event wird erkannt, aber mein Ergebnis lautet für fileName und action:
confirm file [object HTMLDivElement] action confirm-action

Es ist dabei egal, ob der Dialog vorher oder danach schließt.

ich habe 'del' in 'qdel' umbenannt weil die Buttons in der Tabelle nur die Löschabfrage starten ('question del'). Das läuft durch:
Code:
case 'qdel':
    const text = 'Datei wirklich löschen?'
    document.getElementById('text-dialog').textContent = text;
    document.getElementById('dialog').showModal();
    break;

Da steht der Test des Codes aus #10 noch aus :-(
 

Sclero2004

Mitglied
Da hatte ich allerdings noch einen Fehler drin:
Code:
            if (event.target.id == 'confirm-action') {
                event.preventDefault();
                const
                    fileName = document.getElementById('filename-dialog').textContent,
                    // event.target ist hier nicht mehr der Löschbutton in der Tabelle
                    // sondern der Confirm-Button im Dialog, d. h. dies ist falsch:
                    // action = event.target.dataset.action;
                    // So wäre es richtig:
                    action = document.getElementById('action-dialog').textContent;
                    console.log('confirm file ' + fileName + ' action ' + action);
 

Sclero2004

Mitglied
PS: Was den Code aus #10 betrifft, könnte es angebracht sein, zunächst mit festen Werten zu testen ob sie wie erwartet im C++ an kommen und dort richtig verarbeitet werden.

Und in #12 hatte ich noch mehr Fehler drin, lade mal neu und nimm den Code aus dem Forum, nicht aus der Benachrichtigung.
 

colaholiker

Mitglied
guten Abend,
prima, jetzt läufts durch und damit kann ich den weiteren Code testen.

Der gehört wohl direkt im Anschluß darunter.
Zum testen ok, aber ich glaube das gehe ich morgen an, weil die Tests nur am "lebenden Objekt" funktionieren. Bedeutet ich muß den Controller jedesmal neu programmieren.

Am Ende müßte der "Button-Ersatz" von allen Button- Arten erreicht werden, also wohl in eine Funktion wandern (der Code soll ja in den Prozessorspeicher passen).
 

colaholiker

Mitglied
...und guten Morgen [hier Regen!].

Ich glaube, das Formdata-Objekt im Code nach #10 kann wegfallen, weil "action" und "fileName" zusammengefaßt werden. Ins Formdata- Objekt muß ich wohl mindestens 2 Parameter eintragen.

Also action + "_" + fileName ergibt:

qdel_meinFilename.txt

(qdel für den Löschauftrag. "download wie in #10 in 1. erwähnt ergibt dann download_meinFilename.txt zum downloaden).

Der Unterstrich ist nötig um action und fileName in C++ wieder zu trennen.

So, dann teste ich mit dem fetch-Teil weiter...
 

colaholiker

Mitglied
Hallo Schero2004,

ich bin erstmal soweit gekommen daß ich Werte in C++ empfange.
Die Fetchroutine habe ich in eine extra Funktion getan:

Code:
        function sendtoMC(Order) {
            fileName = '_' + document.getElementById('filename-dialog').textContent,
            //action = document.getElementById('action-dialog').textContent;
            const params = new FormData();
            //params.append(action, fileName);
            params.append(Order, fileName);
            fetch('dir?' + 'feedback-from-fetch=',
            {method: 'post',
            body: params
            })
            .then(response => { response.text() })
            .then(text => {
               document.getElementById('feedback-from-fetch').innerHTML = text;
            });
            document.getElementById('dialog').close();
        }

Wie Du siehst, wird "dir?" ohne den Schrägstrich davor eingesetzt.
Danach kommt das "Argument" 'feedback-from-fetch=' (hab ich vom anderen Thread hergenommen, und wird auch gebraucht).

Das gilt auch für das "?" nach 'dir'. Was bewirkt das?

Wundere Dich nicht wegen 'Order', das kommt noch weg und 'action' an diese Stelle.

Der Unterstrich, den ich schon erwähnte wird noch vor 'fileName' gesetzt.
Damit sollte sich 'action_fileName' in 'param' ergeben, also z.B. 'delete_meinFile.txt' oder 'download_meinFile.txt'

Der Haken ist, daß nur _fileName in C++ ankommt.

Wie prüfe ich denn den Inhalt von 'param'?

Ich hatte vorher mit:

Code:
//oben gesetzt:
var Order = action + '_' + fileName;
      function sendtoMC(Order) {
            fetch('dir?' + 'feedback-from-fetch=' + Order,
 {method: 'post',
            })
            .then...
        }

also alle Daten in die erste Zeile gesetzt, den vollständigen String 'action_fileName' im C++ Code bekommen.
Allerdings funktionierten einige Sachen nicht wie das Neuladen der Webseite. Von Hand: per Firefox-Button erschien dann die aktualisierte Seite.
Aber als ich einen "original gebliebenen" Submit-Button (z.B. Upload) betätigte, reagierte C++ wie gewohnt.
Daher hoffe ich daß die Button- Simulation mit Fetch gelingt, evtl. schon wenn das 'params'- Problem gelöst ist.
 
Zuletzt bearbeitet:

Sclero2004

Mitglied
Guten Morgen, colalkoholiker,
Du hast die Funktion function sendtoMC(Order) gepostet. Wie rufst Du die denn auf, was übergibst Du als Parameter Order?

Du fragst, was das Fragezeichen in der URL bedeutet. Es hängt mit GET-Parametern zusammen, Du kannst es hier nachlesen:

Mit GET und POST bin ich in Javascript und PHP gut vertraut aber nicht in deiner Umgebung mit dem MC. Wenn ich das richtig sehe ist weder Webserver noch GET- und POST-Parameter nativ in C++ drin und es braucht eine Bibliothek. Welche verwendest Du?
 

colaholiker

Mitglied
Hallo,
die Funktion
Code:
function sendtoMC(Order)
rufe ich momentan entweder aus
Code:
function handleFileName
auf (s.Posting #8) auf (wenn es um download, rename geht, und wenn der Dialog gebraucht wird rufe ich sie im Eventlistener auf:
Code:
            if (event.target.id == 'confirm-action') {
                event.preventDefault();
                const
                fileName = document.getElementById('filename-dialog').textContent,
                action = document.getElementById('action-dialog').textContent;
                console.log('confirm file ' + fileName + ' action ' + action);
                var Order = action + '_' + fileName;
                sendtoMC(Order);
            }

Hier entsteht die Variable "Order", die ich zZt. wieder verwende:
Code:
        function sendtoMC(Order) {
            const params = new FormData();
            params.append('0', Order);
            fetch('dir?', {method: 'post',
                body: params
            })
            .then(response => { response.text() })
            .then(text => {
                document.getElementById('feedback-from-fetch').innerHTML = text;
            });
            document.getElementById('dialog').close();
        }
In C++ wird der Inhalt des 'Argument(0)' abgefragt (welcher der Variablen 'Order' entspricht.

Naja, ich teste viel rum. Die Funktion Delete wird mit obiger Fetch-Variante (aber ohne Neuladen der Site) ausgeführt, Download nicht (obwohl die Verteilung zu den Unrerroutinen in C++ klappt).
Was ich als nächstes probieren möchte ist, abwechselnd "echte" Submit-Buttons und die über Fetch in die Tabelle zu setzen, um zu sehen was C++ genau macht.

Der Webserver meiner Library müßte dieser sein:

https://github.com/zhouhan0126/WebServer-esp32/tree/master/examples/SDWebServer

Von dem Beispiel SDWebServer.ino dort habe ich meinen Code abgeleitet.
 

colaholiker

Mitglied
Hallo wieder,
...
ich habe jetzt eine Version meiner Tabelle erstellt, wo direkte Löschbuttons und solche, die die Fetch- Routine nutzen zusammen getestet werden können.

Beide Varianten führen das Delete aus, aber leider nur bei den direkten Buttons wird die Webseite akutalisiert (bedeutet es erscheint eine "Bestätigungsseite". Ein "Back"-Button lädt dann erst die aktualisierte Tabelle).

Das Problem sehe ich in der Fetch-Routine:

Code:
    function sendtoMC(Order) {
        const params = new FormData();
        params.append('1', Order);
        fetch('dir?', {method: 'post',
            body: params
        })
        .then(response => { response.text() })
        .then(text => {
            document.getElementById('feedback-from-fetch').innerHTML = text;
        });
        document.getElementById('dialog').close();
    }

Da sagt die Console:
"Uncaught (in promise) TypeError: document.getElementById(...) is null"

Die "Id('feedback-from-fetch')" ist ja noch eine Angabe aus dem anderen Thread.

- Wie entsteht diese ID und fehlt da evtl. eine Rückmeldung vom C++ Code?

Zu den "params":
Da muß ich mindestens 2 eintragen, daher: "params.append('1', Order);"
Mit '0' oder '1' wollte ich nur testen, ob (in C++)
"String Order = server.arg(0);" das Argument arg() aus Javascript heraus beziffert werden kann, jedoch hat die '0' oder '1' in 'params' überhaupt keinen Effekt.
'Order' ist ja ein String in Form "delete_myfilename.txt".

- wie bekomme ich 'params' sauber hin ohne '1'?

Ich hatte mal nach 'method: 'post', mode: 'no-cors',' eingefügt um evtl. auf Console: "...ById(...) is null" zu reagieren: die Fehlermeldung blieb bestehen.

- ist das die richtige Stellle dafür um Rückmeldungen zu ignorieren oder kann ich 'no-cors' so nicht benutzen?
 

Sclero2004

Mitglied
Code:
document.getElementById('feedback-from-fetch').innerHTML = text;
bedeutet, dass in ein Element mit der ID "feedback-from-fetch" die Antwort von Server als HTML eingetragen wird. D. h. Du musst ein solches Element in der HTML-Seite anlegen, z. B.
Code:
<div id="feedback-from-fetch"></div>
dort wo die Antwort angezeigt werden soll.
dann wirst Du sehen, was vom Server zurück kommt und wir können überlegen, was wir damit machen. Wünschenswert wäre, dass die Seite sofort nach dem fetch aktualisiert wird ohne Neuladen oder Back. Und das ist ganz sicher auch machbar.

Die Frage wegen des/der Parameter kann ich leider nicht beantworten. Ich hatte nach deinem vorletzten Posting auch einen Blick auf diese Bibliothek geworfen aber bin auf die Schnelle nicht daraus schlau geworden. Doku war leider überhaupt keine dabei. Aber vielleicht kannst Du den Entwickler anschreiben und dir erklären lassen, wie das mit dem/den POST-Parameter(n) funktioniert.
 
Oben