PHP im Javascript ergänzen, ich brauche Variablen

Das ist jetzt wirklich eine Menge, ist aber wahrscheinlich weniger durch das Drag&Drop bedingt.
Erst Mal dies kritisch prüfen:
Code:
        <?
            foreach ($db_akt_benutzer as $aktor) {
            $li_item = 'li_item_$aktor["id"]';
            ?>
                <table id="$li_item" class="li_item" border="1" draggable="true" bgcolor="#CECECE">
                 <tr>
In der 3. Zeile wird die ID nicht eingesetzt weil der String in einfachen Hochkommas steht. Besser anders herum:
Code:
$li_item = "li_item_{$aktor['id']}";
Und in der 5. Zeile ist kein PHP aktiv, deshalb wird die Variable $li_item ebenfalls nicht durch ihren Wert ersetzt.
Und dem Variablennamen besser ein "id" hinzu fügen: $id_li_item.

Was die Radiobuttons betrifft, gibt es zwei Lösungen:
  1. Sie funktionieren unabhängig, wenn sie in verschiedenen Formularen stehen, auch wenn sie den selben Namen haben.
  2. Du kannst den Namen einfach durch die ID erweitern, dann wird er auch über Aktoren hinweg eindeutig.
Ich überblicke den Zusammenhang noch zu wenig, um beurteilen zu können, welches für dich besser geeignet ist.

Eine Verständnisfrage taucht noch auf: Ich verstehe das so, dass dieses Zusammenstellen durch Drag&Drop zunächst Mal nur eine Art Entwicklungsvorgang ist und dass die Elemente zu dem Zeitpunkt noch gar nicht bedient werden. Richtig?

Und ich frage mich, wie eine solche Sequenz von Aktoren dann in der Datenbank gespeichert werden soll? Diese Sequenz ist wahrscheinlich das, was Du als Szene bezeichnest. Willst Du das komplette HTML speichern? Das wäre ein wenig ineffizient. Wahrscheinlich besser nur die Parameter speichern und bei Bedarf aus der DB auslesen und das HTML erzeugen.

Edit: Möglicher Weise habe ich da etwas falsch verstanden: Die Aktoren in der Liste sollen gar nicht manuell bedient werden sondern Aktionen in einem automatisierten Vorgang auslösen, richtig?
 
Zuletzt bearbeitet:
Eine Verständnisfrage taucht noch auf: Ich verstehe das so, dass dieses Zusammenstellen durch Drag&Drop zunächst Mal nur eine Art Entwicklungsvorgang ist und dass die Elemente zu dem Zeitpunkt noch gar nicht bedient werden. Richtig?

Ja, naja so oder so. Ich ziehe die Aktoren halt in die Liste, die ja später eine komplette Szene ergibt, wenn die Schaltbefehle der Aktoren nacheinander abgearbeitet werden. Somit sage ich also spätestens in der Szene, was der Aktor in der Szene nun machen soll. Von der Funktionalität ist es letztendlich egal, ob ich erst "on" drücke, und den Aktor dann in die Liste ziehe, oder ob ich ihn in die Liste ziehe, und erst dort "on" drücke. Wichtig ist, dass die Schaltbefehle der Aktoren nacheinander abgearbeitet werden, wenn die Szene aufgerufen / gestartet wird.

Wahrscheinlich besser nur die Parameter speichern und bei Bedarf aus der DB auslesen und das HTML erzeugen.
Genau so hab ich es mir gedacht.
Die Szene ( oder die Sequenz ist auch richtig ) bekommt einen Namen, eine ID, und den abzuarbeitenden Inhalt. Also z.B.:
[Aktor-ID 1: AN, Aktor-ID 7: AUS, Aktor-ID 12: Dimmen auf 30]
So könnte eine Sequenz aussehen. Die jeweiligen http-Request sind in der eigentlichen Datenbank der Aktoren für jeden einzelnen Aktor hinterlegt.
Ein Aktor kann auch mehrfach in einer Liste auftauchen. Z.B. man geht Abends ins Bett. Szene:
Flurlicht an -> Wohnzimmerlicht aus -> Schlafzimmerlicht an -> Pause 30 Sekunden, bis man durch den Flur gelaufen ist -> Flurlicht aus.
Es braucht also ein Feld in der Datenbank, wo diese Abfolge hinterlegt ist. Szenen sind nicht unendlich lang, können aber durchaus 40 oder sogar 50 Befehle enthalten, die abzuarbeiten sind.
Wichtig dabei: Das muss natürlich editierbar sein. Also möchte ich das Ganze später auch nochmal in diese Liste laden können, um eine Abfolge zu ändern, Aktoren zu ergänzen, oder zu entfernen, usw.
Es kommt also noch so Einiges.

Ich hab das nun geändert:
Code:
<form action="index.php?page=drag_send" method="post">
    <ul class="dest-ul" style="padding:25px;"></ul>
    <ul class="dest-ul" style="padding:25px;"></ul>
    <ul class="dest-ul" style="padding:25px;"></ul>

    <ul id="photos">
        
        <?
            foreach ($db_akt_benutzer as $aktor) {
            $id_li_item = "li_item_{$aktor['id']}";
            ?>
                <table id="<?=$id_li_item;?>" class="li_item" border="1" draggable="true" bgcolor="#CECECE">
                 <tr>
                  <td colspan="3">Name: <?="$aktor[name]";?> - ID: <?="$aktor[id]";?></td>
                 <tr>
                 <tr>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=on>AN </td>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=off>AUS </td>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=toggle>TOGGLE </td>
                    
                 </tr>
                 <?
                     if("$aktor[typ]" == "dimmer") {
                    ?>
                        <tr>
                         <td colspan="3">
                            <input type="radio" name="action_<?="$aktor[id]";?>" value="dim">DIMM &nbsp;&nbsp;<input type="range" min="0" max="98" step="1" value="50" id="foo" name="bright" onchange='document.getElementById("bar").value = "Slider Value = " + document.getElementById("foo").value;'/>
                         </td>
                        </tr>
                    <?
                    }
                 ?>
                 <input type="hidden" name="aktor_id" value="<?="$aktor[id]";?>">
                    <input type="hidden" name="name" value="<?="$aktor[name]";?>">
                    <input type="hidden" name="action" value="">
                    <input type="hidden" name="bright" value="">
                </table><br>
            <?
            }
        ?>
        
    </ul>
<input value="speichern" class="button" type="submit" tabindex="3">
</form>

Ich weiß gar nicht, ob das für mein Vorhaben nicht doch der falsche Ansatz ist....
 
Liest sich eigentlich alles ganz vernünftig.
Wenn ich mir deinen Code ansehe, denke ich, dass die Quellliste mit den Aktoren außerhalb des Formulars liegen sollte und die Zielliste innerhalb. Denn letzten Endes gespeichert werden soll ja letztere mit den Aktionen. Und es braucht nur eine Zielliste, dass es mehrere sind, kommt nur daher, dass ich mein Beispiel ursprünglich für etwas anderes gemacht hatte.
 
Zuletzt bearbeitet:
Guten morgen,

Also, es nähert sich, aber aktuell ergeben sich 3 Probleme:

1. Ich bekomme es nicht hin, dass ein Aktor in der Szene den Wert des Radiobuttons,
und ggfs. des Dimmers im Formular zum speichern übermittelt. Diese blöden Radiobuttons...!
Wie muss ich das machen? Wie bekomme ich den Wert in die value???

2. Die Szene besteht ja aus mehren Items. Wie bekomme ich alle nacheinander im Form
übermittelt? Geht da ein foreach im <ul class="dest-ul" style="padding:25px;"></ul>

3. Design-Frage: Die Items in der Szene-Liste sind ja kleine Tabellen. Die stehen direkt untereinander,
ohne Abstand, wie bekomme ich da optisch eine Leerzeile hin? Selbst wenn ich die Items ( also die Tabelle ) um ein <br> erweitere sehe ich das nur in der Item-Auswahl-Liste, aber nicht in der Szene-Liste.

Danke Dir! :-)
 
