Manuel d'intégration

  1. Modifications dans l'affichage des contenus
  2. Helpers XSL
  3. Chargement du plugin
    1. ametys-front-edition-head
  4. Boutons sur la page
    1. ametys-front-edition-insert-toggle-edition-mode-button
    2. Actions sur les pages
      1. ametys-front-edition-get-page-status
      2. ametys-front-edition-insert-create-page-button
      3. ametys-front-edition-insert-delete-page-button
      4. ametys-front-edition-insert-rename-page-button
      5. ametys-front-edition-insert-move-page-up-button
      6. ametys-front-edition-insert-move-page-down-button
      7. ametys-front-edition-insert-move-page-button
      8. ametys-front-edition-insert-tag-page-button
    3. Actions sur les contenus / zones
      1. ametys-front-edition-add-content-button
      2. ametys-front-edition-remove-zoneitem-button
      3. ametys-front-edition-content-workflow-button
      4. ametys-front-edition-edit-content-button
      5. ametys-front-edition-move-content-button
      6. ametys-front-edition-get-content-workflow-step
      7. ametys-front-edition-get-content-validation-status
      8. ametys-front-edition-insert-tag-content-button
  5. Personnalisation des templates
    1. Template général des boutons
    2. Templates intermédiaire spécifique à chaque bouton
  6. Workflow

 

Modifications dans l'affichage des contenus

Autour de chaque métadonnée affichée, il est nécessaire d'intégrer un bloc html permettant d'indiquer au plugin qu'il y a à cet endroit de la page une donnée à modifier.

Cette balise doit contenir un attribut "data-ametys-metadata" dont la valeur sera l'identifiant du contenu et le chemin de la métadonnée, séparés par un point virgule ;

Exemple :

Modification pour le titre

<span class="content-title summary" data-ametys-metadata="{@id};title"><xsl:value-of select="$title"/></span>      

Il peut être utile en mode édition (cf helpers pour savoir si on est dedans ou pas) d'afficher des blocs vides quand la métadonnée est absente, ce qui permettra de la modifier quand même.

Il est à noter que la taille de l'éditeur affichée sera la même que la taille du bloc (pour un texte riche, il peut être utile de définir une taille minimum quand on est en mode édition).

Actuellement, les types de métadonnée suivant sont modifiables :

  • STRING
  • DATE
  • DATETIME
  • RICH_TEXT
  • CONTENT
  • FILE

Helpers XSL

Les helpers sont disponibles dans org.ametys.plugins.frontedition.AmetysFrontEditionHelper.

Ces helpers sont généralement utilisés pour récupérer des arguments utiles aux templates mais peuvent aussi servir lors de l'intégration pour décider d'appeler ou non certains templates (essentiellement hasFrontEditionRight)

boolean hasFrontEditionRight(String rightId, String pageId, boolean editionModeOnly)
Permet de vérifier si un droit est accessible à l'utilisateur (pour vérifier si l'utilisateur peut modifier une page ou un contenu par exemple)

boolean hasFrontEditionRight()
Vérifie uniquement si l'utilisateur dispose du droit Front_Edition_Access_Right dans le contexte général

boolean hasWorkflowRight(int actionId, String contentId, boolean checkEditionMode)
boolean hasWorkflowRight(List<Integer> actionIds, String contentId, boolean checkEditionMode)
Vérifie que l'utilisateur peut faire une action de workflow (peut aussi vérifier si l'on est en mode édition)

String getPageStatus(String pageId)
Retourne le status des contenus d'une page (draft/validated ou mixed si il y a des deux)

long getZoneItemPosition(String zoneItemId, String pageId)
Récupère la position d'un zoneItem dans une page

long getZoneSize(String zoneName, String pageId)
Récupère le nombre de zoneItem dans une zone

long getContentWorkflowId(String contentId)
Récupère le workflow step id pour un content

String getContentStatus(String contentId)
Récupère "validated" ou "draft" selon l'état du contenu

boolean isContentLive(String contentId)
comme au dessus, mais retourne true si le contenu est validé

Chargement du plugin

ametys-front-edition-head

Dans l'en-tête de la page, il faut appeler le template ametys-front-edition-head

