29 avr. 2024, 11:59:41 timothée

Le module Workflow-FormsToPDF

I) Description

Le module Workflow-FormsToPDF sert à l’export des réponses aux questionnaires du plugin Forms dans un template (ou modèle) créé par l’utilisateur. Les réponses sont exportables individuellement dans l’onglet de visualisation de la réponse.

II) Utilisation

1. Création d’un export avec le workflow formstopdf

Vous avez créé un formulaire avec au moins une question et vous avez vérifié que votre utilisateur a bien les droits nécessaires à l’utilisation des workflows.

a. Créer un nouveau workflow

Dans le menu sélectionner : system > gestion des workflows

menu

Cliquer sur créer un workflow.

create_workflow

b. Créer une étape ou deux étapes

Si une seule étape est créée, il sera possible d’exporter la même réponse plusieurs fois. Si deux sont créées, une réponse sera exportable une seule fois.

create_state

c. Créer une action associée à votre étape

Cliquer sur « Ajouter une action ».

create_action

Dans la page modifier de l’action, sélectionner la tâche « Export d’un formulaire vers une édition pdf », cliquer sur l’icône « plus » pour ajouter.

Cliquer sur modifier le workflow.

modify_workflow

d. Créer un nouveau Template

Dans modifier le workflow puis dans modifier la tâche, cliquer sur “Gérer les templates”.

modify_task

Cliquer sur “Ajouter un template”.

new_template

Donner un nom au nouveau template et associer le template à un formulaire puis enregistrer.

associate_template

Cliquer sur modifier le template nouvellement créé. Les questions et autres éléments associés au formulaire (Bookmark) sont maintenant affichés dans la section à droite de la page. Cliquer sur l’un des Bookmark pour le copier et coller dans le template en création. Le Bookmark sera remplacé par la donnée correspondante lors de la génération du PDF.

booksmarks

Enregistrer le template.

e. Associer le nouveau template au formulaire

Enregistrer le template avec le formulaire associé :

associate_form_template

f. Activer le workflow

Dans le menu sélectionner : system > gestion des workflows. Activer le workflow.

activate_workflow

g. Associer le Workflow au formulaire

Dans la page de modification du formulaire associer le workflow au formulaire.

associate_form_workflow

h. Exporter une réponse au format PDF

Il est maintenant possible d’exporter les réponses du formulaire selon le Template créé. Aller dans la page visualisation des réponses et cliquer sur une réponse.

view_responses

Cliquer sur l’action qui a été nommée précédemment.

export_responses

i. Télécharger le PDF

Dans Système > Mes demandes de fichiers.

Cliquer sur télécharger.

download_pdf

III) Personnaliser l’affichage des types de questions (entrytype)

Le plugin Form propose différents types de questions : date, texte, image, fichier, etc. Pour adapter l’affichage des réponses selon leur type (Entrytype), le module workflow-formstopdf utilise des macros Freemarker (liens wiki macro). Dans le code source du module, il y a une macro dont le rôle est d’appeler la macro qui correspond à l’Entrytype de la question. Cette macro se trouve ici : lutece-wf-module-workflow-formstopdf/webapp/WEB-INF/templates/admin/plugins/workflow/modules/formspdf/display_entries/displayEntry.ftl

<#macro displayEntry q>
    <#if q??>
        <#assign entry=q.question.entry>
        <#assign list_responses=q.getEntryResponse()>
        <#if entry.entryType.beanName == "forms.entryTypeArray">
            <@displayEntryTypeArray entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeAutomaticFileReading">
            <@displayEntryTypeAutoFileReading entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeCamera">
            <@displayEntryTypeCamera entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeCartography">
            <@displayEntryTypeCartography entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeCheckbox">
            <@displayEntryTypeCheckbox entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeComment">
            <@displayEntryTypeComment entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeDate">
            <@displayEntryTypeDate entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeFile">
            <@displayEntryTypeFile entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeGalleryImage">
            <@displayEntryTypeGalleryImage entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeGeolocation">
            <@displayEntryTypeGeolocation entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeImage">
            <@displayEntryTypeImage entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeMyLuteceUser">
            <@displayEntryTypeMyLuteceUser entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeNumber">
            <@displayEntryTypeNumber entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeNumbering">
            <@displayEntryTypeNumbering entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeRadioButton">
            <@displayEntryTypeRadioButton entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeSelect">
            <@displayEntryTypeSelect entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeSelectOrder">
            <@displayEntryTypeSelectOrder entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeTelephoneNumber">
            <@displayEntryTypeTelephoneNumber entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeTermsOfService">
            <@displayEntryTypeTermsOfService entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeText">
            <@displayEntryTypeText entry=entry list_responses=list_responses />
        <#elseif entry.entryType.beanName == "forms.entryTypeTextArea">
            <@displayEntryTypeTextArea entry=entry list_responses=list_responses />
        <#else>
            <@displayEntryTypeText entry=entry list_responses=list_responses />
        </#if>
    </#if>
</#macro>

Cette macro de redirection prend un paramètre q qui correspond à la valeur de la réponse contenue dans position_X. Pour l’appeler selon la syntaxe choisie :

<#@displayEntry q=position_7/>

ou

[@displayEntry q=position_7/]

Le Bookmark d’une question est en fait un appel à la macro de redirection.

bookmarks_hooks

Configuration de la syntaxe des Macros Freemarker

Les balises Freemarker sont habituellement définies de façon similaire à celles de l’HTML avec < et >. Par exemple pour définir une macro : <#macro maMacro arg1>. Et pour l’appeler : <@maMacro arg1= arg1>.

Cette syntaxe est incompatible avec l’utilisation du RichTextEditor qui reformatte les éléments afin de prévenir les bugs d’affichage et les attaques XSS. Par exemple : <@maMacro arg1= arg1> devient

<@maMacro arg1= arg1>

.

Pour utiliser les Bookmarks de réponse (qui sont en fait des appels à des macros) avec le RTE, il faut modifier la syntaxe Freemarker.

Ajouter <#ftl> au tout début du template rend possible l’utilisation des macros Freemarker avec une syntaxe différente qui est compatible avec le RichTextEditor. Pour définir une macro : <#macro maMacro arg1 />. Pour appeler une macro : [@maMacro arg1= arg1/].

Le module ajoute et supprime l’entête <#ftl> automatiquement lors de la modification de l’option ci-dessous.

with_rte

Sans le RTE, il est possible de configurer l’affichage d’une macro, car le RTE reformate le HTML. Il est aussi plus aisé de personnaliser une macro sans RTE avec la syntaxe en < >, car on peut alors copier et coller les macros d’affichage existantes que l’on souhaite modifier.

Exemple de personnalisation

À l’étape d’édition du template, nous devons sélectionner l’option sans Rich Text editor. Il faut récupérer la macro de l’Entrytype que l’on souhaite modifier dans le code source du module workflow-formstopdf. Ici, on repère la macro : DisplayEntryTypeText. On fait un copier/coller du contenu de la macro dans le formulaire du template.

template_macro

On peut maintenant modifier la macro pour avoir l’affichage souhaité.

customize_template

Dans cet exemple, la couleur et le style sont personnalisés.

En résultat, nous avons la réponse dont le style a été personnalisé.

customized_res