cancel
Showing results for 
Search instead for 
Did you mean: 

[Share custom Action] Envoyer un document par mail

roxy
Champ in-the-making
Champ in-the-making
Bonjour,

Je souhaite depuis un site Share, envoyer manuellement un document (aux membres du site contenant le doc, mais ça n'est pas encore la question - et il y a de la littérature pour ce paramétrage).
Il n'existe pas sous Share le pendant d'Alfresco à la fonction "Lancer une action / Envoyer un courriel à des utilisateurs" (accessible dans les détail du document).

Alors comment faire ?

NB :
- j'ai envisagé la création une règle conditionnée à un aspect mais je pense qu'il y a un truc qui m'échappe …
-faut-il plutôt passer par un workflow basique qui à l'instar du "Validé" permettant le déplacement d'un doc, utiliserait un "Envoyé" pour déclencher l'envoi du mail ?

PS : pourquoi n'existe-t-il pas un forum spécifique pour les questions relatives à SHARE ?

[size=85][Edition : Rodel] Modification du titre du sujet [/size]
15 REPLIES 15

roxy
Champ in-the-making
Champ in-the-making
Je récapitule mon problème

OBJECTIF
Envoyer un mail aux membres des groupes appartenant à un site depuis une action personnalisée sur un document de ce site

CE QUE J'AI PU FAIRE
1/ Création d'un composant appelé par mon action (qui récupère bien tous les utilisateurs via un appel du type "var json = remote.call("/api/sites/" + page.url.templateArgs.site + "/memberships?size=100&authorityType=USERS_GROUP");")
2/ Création d'un Script dans la Data Dictionary qui fait ce que je veux

CE QUE JE N'AI PAS PU FAIRE
Envoyer un mail via dans mon composant


RESUME
Mon action est définie dans
"C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\documentlibrary\documentlist.get.config.xml"
et dans
"C:\Alfresco\tomcat\webapps\share\components\documentlibrary\documentlist.js" (en fait dans documentlist-min.js)
par :

<action type="simple-link" id="onActionMailUtilisateurs" permission="edit"  href="{mailUtilisateursUrl}" label="actions.document.mail-utilisateurs" />
et

mailUtilisateursUrl: fnPageURL("mail-utilisateurs?nodeRef=" + nodeRef + "&proxyAlfresco=" + Alfresco.constants.PROXY_URI + "&contentUrl=" + contentUrl),

Cette dernière est paramétrée comme suit :
Sur  "C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-data\pages\mail-utilisateurs.xml" :

<?xml version='1.0' encoding='UTF-8'?>
<page>
   <title>Mail utilisateurs avec lien documents</title>
   <title-id>page.mailUtilisateurs.title</title-id>
   <description>Mail Utilisateurs</description>
   <description-id>page.mailUtilisateurs.description</description-id>
   <template-instance>mail-utilisateurs</template-instance>
   <authentication>user</authentication>
   </page>

Puis dans "C:\Alfresco\tomcat\webapps\share\WEB-INF\classes\alfresco\site-data\template-instances\mail-utilisateurs.xml" :

<?xml version='1.0' encoding='UTF-8'?>
<template-instance>
   <template-type>org/alfresco/mail-utilisateurs</template-type>

   <properties>
      <pageFamily>documentlibrary</pageFamily>
      <container>documentLibrary</container>
   </properties>
  
   <components>
      <component>
         <region-id>mail-utilisateurs</region-id>
         <url>/components/mail-utilisateurs/mail-utilisateurs</url>
       <properties>
            <itemId>{nodeRef}</itemId>
         <contentId>{contentUrl}</contentId>
         <proxyId>{proxyAlfresco}</proxyId>
         </properties>
      </component>
   </components>
</template-instance>

Mon composant "mail-utilisateurs"
"C:\Alfresco\tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\components\mail-utilisateurs\mail-utilisateurs.get.js"
(je ne donne pas son code ici pour ne pas trop alourdir- mais je peux le faire en cas de besoin) est appelé correctement, mais impossible de lui faire envoyer un mail (je n'ai pas accès à "actions" qui semble le seul moyen d'envoyer un mail via "actions.create("mail");").

Pour rappel, le script ci-dessous dans la "Data Dictionary" marche très bien et je peux l'appeler depuis une règle (sauf que je veux que l'envoi puisse être manuel).
Peut-être pourrai-je l'appeler depuis mon composant ?

    //var nodeRef = args["noderef"];
    //var document = search.findNode(nodeRef);

    var persons = [];
    var perms = document.getPermissions();
    for(var i=0 ; i<perms.length ; i++) {
       var perm = perms[i].split(";");
       if(perm[0] == "ALLOWED" && perm[1].lastIndexOf("GROUP_") != -1) {
          var group = people.getGroup(perm[1]);
          if(group) {
             var persons = people.getMembers(group);
             for each (person in persons){
                if(person.properties.userName != "admin" && person.properties.userName != "guest") {
                   var email = person.properties.email;
                   if(email)
                      sendMail(email);
                }
             }
          }
       }
    }

    function sendMail(email) {
       // Envoi mail
       var mail = actions.create("mail");
       mail.parameters.to = email;
       mail.parameters.subject = "Nouveau Document";
       mail.parameters.from = "Info@Alfresco";
       mail.parameters.template = companyhome.childByNamePath("Data Dictionary/Email Templates/Notify Email Templates/notify_user_email.ftl");
       mail.parameters.text = "Inutile grace au Template ";
       mail.execute(document);
    }

bertrandf
Champ on-the-rise
Champ on-the-rise
Bonjour,

Le comportement est tout à fait normal, depuis Share vous n'avez pas accès aux APIs JavaScript "classiques".
Il faut considérer Share comme une couche de présentation de l'entrepôt, quasiment tout ce qui concerne les traitements est fait coté entrepôt.

