Wenn die Formular-API ein Formular generiert, wird auch ein Token generiert, das mit dem Formular in einem ausgeblendeten Feld ausgegeben wird und voraussichtlich zurückgegeben wird. Wenn dies der Fall ist, wird das Formular verarbeitet.
Wenn eine gerenderte Form beispielsweise von Varnish zwischengespeichert werden soll, bricht dieser Mechanismus. Der erste Benutzer, der das Formular sendet, verwendet das Token. Folgende Versuche, das Formular zu verwenden, werden abgelehnt.
Welche Strategien stehen zur Verfügung, um Formulare beim Zwischenspeichern des gerenderten Formulars funktionsfähig zu halten?
Antworten:
Ich verwende BOA für meine Websites, aber standardmäßig deaktiviert BOA einfach das Front-End-Caching im laufenden Betrieb für Formularübermittlungen. Über meine tatsächliche Erfahrung hinaus stieß ich auf ein einjähriges künstliches Kreuz, wie die New Zealand Post mit Drupal & Varnish und dem Formular-Token-Problem umgeht. Holy John Wayne, es ist ein Muss für Drupal Caching - wirklich. Konzentrieren Sie sich nur auf das Formularproblem:
Sie können Formular-Token auch deaktivieren, wenn die XSRF-Produktion in form_alter (nicht gesetzt ($ form ['# token']);) oder ($ form ['# token'] = FALSE;) nicht erneut angefordert wird.
Ein Acquia Drupal Performance-Artikel enthält a Drupal-Modul-Authcache vorgestellt. Wenn Sie jedoch das Dokument in Authcache lesen, wird das Caching mit einem Platzhalter für das Formular berechnet ( das Formular wird nicht zwischengespeichert):
Die Strategie ist, alles außer dem Formular zwischenzuspeichern . Also alles andere ansprechen: Vielleicht wird Lack überhaupt nicht verwendet, Memcache & Redis? Meine Strategie wäre es, das zu verwenden, was BOA bietet, weil ich BOA und die dahinter stehenden Assistenten verwende ( omega8.cc ) eine Tonne mehr wissen als ich. Ich glaube nicht, dass es einen externen Cache gibt, der das Problem löst. Sie scheinen alle für die Form zu umgehen.
Führen Sie ein teilweises Caching mit dem oben genannten Authcache und mit fein abgestimmten Ansichten und Bedienfeldern durch, wie im Artikel und in der NZ Post erwähnt vom Brain Trust bei Wunderkraut beschrieben - es ist alt, aber es behebt das Problem.
Verwendung Drupal ESI - Modul und Varnish ist teilweise ESI - konform):
Hoffe das ist hilfreicher.
quelle
Eine mögliche Lösung wäre, das Token zusammen mit zu deaktivieren
$form[‘#token’] = FALSE;
und dann den Rückruf zum Senden zu überschreiben, anstatt den Kommentar tatsächlich zu veröffentlichen, das ursprüngliche Formular mit einem Token neu zu generieren und den Benutzer zu bitten, den Beitrag zu bestätigen.Wenn der Benutzer ECMAScript unterstützt , kann die Benutzererfahrung verbessert werden, indem eine Serviceressource vorhanden ist, die die Formulargenerierung neuer Formulartoken verfügbar macht und das entsprechende Formular in das Formular einfügt
form_cache
. Sobald sich der Benutzer auf das Formular konzentriert und es wahrscheinlich senden möchte, deaktivieren Sie die Schaltfläche "Senden", rufen Sie ein neues Token ab, fügen Sie es in das bereits gerenderte Formular ein und aktivieren Sie die Schaltfläche "Senden" erneut.quelle