Gestion des erreurs dans les K2 Smartforms

Le saviez vous ? Depuis la version 4.6.7, les K2 Smartforms permettent au concepteur d’intercepter les erreurs que rencontre un formulaire ou une vue, afin de modifier le comportement par défaut, à savoir : afficher une fenêtre modale à l’utilisateur avec le message d’erreur en question, pas toujours très compréhensible ni très esthétique.

Dans cet article, je vais vous montrer comment tirer partie de cette fonctionnalité, ainsi que quelques bonnes pratiques à respecter pour s’assurer qu’elle ne se retourne pas contre vous. C’est parti !

Capter une erreur Smartform

Pour capter une erreur rencontrée par une vue ou un formulaire Smartform, il faut ajouter une règle dans notre vue/formulaire. Pour rappel, une règle en Smartform est découpée en trois parties :

  1. Un événement déclencheur
  2. D’éventuelles conditions
  3. Une ou une plusieurs instructions à exécuter

Ici l’événement déclencheur est de type “When the view executes a method” ou “When the Form raises an event”, puis dans la configuration de l’événement choisir “In Error” :

Ajout d’une règle captant les erreurs rencontrées par un formulaire

Bonne pratique : par souci de factorisation de nos développements, il est recommandé d’ajouter notre règle de gestion d’erreur au niveau d’une vue, plutôt que directement au niveau du formulaire. Nous pouvons créer une vue consacrée à cette tâche, que nous ajouterons sur tous les formulaires de notre application en la cachant, ou alors modifier une vue existante et déjà présente sur les formulaires, comme la bannière ou le pied de page de nos formulaire, par exemple. Il nous suffit ensuite de tirer partie de l’instruction “Execute another rule” dans les règles “When the form is in error” de nos formulaires pour ne pas avoir à recréer plusieurs fois un même jeu d’instructions / conditions sur chacun d’entre eux.

Sur mon formulaire, je ne fais qu’exécuter la règle “in error” de ma vue, dans laquelle j’ai mis toute l’intelligence nécessaire à la bonne gestion de mes erreurs

Une fois cette étape franchie, beaucoup de possibilités s’offrent à nous pour gérer l’erreur comme nous le souhaitons.

Gérer l’erreur captée avec les règles Smartforms

La première chose à faire lorsque notre formulaire rencontre une erreur, c’est d’en informer l’utilisateur. C’est d’ailleurs le comportement par défaut d’un Smartform. Néanmoins, les messages d’erreurs techniques n’ont pas d’intérêt pour un utilisateur final et font souvent peur. Nous allons donc remplacer le message d’erreur de K2 par un message personnalisé, qui sera plus parlant pour l’utilisateur.

Nous allons donc ajouter une instruction “Show a message to the user” sur la règle “When the View executed In Error” :

Sur la partie droite de l’écran de configuration de notre message pop-up, comme toujours, nous avons notre context browser qui met à disposition toutes les informations de notre vue, dont un dossier “Error”, comportant 3 champs :

  • Error type
  • Error message
  • Error details

Voilà à quoi correspondent ces trois champs sur un message d’erreur Smartform par défaut :

Les différents champs d’erreur disponibles dans le context browser

Revenons-en à nos moutons. Comme vous pouvez le voir dans la capture d’écran ci-dessus, ces informations ne sont toujours pas intéressantes pour un utilisateur final, nous allons donc simplement lui afficher un message d’erreur générique, lui indiquant de retourner à sa liste des tâches et de contacter un administrateur si le problème persiste :

On change le type de message pour “Error” afin que la pop-up qui s’affiche ait une apparence adaptée et on ajoute un lien mailto vers l’administrateur de la plateforme pour le joindre facilement en cas de problème persistant.

Voilà maintenant à quoi ressemblent nos messages d’erreurs :

 

Ouf ! Nos utilisateurs finaux sont rassurés. Mais maintenant ce sont les administrateurs qui sont embêtés : peu importe l’erreur que rencontrent les utilisateurs, ils reçoivent toujours le même message, pas vraiment instructif sur la nature de l’erreur !