Ce template demande 3 paramètres

  • start : Indique si il faut charger directement les fichiers javascripts nécessaires à l'édition (défaut : start)
    • false : Ne charge que le stricte minimum, il faudra appeler AmetysFrontEdition.start(); dans le skin pour lancer le chargement.
    • start : Chargera les fichier lors de la première action de modification (cette action sera donc plus lente, ou alors appeler AmetysFrontEdition.load(); depuis le skin)
    • load : Chargera les fichiers dès le chargement de la page
    • debug : Chargera les fichiers directement sans passer par les appels jquery
  • editActionId : Indique l'Id de workflow à utiliser pour la modification champ par champ (défaut : 2)
  • insertAttachmentActionId : action de workflow qui sera utilisé lors de l'upload de fichier joint à un contenu (défaut : 12)
  • enableSimpleMode : Active la modification champ par champ (défaut : 'true')
  • edition-mode-only: L'édition est limitée au mode edition (défaut : true()). Mettre à false() pour simplement éditer une fiche annuaire par exemple.

Boutons sur la page

ametys-front-edition-insert-toggle-edition-mode-button
  • class : classe qui sera ajoutée au bouton. Par défaut front-edition-toggle-edition-mode

Conditions pour affichage du bouton :

  • context = front
  • droit Front_Edition_Access_Right
  • page non cachable

Insère un bouton pour passer du mode normal au mode édition (et inversement)

Actions sur les pages

Note : chaque template gère lui même la gestion des droits nécessaire.
ametys-front-edition-insert-create-page-button par exemple teste le droit Web_Rights_Page_Create et Front_Edition_Access_Right
Le bouton ne s'affichera pas si les droits ne sont pas accordés.

ametys-front-edition-get-page-status
  • page-id : identifiant de la page
  • prefix : préfix qui sera ajouté en début de chaîne

Ce template retourne [prefix]validated/draft/mixed en fonction du status des contenus dans une page

  • validated : tous les contenus de la page sont validés
  • draft : tous les contenus de la page sont des brouillons
  • mixed : la page contient des contenus validés et des brouillons
  • "" : rien n'est retourné si aucun contenu n'est trouvé.

Conditions pour que la validation se fasse :

  • mode edition
ametys-front-edition-insert-create-page-button
  • page-id : identifiant de la page parente
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-add-page
  • callback : fonction javascript qui sera appelée à la fin de la création au lieu d'effectuer une redirection.
    • Le callback sera appelé avec deux paramètres, la page et un booléen indiquant si la page a été créée sans erreur.
    • Pour récupérer l'url de la page pour faire une redirection : var path = AmetysFrontEdition.CONTEXT_PATH + "/" + AmetysFrontEdition.LOCALE + "/" + page.getPath() + ".html";
  • config : objet json qui servira à configurer l'outil de création de page, cf http://releases.ametys.org/api/nightly/4.1.x/#!/api/Ametys.plugins.web.page.AddPageWizard-method-open (défaut { } )
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Insère un bouton permettant de créer une sous-page sous la page indiquée.

Exemple

<xsl:call-template name="ametys-front-edition-insert-create-page-button">      
    <xsl:with-param name="page-id" select="@sitemap:id"/>      
    <xsl:with-param name="callback">someAwesomeCallBackFunction</xsl:with-param>      
    <xsl:with-param name="config">{      
        "force": true,      
        "show-card-tags" : false,      
        "default-pagetype" : "template",      
        "default-template" : "page3col",      
        "default-pagecontent-type" : "contenttype",      
        "default-contenttype" :  "org.ametys.plugins.news.Content.news",      
        "default-content-title" : "Jolie nouvelle actualité",      
        "default-contenttype-label" : "Actualité"      
    }</xsl:with-param>      
</xsl:call-template>      

La configuration par défaut est

{      
    'pagetype-template' : true,      
    'pagetype-redirection-cms' : true,      
    'pagetype-redirection-http' : false,      
    'pagetype-blank' : false,      
    'pagecontent-card-content-filter' :      
    [      
        'org.ametys.plugins.news.Content.news',      
        'org.ametys.web.default.Content.article'      
    ],      
    'pagecontent-service' : false      
}      

