FormBuilderSession
Permet le stockage temporaire, la sauvegarde et la suppression des termes de traductions. Ce stockage est géré dans la session, évitant ainsi que des modifications non sauvegardées (au sens large du terme) restent indéfiniment en mémoire ou dans un espace de stockage.
Figure 12 - Classe "FormBuilderSession"
Plusieurs clés de session sont utilisées :
- « FormBuilder.Translation.Terms » :Stocke les termes qui sont à mettre à jour ou à créer lors de la sauvegarde. Cet élément contient une liste d’objets de type « TranslationTerm » afin de stocker les termes avec leurs valeurs.
- « FormBuilder.Translation.Trash » : Stocke les termes qui sont à supprimer lors de la sauvegarde. Cet élément contient une liste de nombres entiers correspondant aux identifiants des termes à supprimer.
- « FormBuilder.Translation.Current.Sender » : Stocke le contrôle ayant lance l’ouverture de la fenêtre d’édition de terme.
- « FormBuilder.Translation.Current.Term » : Stocke la clé du terme contenu dans la fenêtre d’édition.
Ces deux éléments contiennent un dictionnaire entier/objet (entier/string pour les clés de termes) où l’entier est l’identifiant du formulaire auquel se rapporte l’objet. Cette différence est là afin d’éviter la perte d’information lorsque plusieurs termes de plusieurs formulaires sont édités en même temps.
Interface utilisateur
Des boutons avec l’icône de livre ouvert ont été ajoutés afin de permettre l’ouverture d’une fenêtre modale dans laquelle les termes sont gérés.
L’ID des boutons a été créé de telle sorte à ce que l’élément ainsi que l’attribut soient facilement récupérés afin de créer la clé du terme correspondant.
Un mapping « IdToTerm » est disponible dans le « code behind » des pages d’édition du formulaire et d’édition d’un champ afin de pouvoir associer le champ ou la zone de texte correspondant au bouton cliqué. Ceci est notamment utile afin de mettre à jour le contenu affiché avec le terme modifié. Initialement, ce mapping était utilisé afin de faire correspondre les champs textes qui étaient modifiés en TriggerBox aux termes qui leur étaient associés.
La fenêtre affiche la page « IceCube.Web.InstancePortal\Applications\Forms\FormPro\Resources\Term.aspx » sous forme d’iframe. La librairie ExtJS s’occupe de récupérer, dans la page parente, l’événement lancé lorsque cette fenêtre est fermée.
« CurrentSender » et « CurrentTerm » ont été créés afin de pouvoir récupérer le terme modifié ou créé et d’afficher la nouvelle valeur de la traduction dans le champ texte ou la zone de texte associé(e) grâce au mapping « IdToTerm » dont il était question précédemment. Ceci est fait lorsque l’événement de fermeture de la fenêtre d’édition du terme est récupéré dans la page parente.
« CurrentTerm » n’est pas obligatoire mais il permet d’éviter de recréer la clé du terme de traduction.
Création
Lors de la création de termes sur les éléments (formulaire, champ, etc.) préexistants et donc sauvegardés en base de données, le terme créé possède tout de suite une clé correcte dans le sens où tous les identifiants des éléments composant la clé sont connus.
La seule préoccupation ici est de stocker temporairement le terme et de la sauvegarder en même temps que le formulaire.
La clé est donc construite de manière standard en fournissant l’élément, l’attribut ainsi que les identifiants nécessaires, puis la méthode « GetOrCreateTerm » est utilisée.
Cette méthode va tout d’abord vérifier si le terme est présent en session, si cela n’est pas le cas, elle va ensuite vérifier parmi les termes déjà existant dans le système de traduction IC2 et le mettre en session s’il existe (logique de la méthode « GetTerm ») et enfin si aucun terme n’est trouvé, un terme temporaire est créé en session.
Lors de la sauvegarde du formulaire, les termes sont insérés en base de données grâce à la méthode « SaveAndFlushTerms ».
// Form I18N
FormBuilderSession.SaveAndFlushTerms(FormBuilderElement.Form, form_id);
En revanche lorsque que l’élément, pour lequel un terme est créé, n’est pas encore existant en base de données, son identifiant est temporaire mais toujours unique.
Lors de la sauvegarde du formulaire, une fois l’élément inséré en base de données, son identifiant final est récupéré puis les clés des termes de traduction sont mises à jour grâce à la méthode « UpdateTerms » avant d’être sauvegardés.
Cette manipulation doit être faite avant que les termes ne soient sauvegardés.
// Form I18N (update terms keys with the right ID)
FormBuilderSession.UpdateTerms(FormBuilderElement.Form, form.ID.ToString(), form_id.ToString());
Modification
Lorsqu’un terme existant est modifié la méthode utilisée afin de récupérer le terme est la même que pour la création. Le terme est récupéré depuis la session ou mis dans celle-ci puis affiché.
C’est lors de la sauvegarde avec « SaveAndFlushTerms » que la méthode « SaveTerm » va vérifier si l’identifiant du terme est présent (plus grand que zéro) et auquel cas, seules les « TranslationTermValue » sont mises à jour.
Suppression
La logique de suppression se distingue entre terme temporaire (en session) et terme existant (en base de données).
La suppression des termes temporaires est faite directement lors de la modification du formulaire en utilisant les méthodes « RemoveTerms » ou « RemoveTerm ». Ces méthodes retirent simplement le terme de la session.
// Remove unsaved associated terms (saved terms removal is made in DAL)
foreach (var field in CurrentForm.Fields.Where(i => i.ID == field_id || i.RowID == field_id))
{
FormBuilderSession.RemoveTerms(FormBuilderElement.Field, CurrentForm.ID, field.ID);
}
La suppression des termes existant quant à elle est faite à la sauvegarde du formulaire. En effet, la DAL FormBuilder, loggue toutes les suppressions effectuées, durant ces opérations, les identifiants des termes affectés sont stockés dans la poubelle (« Trash ») de « FormBuilderSession » et cette dernière est vidée à la fin de la sauvegarde avec la méthode « FlushTrash ».
// Get fields that are going to be deleted
foreach(var field in CrudBase<E.FormField>.Instance.GetAllQuery().Where(i => !alive_fields.ToList().Contains(i.Id) && i.FormId == form_id).ToList())
{
Log.WriteAudit(AuditEventType.Delete, AuditEventStatus.Information, LogSource.FormBuilder, "Field #" + field.Id, string.Format("Deleting field \"{0}\" ({1})...", field.Title, ((FormBuilderFieldType)field.Type).ToString() ));
// Delete terms (send to trash, deleted later when trash is flushed)
string term = string.Format(genericFieldTerm, form_id, field.Id);
FormBuilderSession.Trash.AddRange(CrudBase<E.TranslationTerm>.Instance.GetAllQuery().Where(i => i.Term.StartsWith(term) && i.Type == Artionet.IceCube.Interfaces.Language.TermType.FormBuilder).Select(i => i.Id));
// Delete field and related entities
CrudLogged<E.FormField>.Delete(field);
}
Réinitialisation
Afin d’éviter que des créations, modifications ou suppressions qui n’auraient pas été sauvegardées refassent surface sans qu’elles soient désirées, la méthode « Reset » est appelée à chaque fois qu’un formulaire est ouvert pour modification. Ce faisant, les termes associés à ce formulaire sont retirés de la session autant dans la poubelle (« Trash ») que dans le stockage (« Terms »).
// Avoid deleting terms added to the trash or getting created temp terms in a previous form edition
FormBuilderSession.Reset(FormID);