Guten Morgen!

Zu 1.: Die Radiobuttons einer Gruppe haben ja einen gemeinsamen Namen und jeder einzelne ein value. Normaler Weise findet man im PHP dann einen Post-Parameter mit dem Namen als Schlüssel und dem value des aktivierten Buttons. Wenn das bei dir nicht funktioniert, müsste man genauer hin sehen,.

Zu 2.: Das ist mir auch schon aufgefallen. Ein Formular liefert ja auf Serverseite nur eine Ansammlung von Schlüssel-Wert-Paaren und nicht ein strukturiertes Array wie Du es in #12 beschrieben hast. Dein Ansatz mit einer Schleife geht da schon in die richtige Richtung: Ich würde so vorgehen, dass ich alle Elemente in einer Schleife abarbeite und und die Parameter in einem Objekt speichere. Das Objekt dann zu einem Array hinzu fügen und dieses als JSON mit fetch zum Server schicken und dort, ebenfalls als JSON, in die Datenbank eintragen.

Zu 3.: Besser als br-Tags sind i. allg. Margins um Abstände zu erreichen. Oder auch gap, wenn es sich um Flex- oder Gridlayout handelt. Versuche es damit.
 
Zuletzt bearbeitet:
Tja,

JSON mit fetch zum Server schicken und dort, ebenfalls als JSON
Da ist es wieder.
JSON und ich sind noch immer keine Freunde.
Das kriege ich auch nicht hin.
Was sind die Alternativen?


