Le composant Affecter une tâche permet d’affecter des tâches aux participants du workflow. Lorsqu’une tâche est affectée à un utilisateur ou à un groupe, une notification électronique est envoyée à l’utilisateur ou aux membres de groupe définis.
Cette notification par e-mail contient généralement des données dynamiques liées à la tâche. Ces données dynamiques sont récupérées à l’aide du système généré. propriétés de métadonnées.
Pour inclure des valeurs des données de formulaire envoyées dans la notification par e-mail, nous devons créer une propriété de métadonnées personnalisée, puis utiliser ces propriétés de métadonnées personnalisées dans le modèle de courrier électronique.
L’approche recommandée consiste à créer un composant OSGI qui implémente la méthode getUserMetadata de WorkitemUserMetadataService
Le code suivant crée 4 propriétés de métadonnées (firstName,lastName,reason et amountRequested) et définit sa valeur à partir des données envoyées. Par exemple, la propriété de métadonnées firstName La valeur de est définie sur la valeur de l’élément appelé firstName des données envoyées. Le code suivant suppose que les données envoyées du formulaire adaptatif sont au format xml. Les Forms adaptatives basées sur un schéma JSON ou un modèle de données de formulaire génèrent des données au format JSON.
package com.aemforms.workitemuserservice.core;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.Session;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.*;
import com.adobe.fd.workspace.service.external.WorkitemUserMetadataService;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.metadata.MetaDataMap;
@Component(property={Constants.SERVICE_DESCRIPTION+"=A sample implementation of a user metadata service.",
Constants.SERVICE_VENDOR+"=Adobe Systems",
"process.label"+"=Sample Custom Metadata Service"})
public class WorkItemUserServiceImpl implements WorkitemUserMetadataService {
private static final Logger log = LoggerFactory.getLogger(WorkItemUserServiceImpl.class);
@Override
public Map<String, String> getUserMetadata(WorkItem workItem, WorkflowSession workflowSession,MetaDataMap metadataMap)
{
HashMap<String, String> customMetadataMap = new HashMap<String, String>();
String payloadPath = workItem.getWorkflowData().getPayload().toString();
String dataFilePath = payloadPath + "/Data.xml/jcr:content";
Session session = workflowSession.adaptTo(Session.class);
DocumentBuilderFactory factory = null;
DocumentBuilder builder = null;
Document xmlDocument = null;
javax.jcr.Node xmlDataNode = null;
try
{
xmlDataNode = session.getNode(dataFilePath);
InputStream xmlDataStream = xmlDataNode.getProperty("jcr:data").getBinary().getStream();
XPath xPath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
xmlDocument = builder.parse(xmlDataStream);
Node firstNameNode = (org.w3c.dom.Node) xPath.compile("afData/afUnboundData/data/firstName")
.evaluate(xmlDocument, javax.xml.xpath.XPathConstants.NODE);
log.debug("The value of first name element is " + firstNameNode.getTextContent());
Node lastNameNode = (org.w3c.dom.Node) xPath.compile("afData/afUnboundData/data/lastName")
.evaluate(xmlDocument, javax.xml.xpath.XPathConstants.NODE);
Node amountRequested = (org.w3c.dom.Node) xPath
.compile("afData/afUnboundData/data/amountRequested")
.evaluate(xmlDocument, javax.xml.xpath.XPathConstants.NODE);
Node reason = (org.w3c.dom.Node) xPath.compile("afData/afUnboundData/data/reason")
.evaluate(xmlDocument, javax.xml.xpath.XPathConstants.NODE);
customMetadataMap.put("firstName", firstNameNode.getTextContent());
customMetadataMap.put("lastName", lastNameNode.getTextContent());
customMetadataMap.put("amountRequested", amountRequested.getTextContent());
customMetadataMap.put("reason", reason.getTextContent());
log.debug("Created " + customMetadataMap.size() + " metadata properties");
}
catch (Exception e)
{
log.debug(e.getMessage());
}
return customMetadataMap;
}
}
Dans le modèle de courrier électronique, vous pouvez inclure la propriété de métadonnées en utilisant la syntaxe suivante, où amountRequested correspond à la propriété de métadonnées. ${amountRequested}
Une fois le composant OSGi créé et déployé sur AEM serveur, configurez le composant Assign Task comme illustré ci-dessous pour utiliser les propriétés de métadonnées personnalisées.
Une fois la tâche d’affectation envoyée au formulaire, la notification est envoyée à l’ID de courrier électronique associé à l’utilisateur administrateur. La capture d’écran suivante présente un exemple de notification d’affectation de tâche
Le modèle de courrier électronique pour la notification de tâche d’affectation doit être au format suivant.
subject=Task Assigned - ${workitem_title}
message=Chaîne représentant votre modèle d’email sans aucun nouveau caractère de ligne.
Dans certains cas, vous souhaiterez peut-être inclure les commentaires du propriétaire précédent de la tâche dans les notifications de tâche suivantes. Le code permettant de capturer le dernier commentaire de la tâche est répertorié ci-dessous :
package samples.aemforms.taskcomments.core;
import org.osgi.service.component.annotations.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.Session;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.HistoryItem;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.adobe.fd.workspace.service.external.WorkitemUserMetadataService;
@Component(property = {
Constants.SERVICE_DESCRIPTION + "=A sample implementation of a user metadata service.",
Constants.SERVICE_VENDOR + "=Adobe Systems",
"process.label" + "=Capture Workflow Comments"
})
public class CaptureTaskComments implements WorkitemUserMetadataService {
private static final Logger log = LoggerFactory.getLogger(CaptureTaskComments.class);
@Override
public Map <String, String> getUserMetadata(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metadataMap) {
HashMap < String, String > customMetadataMap = new HashMap < String, String > ();
workflowSession.adaptTo(Session.class);
try {
List <HistoryItem> workItemsHistory = workflowSession.getHistory(workItem.getWorkflow());
int listSize = workItemsHistory.size();
HistoryItem lastItem = workItemsHistory.get(listSize - 1);
String reviewerComments = (String) lastItem.getWorkItem().getMetaDataMap().get("workitemComment");
log.debug("####The comment I got was ...." + reviewerComments);
customMetadataMap.put("comments", reviewerComments);
log.debug("Created " + customMetadataMap.size() + " metadata properties");
} catch (Exception e) {
log.debug(e.getMessage());
}
return customMetadataMap;
}
}
Le lot avec le code ci-dessus peut être téléchargé ici