Il n'est pas nécessaire de tout re-déclarer, si un seul paramètre est à changer, il suffit de le passer lui dans la conf (une fusion de la conf passée et de la conf par défaut est faite)

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_Create
ametys-front-edition-insert-delete-page-button
  • page-id : identifiant de la page à supprimer
  • page-title : titre de la page à indiquer dans la boîte de dialogue
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-delete-page
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Insère un bouton permettant de supprimer une page et ses contenus (si orphelins)

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_Delete
ametys-front-edition-insert-rename-page-button
  • page-id : identifiant de la page à renommer
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-rename-page
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Insère un bouton permettant de renommer la page.

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_Rename
ametys-front-edition-insert-move-page-up-button
  • page-id : identifiant de la page à déplacer
  • page-parent-id : identifiant de la page parente
  • page-pos : position actuelle de la page (servira à valider l'affichage ou non du bouton, et calculera la future position) (le compte des pages commence à 1 et non à zéro)
  • page-title : titre de la page à indiquer dans la boîte de dialogue
  • number-of-pages: nombres de pages filles sous la page parente
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-move-page-up
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant de décaler une page d'une position vers le haut dans son parent (bouton masqué si la page est la première)

ametys-front-edition-insert-move-page-down-button
  • page-id : identidiant de la page à déplacer
  • page-parent-id : identifiant de la page parente
  • page-pos : position actuelle de la page (servira à calculer la future position) (le compte des pages commence à 1 et non à zéro)
  • page-title : titre de la page à indiquer dans la boîte de dialogue
  • number-of-pages : nombre total de page dans le parent (servira à valider l'affichage ou non du bouton)
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-move-page-down
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant de décaler une page d'une position vers le bas dans son parent (bouton masqué si la page est la dernière)

Exemple d'intégration

<xsl:variable name="currentPage" select="ametys:sitemap()//page[@sitemap:current = 'true']"/> 
<xsl:variable name="currentPos" select="count($currentPage/preceding-sibling::page) + 1"/> 
<xsl:variable name="nbPages" select="count($currentPage/../page)"/> 

<xsl:call-template name="ametys-front-edition-insert-move-page-up-button"> 
    <xsl:with-param name="page-id" select="$currentPage/@sitemap:id"/> 
    <xsl:with-param name="page-parent-id" select="$currentPage/parent::page/@sitemap:id"/> 
    <xsl:with-param name="page-pos" select="$currentPos"/> 
    <xsl:with-param name="number-of-pages" select="$nbPages"/> 
    <xsl:with-param name="button-text"><span><i18n:text i18n:key="SKIN_FO_EDITION_PAGE_MOVE_UP" i18n:catalogue="skin.{$skin}"/></span></xsl:with-param> 
    <xsl:with-param name="class">g-color-green-v1 g-py-5 g-px-20 g-font-size-14</xsl:with-param> 
    <xsl:with-param name="edition-mode-only" select="false()"/> 
</xsl:call-template> 
ametys-front-edition-insert-move-page-button
  • page-id : identidiant de la page à déplacer
  • page-parent-id : identifiant de la page parente (il est possible via cette action de changer de parent)
  • page-new-pos : nouvelle position de la page
  • button-text : texte à afficher dans le bouton
  • page-title : titre de la page à indiquer dans la boîte de dialogue
  • class : classe css à ajouter au bouton
  • link-title-i18n : clef i18n à utiliser comme titre du bouton
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant de déplacer une page directement, sans utiliser les 2 helpers plus simples.

Ce template n'est à utiliser que pour changer de parent, pour un déplacement au sein du même parent il est conseillé d'utiliser les 2 templates simples, ou alors de prendre en compte l'emplacement de la page courante dans le décompte.
Exemple : Pour déplacer le 2eme élément de la liste en 3eme position, il faut indiquer 4 car si on indique 3, il sera placé après lui même et donc restera en 2eme position. Pour placer le 2eme élément en 1ere position, il faudra indiquer 1 (car vu que c'est avant, sa position actuelle n'est pas à prendre en compte) cf https://issues.ametys.org/browse/FRONTEDIT-79

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
ametys-front-edition-insert-tag-page-button
  • page-id : identidiant de la page à tagger
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-tag-page
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant d'affecter des tags à une page

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_Tag

Actions sur les contenus / zones

Note : comme pour les pages, chaque template effectue une vérification des droits.

Note : ces templates ne doivent pas être appelés depuis la vue du content car cette vue est cachée et cela peut engendrer de graves effets de bord. (cf https://issues.ametys.org/browse/FRONTEDIT-78 )

Pour les appeler, mettez votre code dans zone-item-before ou zone-item-after de votre template (voir Ecriture d'un gabarit)

ametys-front-edition-add-content-button
  • page-id : identifiant de la page
  • content-types : type(s) de contenu à créer. Si plusieurs types sont à déclarer sur le même contenu, les séparer par des point-virgule ;
  • zone-name : nom de la zone dans laquelle ajouter le contenu. Par défaut : default
  • content-title : titre par défaut du contenu
  • init-workflow-action-id : identifiant de l'action de workflow d'initialisation. Par défaut : 1
  • workflow-name : nom du workflow lié à ce contenu. Par défaut : content
  • locale : langue du contenu
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-add-content
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant d'ajouter un contenu à une page

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_AddContent
ametys-front-edition-remove-zoneitem-button
  • page-id : identifiant de la page
  • zone-name : nom de la zone dans laquelle un zoneItem sera supprimé
  • zone-item-id : identifiant du zone
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-remove-content
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant de supprimer un zoneItem dans une page

Exemple :

<xsl:call-template name="ametys-front-edition-remove-zoneitem-button">                         
 <xsl:with-param name="page-id" select="ametys:pageId()"/>                         
 <xsl:with-param name="zone-name" select="ametys:zone('')"/>                         
 <xsl:with-param name="zone-item-id" select="ametys:zoneItemId()"/>                     
</xsl:call-template>      

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_DeleteZoneItem
ametys-front-edition-content-workflow-button
  • content-id : identifiant du contenu sur lequel exécuter l'action de workflow
  • workflow-id : identifiant de l'action workflow à exécuter
  • workflow-text : texte à afficher, ne pas passer ce paramètre pour afficher le nom de l'action définie dans le workflow
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-workflow-action
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant d'effectuer une action de workflow sur un contenu

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit sur l'action de workflow
ametys-front-edition-edit-content-button
  • content-id : identifiant du contenu à modifier
  • workflow-ids : liste des actions de workflow à rendre disponible. Par défaut [2]
    • Soit une liste d'entiers [2, 4, 5], les nom des boutons seront les noms des actions définies dans le workflow
    • Il est aussi possible d'overrider les noms d'actions :  [{id:2,text:'<xsl:value-of select="$workflow-2-text" />'}, 42]. Le texte doit être décodé dans la balise (exemple ci dessous)
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-edit-content
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

 

Exemple de texte modifié pour les actions de workflow

<xsl:variable name="workflow-2-text">      
    <xsl:value-of select="ametys:escapeJS(ametys:translate(concat('skin.', ametys:skin(), ':FRONT_EDITION_SAVE_CONTENT')))" />      
</xsl:variable>      
<xsl:call-template name="ametys-front-edition-edit-content-button">      
    <xsl:with-param name="content-id" select="@id"/>      
         <xsl:with-param name="workflow-ids">[{id:2,text:'<xsl:value-of select="$workflow-2-text" />'}, 42]</xsl:with-param>      
</xsl:call-template>      

Ce bouton permet d'ouvrir toutes les métadonnées visibles sur la page pour les modifier. Une barre d'outils proposant les actions de workflow demandées ET disponibles (pour ce contenu/utilisateur) sera affichée.

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Workflow_Rights_Edition_Online
ametys-front-edition-move-content-button
  • zone-item-id : identifiant du zoneItem à déplacer
  • zone-name : nom de la zone dans laquelle déplacer le contenu
  • offset : -1 pour monter d'un niveau, 1 pour descendre d'un niveau
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-move-content-up ou front-edition-move-content-down selon le sens de l'offset
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Permet de déplacer un zoneItem dans sa zone

Pour overrider ce template, overrider ametys-front-edition-move-content-button-up-simple et ametys-front-edition-move-content-button-down-simple

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit Web_Rights_Page_OrganizeZoneItem
ametys-front-edition-get-content-workflow-step
  • content-id : identifiant du contenu
  • prefix : texte qui préfixera le retour

Retourne l'identifiant du workflow step id pour ce contenu, préfixé par prefix

Conditions pour que la validation se fasse :

  • mode edition
ametys-front-edition-get-content-validation-status
  • content-id : identifiant du contenu
  • prefix : texte qui préfixera le retour

Retournera "validated" ou "draft", préfixé, en fonction de l'état du contenu (ou "" si le contenu n'est pas trouvé)

Conditions pour que la requête se fasse :

  • mode edition
ametys-front-edition-insert-tag-content-button
  • content-id : identidiant du contenu à tagger
  • button-text : texte à afficher sur le bouton
  • title-i18n : clef i18n à utiliser comme titre du bouton
  • class : classe css à ajouter au bouton. Par défaut front-edition-tag-content
  • edition-mode-only : false() pour autoriser le bouton même en dehors du mode édition (par défaut à true())

Bouton permettant d'affecter des tags à un contenu

Conditions pour l'affichage du bouton :

  • context = front
  • mode edition
  • droit CMS_Rights_Content_Tag

Personnalisation des templates

Template général des boutons

Chaque template gère son affichage en passant par le template ametys-front-edition-insert-button-simple à qui est passé les paramètres suivants :

  • button-text
  • javascript-function
  • class
  • title-i18n

Voici le code actuel de ce template qui peut être à réécrire pour personnaliser l'affichage général de tous les boutons

    <xsl:template name="ametys-front-edition-insert-button-simple">      
        <xsl:param name="button-text"/>      
        <xsl:param name="javascript-function"/>      
        <xsl:param name="class"/>      
        <xsl:param name="title-i18n"/>      
            <a class="{$class}" title="{$title-i18n}" i18n:attr="title" href="javascript:void(0)" onclick="{$javascript-function}"><span><xsl:copy-of select="$button-text"/></span></a>      
    </xsl:template>      

 

Templates intermédiaire spécifique à chaque bouton

Tous les templates cités plus haut sont ceux à appeler, mais par soucis de modularité, chacun de ces templates en appelle un intermédiaire afin de permettre à un skin de le réécrire afin de changer un comportement graphique si besoin.

Mis à part ametys-front-edition-move-content-button, tous les templates ayant leur nom terminant par -button disposent d'un template intermédiaire du même nom, mais terminant par -button-simple.

Pour ametys-front-edition-move-content-button, il y a 2 niveaux intermédiaires, les templates à réécrire si besoin sont ametys-front-edition-move-content-button-up-simple et ametys-front-edition-move-content-button-down-simple

Tous ces templates intermédiaires demandent les mêmes paramètres :

  • button-text
  • javascript-function
  • title-i18n
  • class

Et ils appellent le template final d'affichage d'un bouton : ametys-front-edition-insert-button-simple (en lui passant ces mêmes paramètres)

Workflow

Exemple de workflow auto-validant conditionel (si le contenu est validé, il est auto-validé, si c'est un brouillon, il reste en brouillon) :

<action id="43" name="plugin.default-workflow:WORKFLOW_ACTION_EDIT_FO">      
    <restrict-to>      
        <conditions type="AND">      
            <condition type="avalon">      
                <arg name="role">org.ametys.cms.workflow.ContentCheckRightsCondition</arg>      
                <arg name="right">Workflow_Rights_Edition_Online</arg>      
            </condition>      
            <condition type="avalon">      
                <arg name="role">org.ametys.cms.workflow.LockCondition</arg>      
            </condition>      
        </conditions>      
    </restrict-to>      
    <pre-functions>      
        <function type="avalon">      
            <arg name="role">org.ametys.cms.workflow.EditContentFunction</arg>      
        </function>      
    </pre-functions>      
    <results>      
        <!-- Modification et validation -->      
        <result old-status=" " status=" " step="3">      
            <conditions type="AND">      
                <condition type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>      
                    <arg name="step">3</arg>      
                </condition>      
                <condition type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.ValidateMetadataCondition</arg>      
                </condition>      
            </conditions>      
            <post-functions>      
                <!-- edition -->      
                <function type="avalon">      
                    <arg name="role">org.ametys.plugins.forms.workflow.FormEditionFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.CreateVersionFunction</arg>      
                </function>      
                <!-- validation -->      
                <function type="avalon">      
                    <arg name="role">org.ametys.plugins.translationflagging.TranslationAlertFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.web.workflow.ValidateContentFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.ValidationStepFunction</arg>      
                </function>      
            </post-functions>      
        </result>      
        <!-- Modification uniquement -->      
        <unconditional-result old-status=" " status=" " step="1">      
            <post-functions>      
                <!-- edition -->      
                <function type="avalon">      
                    <arg name="role">org.ametys.plugins.forms.workflow.FormEditionFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>      
                </function>      
                <function type="avalon">      
                    <arg name="role">org.ametys.cms.workflow.CreateVersionFunction</arg>      
                </function>      
            </post-functions>      
        </unconditional-result>      
    </results>      
</action>