Supposons que votre processus de soumission nécessite deux formulaires. La soumission du 2ème formulaire déclenche un email. Que faites-vous si le second formulaire n'est pas soumis? Dites à l'utilisateur d'oublier ou de fermer la fenêtre par accident.
Ma seule solution consistait à mettre à jour la base de données avec un indicateur de la soumission du premier formulaire identifiant qu'un courrier électronique n'avait pas été envoyé. La soumission du second formulaire déclenchera un événement pour envoyer un courrier électronique et mettra à jour la base de données avec un indicateur identifiant qu'un courrier électronique a été envoyé. Un travail cron sera exécuté périodiquement pour rechercher d'éventuels courriers électroniques non envoyés, collecter les informations et envoyer un courrier électronique.
Est-ce la meilleure façon de régler le problème?
Merci.
Edit: Clarity
Formulaire 1 L'utilisateur soumet des données générales
Message 1 Utilisateur présenté avec un choix. L'utilisateur doit choisir de "passer" ou "accepter". Si l'utilisateur soumet le formulaire "accepter" (formulaire 2), un courrier électronique est envoyé. Si l'utilisateur soumet le formulaire "pass" (formulaire 2), un autre message lui est présenté avec un autre choix (formulaire 3). Si l'utilisateur ne fait rien, le dernier choix fourni est son choix par défaut, mais à ce stade, un courrier électronique doit encore être envoyé.
J'espère que c'est plus clair.
Étant donné que HTTP est sans état, le seul moyen de savoir si un utilisateur a soumis le premier formulaire une fois le navigateur fermé consiste à utiliser un mécanisme de persistance (par exemple, une base de données), comme vous l'avez fait auparavant.
Cependant, vous pouvez rencontrer un problème si les utilisateurs envoient le premier formulaire et que le travail périodique s'exécute avant d'avoir la possibilité de soumettre le deuxième formulaire. Vous voudrez peut-être également vérifier qu'un certain laps de temps s'est également écoulé.
Théoriquement, vous pouvez également essayer de détecter la fermeture du navigateur et utiliser cet événement pour déclencher une action, mais je le déconseille vivement .
Cela dépend pourquoi vous vous inquiétez de cela.
Si votre préoccupation est d'avoir des données incomplètes dans votre base de données, nous vous suggérons de conserver les données saisies dans la session utilisateur jusqu'à ce que l'utilisateur remplisse le deuxième formulaire, puis met à jour la base de données et envoie le courrier électronique. Si l'utilisateur ne se donne pas la peine de remplir le deuxième formulaire, l'échange complet sera oublié une fois sa session expirée.
Si vous craignez que les utilisateurs ne se rendent pas compte qu'ils doivent remplir le deuxième formulaire, vous devez fortement envisager de redéfinir les formulaires (éventuellement en les fusionnant). Ceci est un problème d'interface utilisateur.
Avoir un drapeau (comme discuté dans la question) pourrait aider à identifier si cela se produit, mais il ne vous dira pas si cela se produit par erreur de l'utilisateur ou simplement parce que l'utilisateur a perdu tout intérêt (sauf si vous avez un public captif quelconque).
Une alternative, si vous pouvez vous connecter lorsque la session d’un utilisateur arrive à expiration (c’est assez simple avec les sites Java, je ne connais pas cette fonctionnalité dans les autres technologies côté serveur), vous pouvez rechercher des transactions incomplètes à ce stade point.
Comme vous le décrivez, vous devez disposer d'une state
du processus dans votre base de données pour identifier les étapes terminées.
Maintenant, la prochaine étape dépend de la technologie utilisée.
Pour ASP/ASP.NET, un événement est déclenché ( côté serveur ) à l'expiration de la session. effectuer le nettoyage/l'auto-achèvement de la procédure.
Je ne suis pas sûr que cela soit possible dans PHP environnements _ bien que .. je suppose que vous pourriez stocker un horodatage une fois la première étape terminée et qu'un travail cron sera exécuté périodiquement mais vérifiez d'abord avec l'horodatage = pour voir si un laps de temps s'est écoulé avant la finalisation automatique.