Lorsque l' API Form génère un formulaire, elle génère également un jeton qui est distribué avec le formulaire dans un champ masqué et qui doit être renvoyé. Si tel est le cas, le formulaire est traité.
Si une forme rendue est mise en cache, disons par Varnish , ce mécanisme se casse. Le premier utilisateur soumettant le formulaire consommera le jeton et les tentatives suivantes d'utilisation du formulaire seront rejetées.
Quelles stratégies sont disponibles pour que les formulaires continuent de fonctionner tout en mettant en cache leur formulaire rendu?
Réponses:
J'utilise BOA pour mes sites, mais par défaut, BOA désactive simplement la mise en cache frontale à la volée pour les soumissions de formulaires. Au-delà de mon expérience réelle, je suis tombé sur un artificiel d'un an sur la façon dont le New Zealand Post traite Drupal & Varnish et le problème des jetons de forme. Holy John Wayne, c'est une lecture incontournable pour la mise en cache Drupal - vraiment. En se concentrant uniquement sur le problème du formulaire:
Vous pouvez également désactiver les jetons de formulaire lorsque la production XSRF n'est pas requise avec dans form_alter (unset ($ form ['# token']));) ou ($ form ['# token'] = FALSE;)
Un article sur les performances d' Acquia Drupal propose un module Drupal Authcache , mais en lisant le document sur Authcache, il établit la mise en cache avec un espace réservé pour le formulaire (pas la mise en cache du formulaire):
La stratégie consiste à tout mettre en cache , sauf le formulaire . Donc, pour tout le reste: peut-être que Varnish n'est pas utilisé du tout, Memcache & Redis? Ma stratégie serait d'utiliser ce que BOA propose car j'utilise BOA et les assistants derrière lui ( omega8.cc ) en savent plus que moi. Je ne pense pas qu'il existe un cache externe qui résout le problème. Ils semblent tous contourner la forme.
Faites une mise en cache partielle avec l'authcache susmentionné et avec des vues et des panneaux finement modifiés, comme mentionné dans l'article du NZ Post et décrit par le brain trust de Wunderkraut - son ancien, mais résout le problème.
Utiliser le module Drupal ESI et le vernis est partiellement conforme ESI):
J'espère que c'est plus utile.
la source
Une solution potentielle serait de désactiver le jeton tous ensemble
$form[‘#token’] = FALSE;
, puis de remplacer le rappel de soumission à au lieu de publier le commentaire, de régénérer le formulaire d'origine avec un jeton et de demander à l'utilisateur de confirmer la publication.Si l'utilisateur prend en charge ECMAScript , on pourrait améliorer l'expérience utilisateur en ayant une ressource de services qui expose la génération de formulaires de nouveaux jetons de formulaire et insère le formulaire pertinent dans le
form_cache
. Ensuite, dès que l'utilisateur se concentre sur le formulaire et est donc susceptible de vouloir le soumettre, désactivez le bouton de soumission, récupérez un nouveau jeton et insérez-le dans le formulaire déjà rendu, puis réactivez le bouton de soumission.la source