@@ -354,6 +354,25 @@ Vote-Button, Kennzeichnung bereits abgegebener Votes.
354354** ` closed ` ** — Fragen und Vote-Zahlen bleiben sichtbar, Formular und
355355Vote-Buttons entfallen, Hinweis auf das Ende der Fragerunde.
356356
357+ Der Reader trennt den member-spezifischen dynamischen Inhalt strukturell in
358+ zwei benachbarte Turbo-Frames:
359+
360+ * ` qna-session-<id>-reader ` enthält ausschließlich Status, Fehlermeldungen und
361+ — nur bei ` open ` und für authentifizierte Mitglieder — das Frageformular.
362+ Dieser Controls-Frame wird lazy geladen, aber nicht periodisch gepollt.
363+ * ` qna-session-<id>-questions ` enthält ausschließlich die Fragenliste samt
364+ Vote-Zahlen und statusabhängigen Vote-Buttons. Nur dieser Frame wird im
365+ konfigurierten Intervall gepollt.
366+
367+ Jede Listenantwort enthält zusätzlich ein deklaratives Turbo-Stream-Update für
368+ den Controls-Inhalt, dessen CSS-Ziel nur bei einem abweichenden Session-Status
369+ existiert. Normales Polling im unveränderten Zustand ` open ` ersetzt das
370+ Formular daher nie; ein Wechsel nach ` waiting ` oder ` closed ` entfernt es aber
371+ spätestens mit dem nächsten Listen-Poll. Beim erfolgreichen Absenden wird der
372+ Controls-Inhalt einmalig gezielt ersetzt, damit das Formular geleert wird.
373+ Eine 422-Antwort rendert dagegen den Controls-Frame mit Fehlermeldung und dem
374+ serverseitig erneut ausgegebenen Fragetext.
375+
357376### 5.4 Sortierung Teilnehmeransicht
358377
359378``` sql
@@ -579,6 +598,19 @@ neu laden — das ist der häufigste Implementierungsfehler in diesem Aufbau.
579598Empfohlen: ` loading="lazy" ` mit neutralem, nicht member-spezifischem
580599Initial-Markup, damit die umgebende Seite cachebar bleibt (Abschnitt 8).
581600
601+ Im Reader besteht dieses neutrale Initial-Markup aus zwei lazy Frames. Der
602+ nicht gepollte Controls-Frame hält Status und Frageformular; der gepollte
603+ Questions-Frame hält Fragen und Votes. Das Formular zielt mit
604+ ` data-turbo-frame ` auf den Questions-Frame. Nach dem POST folgt Turbo dem
605+ 303-Redirect dorthin; bei angefordertem Turbo-Stream-Format aktualisiert die
606+ GET-Antwort Liste und Controls getrennt. Damit bleiben PRG und eine sofortige
607+ Listenaktualisierung erhalten, obwohl das Formular außerhalb des Listen-Frames
608+ liegt.
609+
610+ Reader-Liste und Bühnen-Frame verwenden für Polling-Reloads ` refresh="morph" `
611+ und stabile IDs an interaktiven Elementen. Der Formular-Controls-Frame hat
612+ weder ` data-qna-poll ` noch einen Polling-Timer.
613+
582614### 7.3 Polling
583615
584616Turbo pollt nicht von selbst. Die Erweiterung liefert ein ** sehr kleines
@@ -599,6 +631,14 @@ Anforderungen:
599631* keine doppelten Timer nach Turbo-Visits
600632* nur Frames pollen, die im DOM vorhanden sind
601633* keine Geschäftslogik im JavaScript
634+ * kein Polling-Reload, solange der Frame Fokus enthält oder durch eine
635+ laufende Frame-/Formaktion als beschäftigt markiert ist
636+
637+ Die letzte Regel betrifft die im gepollten Bereich verbleibenden Vote-Buttons
638+ und die Sortierumschaltung der Bühne. Das ausgelagerte Fragefeld liegt nicht im
639+ Polling-Frame: Während dort geschrieben wird, aktualisiert sich die Liste
640+ weiterhin. Morphing und stabile IDs decken zusätzlich den engen Fall ab, dass
641+ ein bereits laufender Poll erst während einer beginnenden Interaktion rendert.
602642
603643** Lastabschätzung gehört ins README:** 2500 ms Intervall × Zuschauerzahl ergibt
604644die Requests pro Sekunde auf nicht cachebare Endpunkte. Prüfe, ob die
@@ -630,6 +670,7 @@ Bundle selbst, im eigenen Namensraum:
630670
631671```
632672contao_qna_reader_frame GET
673+ contao_qna_reader_controls GET
633674contao_qna_stage_questions GET
634675contao_qna_question_create POST
635676contao_qna_vote_create POST
@@ -760,12 +801,19 @@ contao/templates/
760801│ ├── qna_session_list.html.twig
761802│ └── qna_session_reader.html.twig
762803└── qna/
763- ├── reader_frame.html.twig
804+ ├── reader_controls.html.twig
805+ ├── reader_controls_frame.html.twig
806+ ├── reader_controls_update.html.twig
807+ ├── reader_questions.html.twig
808+ ├── reader_questions_frame.html.twig
809+ ├── reader_update.stream.html.twig
764810 ├── question_list.html.twig
765811 ├── question.html.twig
766812 ├── stage_overview.html.twig
767813 ├── stage_detail.html.twig
768- └── stage_questions.html.twig
814+ ├── stage_questions.html.twig
815+ ├── stage_content.html.twig
816+ └── stage_update.stream.html.twig
769817```
770818
771819Referenziert wird über die Contao-Hierarchie, nicht über den
0 commit comments