• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Übergabe von JS variable zu PHP ohne Seitenaufruf

BinarySoul

New member
Hallo,

ich habe folgendes Problem. Ich muss einen Wert von PHP erzeugen lassen. Diesen dann per Javascript auslesen und wieder zurück an PHP schicken.
Das klingt jetzt verwirrend. Aber ich versuch das mal zu erklären:
Ich benutze das Framework "Laravel". Dieses zieht daten aus einer Datenbank und schreibt diese in eine Tabelle.
In jeder Tabellenreihe soll ein Button sein, der ein Menü aufruft, den Datensatz dieser Reihe zu bearbeiten.
Das bearbeiten funktioniert aber nur, wenn Laravel die ID des Objekts besitzt das ich bearbeiten will.
Und genau diese geht unterwegs verloren.

Die Tabelle wird mit foreach erzeugt. Für jedes Element aus der Datenbank wird eine neue tr erzeugt. Der code dazu sieht so aus:
PHP:
                <table class="table table-bordered table-hover tile">
                    <thead>
                    <th>ID</th>
                    <th>Filmname</th>
                    <th>Erschienen am:</th>
                    <th>Regie führte:</th>
                    <th>Genre:</th>
                    <th>Thema:</th>
                    <th>Bild zum Film:</th>
                    <th>Eingereicht durch:</th>
                    <th>Eingereicht am:</th>
                    <th>Bearbeiten:</th>
                    </thead>

                    @foreach ($output as $titles)
                        <tr>
                            <td>{{$titles->id}}</td>
                            <td>{{$titles->movieName}}</td>
                            <td>{{$titles->releaseYear}}</td>
                            <td>{{$titles->director}}</td>
                            <td>{{$titles->genre}}</td>
                            <td>{{$titles->topic}}</td>
                            <td><a href="{{$titles->picture}}" target="_blank">Klick!</a></td>
                            <td>{{$titles->user->nickName}}</td>
                            <td>{{$titles->created_at}}</td>
                            <td><a data-toggle='modal' href='#userDialog'><span class="glyphicon glyphicon-list-alt"></span></a></td>
                        </tr>
                    @endforeach
                </table>
Wenn ich am ende der Tabelle auf das Icon klicke, das Modal sich öffnet und ich die Optionen "Bearbeiten", "Löschen" und "Moderator informieren" dann brauch ich für jede dieser 3 Optionen die information um welchen Film es sich handelt. Diese kann ich aber nicht einfach mit {{titles-id}} auslesen, weil ... genau weiß ich auch nicht wieso, jedenfall ist die ID dann immer "1" egal wohin man klickt.

Ich muss also die ID irgendwie ins Modal befördern.
Mein Ansatz war jetzt das ganze mit JS zu machen. Und zwar mit diesem Skript:

Code:
function findRowInTable() {
    $('#userDialog').on('show.bs.modal', function (event) {
        var button = $(event.relatedTarget);
        var getID = button.data('edit-id');
        var getName = button.data('movie-name');
        $('#moviename').text('Filmname: ' + getName);
        $('#edit').attr('data-set-id' , getID);
    });
}

Ausserdem habe ich natürlich den Link, wie folgt geändert:
HTML:
<td><a data-toggle='modal' href='#userDialog' data-edit-id='{{$titles->id}}' data-movie-name='{{$titles->movieName}}'><span class="glyphicon glyphicon-list-alt"></span></a></td>

Und das Modal ebenfalls angepasst:
HTML:
                        <div class="modal-header">
                            <h4 class="modal-title" id="movieID">Was möchtest du tun?</h4>
                        </div>
                        <div class="modal-body">
                            <div class="block-area" id="tableHover">
                                <div class="table-responsive overflow">
                                    <table class="table table-bordered table-hover tile">
                                        <thead>
                                        <th id="moviename"></th>
                                        </thead>
                                        <tbody>
                                        <tr>
                                            @if ($titles->user_id == Auth::user()->id)
                                            @endif
                                            <td><span class="glyphicon glyphicon-edit"></span>  <a href="" id='edit' data-set-id="">Diesen Film editieren</a></td>
                                            </tr>
                                            <tr>

                                            <td><span class="glyphicon glyphicon-trash"></span>  <a href="">Diesen Film löschen!</a></td>
                                            </tr>

                                        <tr>
                                            <td><span class="glyphicon glyphicon-facetime-video"></span>  <a href="subscribeMovie">Diesen Film einem Moderator melden!</a>
                                            </td>
                                        </tr>
                                        <tbody>
                                    </table>
                                </div>