PHP dann einen Post-Parameter mit dem Namen als Schlüssel und dem value des aktivierten Buttons. Wenn das bei dir nicht funktioniert, müsste man genauer hin sehen,.
Code:
foreach ($db_akt_benutzer as $aktor) {
            $id_li_item = "li_item_{$aktor['id']}";
            ?>
                <table id="<?=$id_li_item;?>" class="li_item" border="1" draggable="true" bgcolor="#CECECE">
                 <tr>
                  <td colspan="3">Name: <?="$aktor[name]";?> - ID: <?="$aktor[id]";?></td>
                 <tr>
                 <tr>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=on>AN </td>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=off>AUS </td>
                  <td><input type=radio name="action_<?="$aktor[id]";?>" value=toggle>TOGGLE </td>
                    
                 </tr>
                 <?
                     if("$aktor[typ]" == "dimmer") {
                    ?>
                        <tr>
                         <td colspan="3">
                            <input type="radio" name="action_<?="$aktor[id]";?>" value="dim">DIMM &nbsp;&nbsp;<input type="range" min="0" max="98" step="1" value="50" id="foo" name="bright" onchange='document.getElementById("bar").value = "Slider Value = " + document.getElementById("foo").value;'/>
                         </td>
                        </tr>
                    <?
                    }
                 ?>
                 <input type="hidden" name="aktor_id" value="<?="$aktor[id]";?>">
                    <input type="hidden" name="name" value="<?="$aktor[name]";?>">
                    <input type="hidden" name="action" value="">
                    <input type="hidden" name="bright" value="">
                </table>

Bei den Margins schau ich mal.
Kann es sein, dass sich die Tabellen in der Item-Auswahl-Liste anders verhalten, als in der
Szenen-Liste? Das kommt mir irgendwie komisch vor....
 
JSON und ich sind noch immer keine Freunde.
Das kriege ich auch nicht hin.
Was sind die Alternativen?
Die Alternative besteht darin, es nach dem old-school-Verfahren zu machen: Eine DB-Tabelle wo in jedem Datensatz nur ein Item steht und eine laufende Nummer, um die richtige Reihenfolge sicher zu stellen. Und ein Name für die Sequenz, um nur die Items auslesen zu können, die zu der betr. Sequenz gehören.
 
OK, beim old-school-Verfahren stellt sich bloß die Frage, wie wir das auf den Server bringen. Eine solche Sequenz in das Korsett eines Formulars zu pressen ist eher nicht zu empfehlen. Also die Items eins nach dem anderen mit fetch weg schicken. Mit JSON dagegen ganz easy: Einen einzigen JSON-String in einem Schritt hoch schicken. Dabei ist auch die Reihenfolge sicher gestellt, keine Notwendigkeit für eine Nummerierung.
 
Zurück