Il nous faut un moyen de garder une trace de l’erreur quelque part, à des fins de debugging. Nous allons donc nous créer un SmartObject avec des colonnes permettant de stocker les messages d’erreurs ainsi que le maximum d’informations qui pourraient nous être utiles pour qualifier et corriger un problème rencontré.

Voilà un script SQL permettant de vous créer une table stockant ces informations essentielles dans votre base métier (en modifiant la première ligne) :

USE [EnK2Besoin] -- Ici modifier pour votre base metier
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ErreurSmartform](
   [ErreurID] [bigint] IDENTITY(1,1) NOT NULL,
   [LogDate] [datetime] NULL, -- Date a laquelle l'erreur s'est produite
   [RequestID] [bigint] NULL, -- Identifiant de l'objet metier
   [UserName] [nvarchar](100) NULL, -- Login de l'utilisateur rencontrant l'erreur
   [Source] [nvarchar](100) NULL, -- Formulaire qui rencontre l'erreur
   [Platform] [nvarchar](100) NULL, -- Systeme d'exploitation de l'utilisateur
   [Culture] [nvarchar](50) NULL, -- Culture du navigateur de l'utilisateur
   [Browser] [nvarchar](500) NULL, -- User agent du navigateur de l'utilisateur
   [ErrorType] [nvarchar](max) NULL, --
   [ErrorMessage] [nvarchar](max) NULL, -- Champs error Smartform
   [ErrorDetails] [nvarchar](max) NULL, --

   CONSTRAINT [PK_Erreur] PRIMARY KEY CLUSTERED
   (
      [ErreurID] ASC
   ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Ces données n’étant pas purement métier et ne nécessitant pas d’être transportées d’un environnement à l’autre, nous pouvons tout aussi bien utiliser directement un SmartObject smartbox, histoire de nous simplifier la vie. Bref, libre à vous de décider comment vous stockerez ces informations, tant qu’elles restent disponibles pour les administrateurs de la plateforme !

J’obtiens un SmartObject qui ressemble à ça :

Je complète la règle “In error” de ma vue créée précédemment pour y ajouter une instruction permettant de générer un enregistrement dans mon SmartObject ErreurSmartform.

Quand ma vue tombe en erreur, enregistrer les informations relatives à l’erreur, puis afficher un message à l’utilisateur
On mappe à peu près toutes les informations disponibles dans le dossier “System values” de notre context browser
Mapping de retour de la méthode Create de notre SmartObject ErreurSmartform

On modifie également légèrement le message à renvoyer à l’utilisateur pour y ajouter l’identifiant de l’enregistrement créé dans notre SmartObject. Le message devient trop long pour s’afficher correctement dans une pop-up “small”, je la passe donc en taille “medium” :

Maintenant, lorsque l’utilisateur rencontre une erreur sur son formulaire, le message qui s’affiche est le suivant :

Et pour les administrateurs de la plateforme, les détails de l’erreur sont sauvegardés, ils n’ont plus qu’à aller les lire dans le SmartObject ErreurSmartform grâce à l’identifiant que pourra leur indiquer l’utilisateur :

C’est tout pour cette fois, mais sachez que l’on peut aller plus loin que ce que je viens de vous présenter (message d’erreur multilingue, notifier un administrateur lorsqu’un formulaire rencontre une erreur, créer une interface d’administration en Smartforms pour consulter les messages d’erreur plutôt que de passer par le SmartObject Services Tester, interpréter les messages d’erreur pour afficher à l’utilisateur un message adapté au type d’erreur rencontré plutôt qu’un message générique… Qui sait, cela pourrait faire l’objet d’un prochain article ) .

Thomas

Chez K2 France depuis 2013, je ne suis pas magicien mais j'ai tout de même quelques tours dans mon sac en matière d'applications K2, dont je veux bien vous révéler les secrets ;-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.