L'API JavaScript coté Share est très limitée, avec vous pourrez tout de même récupérer des informations sur l'utilisateur connecté, sur la page ou vous êtes, … et surtout vous avez l'objet remote qui vous permet d'appeler des webscripts situés dans l'entrepôt.
http://wiki.alfresco.com/wiki/Surf_Platform_-_Freemarker_Template_and_JavaScript_API

Il faut donc développer un webscript coté Alfresco et y faire appel depuis Share.
Concrètement vous allez récupérer les paramètres que vous voulez dans Share (nodeRef, …) et les transmettre à votre webscript situé coté Alfresco (utilisation de l'objet remote) qui se chargera de faire le traitement.

PS : Je ne comprends pas comment vous faites pour récupérer le nodeRef du document sur lequel vous êtes. Je pense que réaliser une action avec une page et plus compliqué que la méthode expliquée dans le wiki.

bertrandf
Champ on-the-rise
Champ on-the-rise
En réponse à la mise à jour de votre message (qui va dans le même sens que mon message précédent) :

Il faut reprendre le traitement de votre fichier mail-utilisateurs.get.js mais dans un webscript coté alfresco et dans votre fichier mail-utilisateurs.get.js faire appel à ce webscript.

En gros, il faut créé un webscript dans alfresco :
(Par exemple dans C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\templates\webscripts)

mon-webscript.get.desc.xml
<webscript>
<shortname>Mon webscript</shortname>
<description>Mon webscript qui envoie des mails</description>
<url>/sendMail</url>
<format default="json">argument</format>
<authentication>user</authentication>
</webscript>

mon-webscript.get.js : Vous reprenez ce que vous avez déjà fait dans mail-utilisateurs.get.js
try {
  model.users = [];
  model.failures = [];

  var nodeRef = args["noderef"];
  var document = search.findNode(nodeRef);

  var perms = document.getPermissions();
  for (var i=0 ; i<perms.length ; i++) {
     var perm = perms[i].split(";");
     if (perm[0] == "ALLOWED" && perm[1].lastIndexOf("GROUP_") != -1) {
        var group = people.getGroup(perm[1]);
        if (group) {
           var persons = people.getMembers(group);
           for each (p in persons) {
              if (p.properties.userName != "admin" && p.properties.userName != "guest") {
                 var email = p.properties.email;
                 if (email) {
                  sendMail(p, document);
                 }
              }
           }
        }
     }
  }
}
catch (e) {}

function sendMail(p, doc) {
  try {
    // Envoi mail
    var mail = actions.create("mail");
    mail.parameters.to = p.properties.email;
    mail.parameters.subject = "Nouveau Document";
    mail.parameters.from = "Info@Alfresco";
    mail.parameters.template = companyhome.childByNamePath("Data Dictionary/Email Templates/Notify Email Templates/notify_user_email.ftl");
    mail.parameters.text = "Inutile grace au Template ";
    mail.execute(doc);

    model.users.push(p.properties.userName);
  }
  catch(e) {
    model.failures.push(p.properties.userName);
  }
}
mon-webscript.get.json.ftl
<@compress single_line=true>
<#escape x as jsonUtils.encodeJSONString(x)>
{
  "document": "${document.name}",
  "users": [
    <#list users as userName>
      "${userName}"
      <#if userName_has_next>,</#if>
    </#list>
  ],
  "failures": [
    <#list failures as authority>
      "${authority}"
      <#if authority_has_next>,</#if>
    </#list>
  ]
}
</#escape>
</@>

Et dans votre fichier mail-utilisateurs.get.js (coté Share), il faut faire appel à ce webscript.
Vous devriez avoir quelque chose du genre :

var nodeRef = page.url.args.nodeRef;

var result = remote.call("/sendMail?nodeRef=" + stringUtils.urlEncode(nodeRef));
if (result.status == 200) {
  var json = eval('(' + result + ')');
 
  model.success = json.users;
  model.failures = json.failures;
}


En espérant que ca vous aide et que vous puissiez avance.

roxy
Champ in-the-making
Champ in-the-making
Merci Bertrand vos infos m'aident beaucoup,

j'ai pu (enfin !) faire marcher mon envoi de mail en appelant un nouveau script d'Alfresco,

Juste deux petites modifs par rapport au code transmis par Bertrand :

sur mon-webscript.get.desc.xml, je passe le nodeRef du document ce qui permet de le traiter ainsi que de récupérer les personnes qui ont des droits dessus.

mon-webscript.get.desc.xml
    <webscript>
    <shortname>Mail utilisateurs avec lien document</shortname>
    <description>Mon webscript qui envoie des mails</description>
    <url>/sendMailUtilisateurs?nodeRef={nodeRef?}</url>
    <format default="json">argument</format>
    <authentication>user</authentication>
    </webscript>

et du coté du JS, on rajoute une boucle pour éviter les doublons (plusieurs mails envoyés à la même adresse)
mon-webscript.get.js

              var email = person.properties.email;
                     // Insertion dans la table users (suppression des doublons)
                      if(email) {
                       var exist = 0;
                         for(var seq=0 ; seq<users.length ; seq++) {
                             if (users[seq] == email) {
                                  exist = 1;
                             }
                         }
                         if (exist == 0){
                            users[users.length] = email;     
                        }

Bonne année 2011 à tous

amorisset
Champ in-the-making
Champ in-the-making
Bonjour,

Pouvez-vous nous indiquer comment vous avez corrigé vos erreurs ?

cordialement,

Aude

roxy
Champ in-the-making
Champ in-the-making
Bonjour,

j'ai l'impression que tout est dans les messages …
si un point vous semble opaque, dites-moi lequel et je vous donnerai des précisions

cordialement