Was ich jetzt brauche ist eine Möglichkeit, wie ich in PHP den Inhalt von "data-set-if" auslese und in eine Variable speichern kann.
Oder eine wesentlich weniger umständliche Lösung.

Hat dazu vielleicht jemand eine Idee?
 
an deinen formulierungen glaube ich zu erkennen, dass du den unterschied zwischen client und server noch nicht verinnerlicht hast. php + mysql = server, JS + html = client
ich denke, darin liegt die lösung
 
an deinen formulierungen glaube ich zu erkennen, dass du den unterschied zwischen client und server noch nicht verinnerlicht hast. php + mysql = server, JS + html = client
ich denke, darin liegt die lösung
Ich bin mir sehr sicher den Unterschied zu verstehen. Das Problem ist das ich eigentlich Ruby on Rails Programmierer bin und noch nie zuvor mit PHP arbeiten musste. In RoR hat man solche Probleme nicht. Wenn das Model dir da einen Wert zurückliefert, dann kannst du ihn auch benutzen. PHP scheint das nicht zu können, deswegen diese Verrenkungen mit extra JS Scripten etc.
Wenn ich nur eine Variable bräuchte ohne Rücksicht auf meine Seite, würde ich JS anweisen, diese zum Server per POST zu schicken, das geht aber nicht, da ich die Seite nicht aktualisieren kann (da sich sonst das Modal wieder schließt.). Und genau deswegen schreibe ich das hier.



Ich glaube genau da liegt dein Problem. Zeig' doch mal, wie du das versucht hast.

Nun ich hab ja diesen Wert, aus der Datenbank der mir die Daten zurückliefert. Dieser wird, Framework-bedingt durch {{}} eingebunden.
Ich kann also überall auf PHP Variablen via {{$variablenname}} zugreifen. Diese erscheint im Text dann so, als würde ich sie mit Echo ausgeben lassen.
Mit @foreach lasse ich das Array das ich in $output geliefert bekomme, aufteilen in einzelne Segmente ($titles).

Danach öffne ich dann das Modal durch einen klick auf einen Link und sage im Modal z.B. als Titel {{$titles->movieName}}.
Und an dieser Stelle bekomme ich stets den Namen des Films mit der ID "1", egal in welche Tabellenzeile ich klicke. Aus irgendeinem Grund lässt sich das Array $titles nur innerhalb der Foreach schleife Ordnungsgemäß nutzen.
Zuerst dachte ich, dass sei ein Problem mit dem NameSpace. Aber die Variable ist ja noch da, sie steht eben nur auf "1" (bzw. auf den Werten des Films mit der Datenbank ID "1").

HTML:
<h4 class="modal-title" id="movieID">Was möchtest du tun?</h4>
                        <div class="modal-body">
                            <div class="block-area" id="tableHover">
                                <div class="table-responsive overflow">
                                    <table class="table table-bordered table-hover tile">
                                        <thead>
                                        <th id="moviename">{{$titles->movieName}}</th> <!-- Gibt immer "The Crow" zurück, weil es eben der erste Film in der DB ist. -->
                                        </thead>
                                        <tbody>
                                        <tr>
                                            @if ($titles->user_id == Auth::user()->id)
                                            <td><span class="glyphicon glyphicon-edit"></span> <a href=""> Diesen Film Bearbeiten</a></td>
                                            </tr>
                                            <tr>
                                            <td><span class="glyphicon glyphicon-trash"></span>  <a href="{{ route('deleteMovie', ['delete_id' => $titles->id]) }}">Diesen Film löschen!</a></td> <!-- was dazu führt das auch immer dieser Film gelöscht wird, und nicht der, auf den man geklickt hat. -->
                                            </tr>
                                        <tr>
                                             @endif
                                            <td><span class="glyphicon glyphicon-facetime-video"></span> <a href="">Diesen Film einem Moderator melden!</a>
                                            </td>
                                        </tr>
                                        <tbody>
                                    </table>
                                </div>
                            </div>
                        </div>


Daher war der Plan, während der Erstellung der Tabelle innerhalb der foreach-Anweisung die ID in das Data-Attribut des Links zu schreiben. Sie dort mit Javascript dann auszulesen und in den Link zu schreiben der sich in dem Modal befindet. Das hat ja auch super funktioniert, kein Hexenwerk. Dummerweise müsste ich die ID jetzt nur irgenwie wieder aus dem Data-Attribut zurück an den Server schicken um sie mit PHP nutzen zu können. Und genau da hakts. Denn sobald ich die Seite neu lade, klappt ja das Modal direkt wieder zu, es muss also anders gehen.

Von mir aus auch ganz ohne JS, wenn jemandem eine Lösung einfällt.
 
Zurück
Oben