JaliosXperience
fr en
Path > Home > Forums > French Forum
Link

Accès à la publication à partir du MailPolicyFilter lors d'une notification de Workflow

Richard Naoufal - on 9/3/10 at 11:27 AM

Bonjour,

Je souhaite modifier le corps d'un mail envoyé lors du passage d'une publication d'une étape de workflow à une autre.

J'ai mis en place un policyFilter de type BasicMailPolicyFilter et dans la fonction beforeSendMail(MailMessage msg, HashMap<String, Object> ctxt) je modifie le corps du mail.

J'ai besoin d'accéder à la publication qui est à l'origine de l'envoi et je ne vois pas comment y accéder, est ce que je peux mettre en place un Datacontroller qui stocke dans le ctxt l'id de publication en question et le récupérer dans ma méthode beforeSendMail ?

Merci pour votre aide.

Autre chose j'ai le sentiment que la fonction fetchMessage(MailMessage mail, boolean stored,Map<String, Object> ctxt) de mon BasicMailPolicyFilter n'est jamais appelée.

Jean-Noël Hoursin - on 9/3/10 at 3:16 PM

Bonjour,

La R&D a été contactée sur le sujet, nous reviendrons vers vous dès que nous aurons plus d'informations.

Le ticket de support n° 1986 a été créé. Pour toute demande relative à ce dossier, merci de nous communiquer ce numéro.

Cordialement

Jean-Noël Hoursin - on 9/3/10 at 5:49 PM

Ci-joint la réponse de la R&D :

Au vu du code (de WFAction) ce n'est pas possible,
il n'y a pas de point de débranchement permettant d'avoir accès à la publication courante ni référence à un identifiant
La construction du mail peut se faire via une AlarmeEntry donc sans contexte Accessoirement: http://support.jalios.com/jcms/1688_DBForumTopic/workflow-et-envoi-de-mails# Autre chose une piste pourrait être que la fonction fetchMessage(MailMessage mail, boolean stored,Map<String, Object> ctxt) de mon BasicMailPolicyFilter n'est jamais appelée.
Est ce que le mail entrant a été configuré ?

Richard Naoufal - on 9/7/10 at 6:12 PM

Bonjour,

J'ai mis en place un Datacontroller qui intercepte le traitement et qui stocke dans le jcmsContext la donnée dont j'ai besoin et que je récupère dans mon MailPolicyFilter.

Que pensez vous de la solution mise en place ?

Jean-Noël Hoursin - on 9/14/10 at 10:51 AM

Bonjour,

Cette solution ne semble pas stable car en cas de perte de contexte il y aura perte de la donnée en question.

Ne serait-il pas plus simple de faire un parser pour retrouver la publication dans le corps du texte (à travers le lien vers cette publication vous devriez pouvoir retrouver son id puis en retrouver le contenu)

Bonne journée.

Richard Naoufal - on 9/15/10 at 2:31 PM

Le corps du mail ne contient que le titre de la publication ce qui ne suffit pas pour retrouver la publication.

Comment obtenir le lien vers cette publication à partir du MailPolicyFilter ?

Jean-Phillipe Encausse - on 9/15/10 at 6:29 PM

Bonjour,

La classe WFAction ne contient pas de hook pour insérer votre code. Vous avez donc 4 possibilités:

  • Demander une évolution pour une prochaine version de JCMS
    • Demander une prestation à l'équipe services Jalios pour avoir un patch en avance de phase.
  • Demander les sources de la classe pour effectuer un correctif "de fortune"
  • Ne pas utiliser les WFAction et effectuer votre propre traitement.
  • Parser le corps du message à la recherche de l'URL de la publication et donc de son identifiant

La solution 1 ne me semble pas adapté pour résoudre votre problème rapidement. Pour diverses raisons entre autre contractuelles et de compatibilité avec l'existant je vous déconseille très fortement la solution 2. La solution 4 est vraiment absolument horrible.

Conclusion, je vous conseil de ne pas envoyer le mail via les Actions de Workflow mais de développer un DataController dans lequel:

  • Vous contrôlez la Publication
  • Testez l’état de workflow (pub.getPstatus())
  • Envoyez un mail via l'API JCMS

Vous ne pouvez pas simplement stocker la publication dans le JcmsContext car cet objet est un Wrapper qui encapsule la Requete HTTP. Par conséquent elle n'est valide que durant la durée de vie de la requête. Mais un DataController peut être invoquer suite à la modification automatique d'un contenu (Workflow Express par exemple) donc sans requêtes.

A partir de l'objet Publication, vous avez accès au Workflow et Workspace associés ce qui devrait vous permettre de construire le mail. La difficulté est surtout de retrouver la liste des destinataires:

     Set recipientSet = new HashSet();
      for (Iterator it1 = state.getTransitionSet().iterator(); it1.hasNext();) {
        WFTransition itWFTransition = (WFTransition) it1.next();
        for (Iterator it2 = itWFTransition.getRoleSet().iterator(); it2.hasNext();) {
          WFRole itWFRole = (WFRole) it2.next();
          WKRole itWKRole = pub.getWorkspace().getRole(itWFRole);
          if (itWKRole == null) {
            continue;
          }
          for (Iterator it3 = itWKRole.getWorkerSet(pub,true).iterator(); it3.hasNext();) {
            Member itMember = (Member) it3.next();
            if (MailUtil.checkEmail(itMember.getEmail()) && itMember.canWorkOn(pub)) {
              recipientSet.add(itMember);
            }
          }
        }
      }

      for (Iterator it = recipientSet.iterator(); it.hasNext();) {
         // Construction et envoie du mail
      }

Ce code qui parait complexe, itère sur toutes les transitions de l'état de workflow afin de retrouver les roles et membres associés.

Je note la RFE afin de trouver une solution pour donner accès depuis un MailPolicyFilter à la publication en cours de traitement.

Jean-Phillipe Encausse - on 9/15/10 at 7:31 PM

J'ajoute une précision à ma réponse générique.

Si vous maîtrisez votre workflow, et que les transitions sont synchrone (pas de changement d'état automatique: workflow express, date de publication/expiration, ...) vous pouvez alors effectivement stocker la publication en attribut de la requête courante.

Pensez a bien tester les cas de nullité dans le DataController, et MailPolicyFilter, vérifiez que vous êtes bien sur le réplicat leader (en cas de réplication)

Si vous êtes dans un cas simple ce sera plus rapide que de devoir recoder l'envoie du mail.

Olivier Jaquemet - on 1/14/11 at 4:18 PM

Bonjour,

Je vous confirme que votre demande d'évolution a été intégrée pour JCMS 7 et JCMS 6.1.4.

http://issues.jalios.com/browse/JCMS-2307

Login   Home   fr en
JALIOS SA - SIREN 440 126 035