Hallo ReiniG,
Und wo und wie baue ich da die AJAX Funktion ein? Etwa als change-Ereignis?
Via addEventListener kannst du eine Funktion bestimmen, die auf ein bestimmtes Ereignis reagiert. Du kannst das Event auch auf das übergeordnete Element registrieren – das ist das hier schon mehrfach erwähnte „Bubbling“:
<!doctype html>
<html>
<meta charset="utf-8">
<form id="test">
<label><input type="checkbox" id="1"> Erster</label>
<label><input type="checkbox" id="2"> Zweiter</label>
<label><input type="checkbox" id="3"> Dritter</label>
</form>
<script>
function test(event)
{
var elem = event.target;
console.log(elem.getAttribute('id'));
}
document.getElementById('test').addEventListener('change', test);
</script>
Brauche ich bei dieser Vorgehensweise überhaupt ein flock() beim Auslesen der Datei?
Ich meine ja, weil mir ja sonst ein anderer Prozess die Datei während des Lesevorgangs verändern kann (die dabei eingelesene Datei könnte dann ja einen inkonsistenten Datenbestand enthalten). Beim Auslesen kannst du ja so sperren, dass weiterhin andere Prozesse lesen können. Beim Schreiben exklusiv.
Wie handhabe ich das mit "temporär"?
In einer Datenbank würde man die Session-ID des reservierenden Nutzers und das Eintragedatum beim betreffenden Sitzplatz speichern und dann beim Auslesen kontrollieren, ob die spezifizierte Zeitspanne schon abgelaufen ist (dann einfach neue Session-ID und Zeitstempel ablegen) und wenn nicht, ob der aktuelle Nutzer der war, der den Sitzplatz reserviert hat.
Ich ändere ja bei der Anfrage direkt in der Datei bei jenem Sitzplatz den Status.
Vielleicht solltest du lieber eine Datenbank, beispielsweise MySQL/MariaDB benutzen.
Damit ist für jede neue Abfrage dieser Platz nicht mehr verfügbar. Außer der User gibt ihn selbst wieder frei. Aber ...
Wenn der Nutzer nicht innerhalb einer gewissen Zeit auf „Karten kaufen“ drückt, gibt der Server die markierten Plätze wieder frei.
s. o.: Du brauchst erst beim Anzeigen des Formulars zu überprüfen, ob der Platz noch vorgemerkt ist.
Nachdem er alle gewünschten Plätze gewählt hat, drückt der Nutzer „Karten kaufen“... Hier muss der Nutzer tatsächlich auf die Bestätigung vom Server warten, dass auch wirklich alle gewünschten Plätze für ihn reserviert wurden. D.h. nachdem der User hier ja nach jedem Auswählen eines Platzes eine visuelle Rückmeldung vom Server bekommt, dass der jeweilige Platz für ihn reserviert (oder eben bereits von jemand anderen inzwischen reserviert) wurde, brauche ich da noch eine Session? Zum check-out auf einer anderen Seite werden die gewählten Sitze ja über das Formular übertragen.
Prinzipiell reicht das aus, aber wenn die Nutzer sich Karten für wenige Minuten „vorreservieren“ können sollen, musst du sie schon irgendwie wieder erkennen und dafür bräuchtest du halt die Session.
Alternativ kannst du es dir auch einfach machen und die Verfügbarkeit eines Platzes nur beim Laden des Formulars prüfen und dann noch einmal bei der endgültigen Registrierung, dafür brauchst du dann kein Ajax. Falls dein Formular nicht den Andrang wie das von Apple für deren „keynote“ hat, würde ich auf das Überprüfen und Vormerken erst beim finalen Speichern machen und dem Nutzer im Falle eines oder mehrerer nicht mehr freien Platzes das Formular noch einmal zur Bearbeitung vorsetzen (die bisherigen Eingaben natürlich wieder laden!).
Und was mache ich, wenn der User dann die Karten nicht kauft oder beim Zahlvorgang etwas schiefgeht oder er zurückgeht und die Auswahl ändert?
Für den Fall, dass du das mit einem Zeitstempel löst, läuft die Zeit einfach ab und der Platz kann neu vergeben werden. Wenn du ein „dummes“ Formular ohne Ajax benutzt, wird der Platz ja erst beim endgültigen Kauf reserviert.
Gruß
Julius
„Unterschätze niemals die Datenübertragungsrate eines mit Bändern vollgeladenen Kombis, der über die Autobahn rast.“
– Andrew S. Tanenbaum (Quelle)