[Share custom Action] Envoyer un document par mail

cancel
Showing results for 
Search instead for 
Did you mean: 
roxy
Member II

Re: [Share custom Action] Envoyer un document par mail

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
Active Member

Re: [Share custom Action] Envoyer un document par mail

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
Active Member

Re: [Share custom Action] Envoyer un document par mail

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
Member II

Re: [Share custom Action] Envoyer un document par mail

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
Member II

Re: [Share custom Action] Envoyer un document par mail

Bonjour,

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

cordialement,

Aude
roxy
Member II

Re: [Share custom Action] Envoyer un document par mail

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