I det här avsnittet beskrivs hur du utvecklar anpassade stegkomponenter för dina arbetsflöden och hur du interagerar programmatiskt med arbetsflöden.
När du skapar ett anpassat arbetsflödessteg ingår följande aktiviteter:
Du kan också interagera med arbetsflödena från program och skript.
En arbetsflödesstegkomponent definierar utseendet och beteendet för steget när du skapar arbetsflödesmodeller:
Som med alla komponenter, ärver komponenter för arbetsflödessteg från komponenten som anges för sling:resourceSuperType
-egenskap. I följande diagram visas hierarkin för cq:component
noder som utgör grunden för alla stegkomponenter i arbetsflödet. Diagrammet innehåller även Processsteg, Deltagarsteg och Dynamiskt deltagarsteg eftersom dessa är de vanligaste (och mest grundläggande) startpunkterna för utveckling av anpassade stegkomponenter.
Du måste ändrar ingenting i /libs
bana.
Detta beror på innehållet i /libs
skrivs över nästa gång du uppgraderar din instans (och kan mycket väl skrivas över när du använder en snabbkorrigering eller ett funktionspaket).
Den rekommenderade metoden för konfiguration och andra ändringar är:
/libs
under /apps
/apps
The /libs/cq/workflow/components/model/step
är närmaste gemensamma överordnade Processsteg, Deltagarsteg och Dynamiskt deltagarsteg, som alla ärver följande objekt:
step.jsp
The step.jsp
skriptet återger titeln på stegkomponenten när den läggs till i en modell.
En dialogruta med följande flikar:
När flikarna i redigeringsdialogrutan för en stegkomponent inte matchar det här standardutseendet har stegkomponenten definierat skript, nodegenskaper eller dialogruteflikar som åsidosätter de ärvda flikarna.
Följande objekt är tillgängliga (beroende på stegtyp) i ECMA-skript:
WorkItem workItem
WorkflowSession workflowSession
WorkflowData workflowData
args
: -array med processargumenten.
sling
: för att få tillgång till andra tjänster.
jcrSession
Du kan använda arbetsflödets metadata för att behålla information som krävs under arbetsflödets livstid. Ett vanligt krav för arbetsflödessteg är att behålla data för framtida användning i arbetsflödet eller att hämta beständiga data.
Det finns tre typer av MetaDataMap-objekt - för Workflow
, WorkflowData
och WorkItem
objekt. De har alla samma syfte - att lagra metadata.
En WorkItem har en egen MetaDataMap som bara kan användas medan arbetsobjektet (t.ex. steg) körs.
Båda Workflow
och WorkflowData
metadatamapparna delas över hela arbetsflödet. I dessa fall rekommenderas att endast WorkflowData
metadatamappning.
Stegkomponenter för arbetsflöde kan som skapats på samma sätt som andra komponenter.
Om du vill ärva från en av de (befintliga) grundläggande stegkomponenterna lägger du till följande egenskap i cq:Component
nod:
Namn: sling:resourceSuperType
Typ: String
Värde: En av följande sökvägar som matchar en baskomponent:
cq/workflow/components/model/process
cq/workflow/components/model/participant
cq/workflow/components/model/dynamic_participant
Använd följande procedur för att ange standardvärden för Titel och Beskrivning fälten på Vanliga -fliken.
Fältvärdena visas i steginstansen när båda följande krav är uppfyllda:
I redigeringsdialogrutan för steget lagras titeln och beskrivningen på följande platser: >
./jcr:title
./jcr:description
platser
Detta krav är uppfyllt när redigeringsdialogrutan använder fliken Allmänt och /libs/cq/flow/components/step/step
-komponenten implementeras.
Stegkomponenten eller ett överordnat element för komponenten åsidosätter inte step.jsp
skript som /libs/cq/flow/components/step/step
-komponenten implementeras.
Under cq:Component
lägg till följande nod:
cq:editConfig
cq:EditConfig
Mer information om cq:editConfig-noden finns i Konfigurera redigeringsbeteendet för en komponent.
Under cq:EditConfig
lägg till följande nod:
cq:formParameters
nt:unstructured
Lägg till String
egenskaper för följande namn till cq:formParameters
nod:
jcr:title
: Värdet fyller ut Titel fält för Vanliga -fliken.jcr:description
: Värdet fyller ut Beskrivning fält för Vanliga -fliken.Se Bevara och få åtkomst till data. Mer information om hur du får åtkomst till egenskapsvärdet under körning finns i Åtkomst till egenskapsvärden för dialogrutor vid körning.
Egenskapen name för cq:Widget
-objekt anger den JCR-nod som lagrar widgetens värde. När widgetar i arbetsflödesdialogrutan lagrar komponenter värden under ./metaData
nod läggs värdet till i arbetsflödet MetaDataMap
.
Ett textfält i en dialogruta är till exempel ett cq:Widget
nod som har följande egenskaper:
Namn | Typ | Värde |
---|---|---|
xtype |
String |
textarea |
name |
String |
./metaData/subject |
fieldLabel |
String |
Email Subject |
Värdet som anges i det här textfältet läggs till i arbetsflödesinstansens [MetaDataMap](#metadatamaps)
-objektet och är associerat med subject
nyckel.
När tangenten är PROCESS_ARGS
är värdet lätt tillgängligt i ECMA-skriptimplementeringar via args
variabel. I det här fallet är värdet för name-egenskapen ./metaData/PROCESS_ARGS.
Med varje basstegskomponent kan utvecklare av arbetsflödesmodeller konfigurera följande nyckelfunktioner i designläge:
Om du vill fokusera komponenten för användning i ett specifikt arbetsflödesscenario konfigurerar du nyckelfunktionen i designen och tar bort möjligheten för modellutvecklare att ändra den.
Lägg till följande nod under cq:component-noden:
cq:editConfig
cq:EditConfig
Mer information om cq:editConfig-noden finns i Konfigurera redigeringsbeteendet för en komponent.
Under cq:EditConfig-noden lägger du till följande nod:
cq:formParameters
nt:unstructured
Lägg till en String
egenskapen till cq:formParameters
nod. Komponentens överordnade typ avgör egenskapens namn:
PROCESS
PARTICIPANT
DYNAMIC_PARTICIPANT
Ange egenskapens värde:
PROCESS
: Sökvägen till ECMA-skriptet eller PID för den tjänst som implementerar stegbeteendet.PARTICIPANT
: ID för den användare som är tilldelad arbetsuppgiften.DYNAMIC_PARTICIPANT
: Sökvägen till ECMA-skriptet eller PID för den tjänst som väljer användaren att tilldela arbetsposten.Om du vill ta bort möjligheten för modellutvecklare att ändra egenskapsvärden åsidosätter du dialogrutan för komponentens supertyp.
Anpassa deltagarstegskomponenten för att tillhandahålla funktioner som finns i Steg för formulärdeltagare och Steg för dialogdeltagare komponenter:
Utför följande procedur för den nya komponenten (se Skapa anpassade komponenter för arbetsflödessteg):
Under cq:Component
lägg till följande nod:
cq:editConfig
cq:EditConfig
Mer information om cq:editConfig-noden finns i Konfigurera redigeringsbeteendet för en komponent.
Under cq:EditConfig-noden lägger du till följande nod:
cq:formParameters
nt:unstructured
Om du vill visa ett formulär när användaren öppnar arbetsposten lägger du till följande egenskap i cq:formParameters
nod:
FORM_PATH
String
Om du vill visa en anpassad dialogruta när användaren slutför arbetsposten lägger du till följande egenskap i cq:formParameters
nod
DIALOG_PATH
String
Under cq:Component
nod, lägga till cq:EditConfig
nod. Nedan läggs ett nt:unstructured
node (must be named cq:formParameters
) och i den noden lägger du till följande egenskaper:
Namn: PROCESS_AUTO_ADVANCE
Typ: Boolean
Värde:
true
arbetsflödet kommer att köra det steget och fortsätta - det här är standard och rekommenderas ocksåfalse
, kommer arbetsflödet att köras och stoppas, detta kräver extra hantering, så true
rekommenderasNamn: DO_NOTIFY
Boolean
Du kan använda arbetsflödets metadata för att behålla information som krävs under arbetsflödets livstid - och mellan steg. Ett vanligt krav för arbetsflödessteg är att bevara data för framtida bruk eller att hämta beständiga data från tidigare steg.
Metadata för arbetsflöde lagras i en MetaDataMap
-objekt. Java API innehåller Workflow.getWorkflowData
metod som returnerar WorkflowData
objekt som ger rätt MetaDataMap
-objekt. Detta WorkflowData
MetaDataMap
-objektet är tillgängligt för OSGi-tjänsten eller ECMA-skriptet för en stegkomponent.
Körningsmetoden för WorkflowProcess
implementeringen är klar WorkItem
-objekt. Använd det här objektet för att få WorkflowData
-objekt för den aktuella arbetsflödesinstansen. I följande exempel läggs ett objekt till i arbetsflödet MetaDataMap
och loggar sedan varje objekt. Objektet ("minkey","My Step Value") är tillgängligt för efterföljande steg i arbetsflödet.
public void execute(WorkItem item, WorkflowSession session, MetaDataMap args) throws WorkflowException {
MetaDataMap wfd = item.getWorkflow().getWorkflowData().getMetaDataMap();
wfd.put("mykey", "My Step Value");
Set<String> keyset = wfd.keySet();
Iterator<String> i = keyset.iterator();
while (i.hasNext()){
Object key = i.next();
log.info("The workflow medata includes key {} and value {}",key.toString(),wfd.get(key).toString());
}
}
The graniteWorkItem
variabeln är ECMA-skriptbeteckningen för den aktuella WorkItem
Java-objekt. Därför kan du använda graniteWorkItem
variabel för att hämta arbetsflödets metadata. Följande ECMA-skript kan användas för att implementera en Processsteg för att lägga till ett objekt i arbetsflödet MetaDataMap
och sedan logga varje objekt. Dessa objekt är sedan tillgängliga för efterföljande steg i arbetsflödet.
The metaData
variabeln som är omedelbart tillgänglig för stegskriptet är metadata för steget. Metadata för steget skiljer sig från metadata för arbetsflödet.
var currentDateInMillis = new Date().getTime();
graniteWorkItem.getWorkflowData().getMetaDataMap().put("hardcodedKey","theKey");
graniteWorkItem.getWorkflowData().getMetaDataMap().put("currentDateInMillisKey",currentDateInMillis);
var iterator = graniteWorkItem.getWorkflowData().getMetaDataMap().keySet().iterator();
while (iterator.hasNext()){
var key = iterator.next();
log.info("Workflow metadata key, value = " + key.toString() + ", " + graniteWorkItem.getWorkflowData().getMetaDataMap().get(key));
}
The MetaDataMap
objekt i arbetsflödesinstanser är användbara när du vill lagra och hämta data under arbetsflödets hela livstid. För implementering av komponenter för arbetsflödessteg MetaDataMap
är särskilt användbart för att hämta egenskapsvärden för komponenter vid körning.
Mer information om hur du konfigurerar komponentdialogrutan för att lagra egenskaper som arbetsflödesmetadata finns i Spara egenskapsvärden i arbetsflödesmetadata.
Arbetsflödet MetaDataMap
är tillgängligt för implementering av Java- och ECMA-skriptprocesser:
I Java-implementeringar av WorkflowProcess-gränssnittet har args
parametern är MetaDataMap
-objekt för arbetsflödet.
I ECMA-skriptimplementeringar är värdet tillgängligt med args
och metadata
variabler.
Redigeringsdialogrutan i Processsteg -komponenten innehåller Argument -egenskap. Värdet för Argument -egenskapen lagras i arbetsflödets metadata och är kopplad till PROCESS_ARGS
nyckel.
I följande diagram är värdet för Argument egenskapen är argument1, argument2
:
Följande Java-kod är execute
metod för WorkflowProcess
implementering. Metoden loggar värdet i args
MetaDataMap
som är associerad med PROCESS_ARGS
nyckel.
public void execute(WorkItem item, WorkflowSession session, MetaDataMap args) throws WorkflowException {
if (args.containsKey("PROCESS_ARGS")){
log.info("workflow metadata for key PROCESS_ARGS and value {}",args.get("PROCESS_ARGS","string").toString());
}
}
När ett processsteg som använder den här Java-implementeringen körs innehåller loggen följande post:
16.02.2018 12:07:39.566 *INFO* [JobHandler: /var/workflow/instances/server0/2018-02-16/model_855140139900189:/content/we-retail/de] com.adobe.example.workflow.impl.process.LogArguments workflow metadata for key PROCESS_ARGS and value argument1, argument2
Följande ECMA-skript används som process för Processsteg. Här loggas antalet argument och argumentvärdena:
var iterator = graniteWorkItem.getWorkflowData().getMetaDataMap().keySet().iterator();
while (iterator.hasNext()){
var key = iterator.next();
log.info("Workflow metadata key, value = " + key.toString() + ", " + graniteWorkItem.getWorkflowData().getMetaDataMap().get(key));
}
log.info("hardcodedKey "+ graniteWorkItem.getWorkflowData().getMetaDataMap().get("hardcodedKey"));
log.info("currentDateInMillisKey "+ graniteWorkItem.getWorkflowData().getMetaDataMap().get("currentDateInMillisKey"));
I det här avsnittet beskrivs hur du arbetar med argument för processsteg. Informationen gäller även för dynamiska deltagarval.
Ett annat exempel på hur du lagrar komponentegenskaper i arbetsflödets metadata finns i Exempel: Skapa ett steg för loggningsarbetsflöde. Det här exemplet innehåller en dialogruta som associerar metadatavärde med en annan nyckel än PROCESS_ARGS.
Inom ett skript för Processsteg -komponent, argument är tillgängliga via args
-objekt.
När du skapar en anpassad stegkomponent, objektet metaData
är tillgängligt i ett skript. Det här objektet är begränsat till ett strängargument.
När processteg startas under en arbetsflödesprocess skickar stegen en begäran till en OSGi-tjänst eller kör ett ECMA-skript. Utveckla den tjänst eller det ECMA-skript som utför de åtgärder som arbetsflödet kräver.
Mer information om hur du associerar processstegskomponenten med tjänsten eller skriptet finns i Processsteg eller Åsidosätta stegimplementeringen.
Så här definierar du ett processteg som en OSGI-tjänstkomponent (Java bundle):
Skapa paketet och distribuera det i OSGI-behållaren. Läs dokumentationen om hur du skapar ett paket med CRXDE Lite eller Eclipse.
OSGI-komponenten måste implementera WorkflowProcess
gränssnitt med execute()
-metod. Se exempelkoden nedan.
Paketnamnet måste läggas till i <*Private-Package*>
i maven-bundle-plugin
konfiguration.
Lägg till SCR-egenskapen process.label
och ange värdet efter behov. Detta är det namn som processsteget listas som när du använder det generiska Processsteg -komponenten. Se exemplet nedan.
I Modeller redigerare, lägga till processteget i arbetsflödet med hjälp av det generiska Processsteg -komponenten.
I redigeringsdialogrutan (på Processsteg), gå till Process och välja processimplementering.
Om du använder argument i koden anger du Processargument. Till exempel: false.
Spara ändringarna för både steget och arbetsflödesmodellen (modellredigerarens övre vänstra hörn).
Java-metoderna, respektive klasserna som implementerar den körbara Java-metoden, registreras som OSGI-tjänster, vilket gör att du kan lägga till metoder när som helst under körningen.
Följande OSGI-komponent lägger till egenskapen approved
till noden för sidinnehåll när nyttolasten är en sida:
package com.adobe.example.workflow.impl.process;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
/**
* Sample workflow process that sets an <code>approve</code> property to the payload based on the process argument value.
*/
@Component
@Service
public class MyProcess implements WorkflowProcess {
@Property(value = "An example workflow process implementation.")
static final String DESCRIPTION = Constants.SERVICE_DESCRIPTION;
@Property(value = "Adobe")
static final String VENDOR = Constants.SERVICE_VENDOR;
@Property(value = "My Sample Workflow Process")
static final String LABEL="process.label";
private static final String TYPE_JCR_PATH = "JCR_PATH";
public void execute(WorkItem item, WorkflowSession session, MetaDataMap args) throws WorkflowException {
WorkflowData workflowData = item.getWorkflowData();
if (workflowData.getPayloadType().equals(TYPE_JCR_PATH)) {
String path = workflowData.getPayload().toString() + "/jcr:content";
try {
Session jcrSession = session.adaptTo(Session.class);
Node node = (Node) jcrSession.getItem(path);
if (node != null) {
node.setProperty("approved", readArgument(args));
jcrSession.save();
}
} catch (RepositoryException e) {
throw new WorkflowException(e.getMessage(), e);
}
}
}
private boolean readArgument(MetaDataMap args) {
String argument = args.get("PROCESS_ARGS", "false");
return argument.equalsIgnoreCase("true");
}
}
Om processen misslyckas tre gånger i rad placeras ett objekt i Inkorgen för arbetsflödesadministratören.
Med ECMA-skript kan skriptutvecklare implementera processsteg. Skripten finns i JCR-databasen och körs därifrån.
I följande tabell visas de variabler som är omedelbart tillgängliga för att bearbeta skript, vilket ger tillgång till objekt i arbetsflödets Java API.
Java-klass | Skriptvariabelnamn | Beskrivning |
---|---|---|
com.adobe.granite.workflow.exec.WorkItem |
graniteWorkItem |
Den aktuella steginstansen. |
com.adobe.granite.workflow.WorkflowSession |
graniteWorkflowSession |
Arbetsflödessessionen för den aktuella steginstansen. |
String[] (innehåller processargument) |
args |
Stegargumenten. |
com.adobe.granite.workflow.metadata.MetaDataMap |
metaData |
Metadata för den aktuella steginstansen. |
org.apache.sling.scripting.core.impl.InternalScriptHelper |
sling |
Ger åtkomst till Sling-miljön. |
Följande exempelskript visar hur du får åtkomst till JCR-noden som representerar arbetsflödets nyttolast. The graniteWorkflowSession
variabeln anpassas till en JCR-sessionsvariabel, som används för att hämta noden från nyttolastsökvägen.
var workflowData = graniteWorkItem.getWorkflowData();
if (workflowData.getPayloadType() == "JCR_PATH") {
var path = workflowData.getPayload().toString();
var jcrsession = graniteWorkflowSession.adaptTo(Packages.javax.jcr.Session);
var node = jcrsession.getNode(path);
if (node.hasProperty("approved")){
node.setProperty("approved", args[0] == "true" ? true : false);
node.save();
}
}
Följande skript kontrollerar om nyttolasten är en bild ( .png
, skapar en svartvit bild från den och sparar den som en nod på samma nivå.
var workflowData = graniteWorkItem.getWorkflowData();
if (workflowData.getPayloadType() == "JCR_PATH") {
var path = workflowData.getPayload().toString();
var jcrsession = graniteWorkflowSession.adaptTo(Packages.javax.jcr.Session);
var node = jcrsession.getRootNode().getNode(path.substring(1));
if (node.isNodeType("nt:file") && node.getProperty("jcr:content/jcr:mimeType").getString().indexOf("image/") == 0) {
var is = node.getProperty("jcr:content/jcr:data").getStream();
var layer = new Packages.com.day.image.Layer(is);
layer.grayscale();
var parent = node.getParent();
var gn = parent.addNode("grey" + node.getName(), "nt:file");
var content = gn.addNode("jcr:content", "nt:resource");
content.setProperty("jcr:mimeType","image/png");
var cal = Packages.java.util.Calendar.getInstance();
content.setProperty("jcr:lastModified",cal);
var f = Packages.java.io.File.createTempFile("test",".png");
var tout = new Packages.java.io.FileOutputStream(f);
layer.write("image/png", 1.0, tout);
var fis = new Packages.java.io.FileInputStream(f);
content.setProperty("jcr:data", fis);
parent.save();
tout.close();
fis.close();
is.close();
f.deleteOnExit();
}
}
Så här använder du skriptet:
Skapa skriptet (till exempel med CRXDE Lite) och spara det i databasen nedan //apps/workflow/scripts/
Ange en titel som identifierar skriptet i Processsteg redigeringsdialogrutan lägger du till följande egenskaper i jcr:content
nod i skriptet:
Namn | Typ | Värde |
---|---|---|
jcr:mixinTypes |
Name[] |
mix:title |
jcr:title |
String |
Namnet som ska visas i redigeringsdialogrutan. |
Redigera Processsteg -instans och ange skriptet som ska användas.
Du kan utveckla deltagarval för Dynamiskt deltagarsteg -komponenter.
När en Dynamiskt deltagarsteg -komponenten startas under ett arbetsflöde, måste steget definiera deltagaren som det genererade arbetsobjektet kan tilldelas till. Så här gör du i det här steget:
Du kan utveckla en tjänst eller ett ECMA-skript som väljer deltagare enligt kraven i ditt arbetsflöde.
Mer information om hur du associerar Dynamiskt deltagarsteg med tjänsten eller skriptet, se Dynamiskt deltagarsteg eller Åsidosätta stegimplementeringen.
Så här definierar du ett deltagarsteg som en OSGI-tjänstkomponent (Java-klass):
OSGI-komponenten måste implementera ParticipantStepChooser
gränssnitt med getParticipant()
-metod. Se exempelkoden nedan.
Skapa paketet och distribuera det i OSGI-behållaren.
Lägg till SCR-egenskapen chooser.label
och ange värdet efter behov. Detta är namnet som deltagarens väljare visas med Dynamiskt deltagarsteg -komponenten. Se exemplet:
package com.adobe.example.workflow.impl.process;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.ParticipantStepChooser;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
/**
* Sample dynamic participant step that determines the participant based on a path given as argument.
*/
@Component
@Service
public class MyDynamicParticipant implements ParticipantStepChooser {
@Property(value = "An example implementation of a dynamic participant chooser.")
static final String DESCRIPTION = Constants.SERVICE_DESCRIPTION;
@Property(value = "Adobe")
static final String VENDOR = Constants.SERVICE_VENDOR;
@Property(value = "Dynamic Participant Chooser Process")
static final String LABEL=ParticipantStepChooser.SERVICE_PROPERTY_LABEL;
private static final String TYPE_JCR_PATH = "JCR_PATH";
public String getParticipant(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args) throws WorkflowException {
WorkflowData workflowData = workItem.getWorkflowData();
if (workflowData.getPayloadType().equals(TYPE_JCR_PATH)) {
String path = workflowData.getPayload().toString();
String pathFromArgument = args.get("PROCESS_ARGS", String.class);
if (pathFromArgument != null && path.startsWith(pathFromArgument)) {
return "admin";
}
}
return "administrators";
}
}
I Modeller redigerare, lägga till steget för den dynamiska deltagaren i arbetsflödet med hjälp av det generiska Dynamiskt deltagarsteg -komponenten.
I redigeringsdialogrutan väljer du Väljare för deltagare och välj implementering av väljaren.
Om du använder argument i koden anger du Processargument. I det här exemplet: /content/we-retail/de
.
Spara ändringarna för både steget och arbetsflödesmodellen.
Du kan skapa ett ECMA-skript som väljer användaren som är tilldelad arbetsposten som Deltagarsteg genererar. Skriptet måste innehålla en funktion med namnet getParticipant
som inte kräver några argument och returnerar String
som innehåller ID:t för en användare eller grupp.
Skript finns i JCR-databasen och körs därifrån.
I följande tabell visas de variabler som ger omedelbar åtkomst till Java-objekt i arbetsflöden i dina skript.
Java-klass | Skriptvariabelnamn |
---|---|
com.adobe.granite.workflow.exec.WorkItem |
graniteWorkItem |
com.adobe.granite.workflow.WorkflowSession |
graniteWorkflowSession |
String[] (innehåller processargument) |
args |
com.adobe.granite.workflow.metadata.MetaDataMap |
metaData |
org.apache.sling.scripting.core.impl.InternalScriptHelper |
sling |
function getParticipant() {
var workflowData = graniteWorkItem.getWorkflowData();
if (workflowData.getPayloadType() == "JCR_PATH") {
var path = workflowData.getPayload().toString();
if (path.indexOf("/content/we-retail/de") == 0) {
return "admin";
} else {
return "administrators";
}
}
}
Skapa skriptet (till exempel med CRXDE Lite) och spara det i databasen nedan //apps/workflow/scripts
Ange en titel som identifierar skriptet i Processsteg redigeringsdialogrutan lägger du till följande egenskaper i jcr:content
nod i skriptet:
Namn | Typ | Värde |
---|---|---|
jcr:mixinTypes |
Name[] |
mix:title |
jcr:title |
String |
Namnet som ska visas i redigeringsdialogrutan. |
Redigera Dynamiskt deltagarsteg -instans och ange skriptet som ska användas.
Arbetsflödespaket kan skickas till ett arbetsflöde för bearbetning. Arbetsflödespaket innehåller referenser till resurser som sidor och resurser.
Följande arbetsflödessteg accepterar arbetsflödespaket för aktivering av gruppsidor:
Du kan utveckla arbetsflödessteg som hämtar paketresurserna och bearbetar dem. Följande medlemmar i com.day.cq.workflow.collection
paket ger åtkomst till arbetsflödespaket:
ResourceCollection
: Klassen för arbetsflödespaket.ResourceCollectionUtil
: Används för att hämta ResourceCollection-objekt.ResourceCollectionManager
: Skapar och hämtar samlingar. En implementering distribueras som en OSGi-tjänst.I följande exempel visas hur Java-klassen hämtar paketresurser:
package com.adobe.example;
import java.util.ArrayList;
import java.util.List;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.collection.ResourceCollection;
import com.day.cq.workflow.collection.ResourceCollectionManager;
import com.day.cq.workflow.collection.ResourceCollectionUtil;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.felix.scr.annotations.Reference;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
@Component
@Service
public class LaunchBulkActivate implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(LaunchBulkActivate.class);
@Property(value="Bulk Activate for Launches")
static final String PROCESS_NAME ="process.label";
@Property(value="A sample workflow process step to support Launches bulk activation of pages")
static final String SERVICE_DESCRIPTION = Constants.SERVICE_DESCRIPTION;
@Reference
private ResourceCollectionManager rcManager;
public void execute(WorkItem workItem, WorkflowSession workflowSession) throws Exception {
Session session = workflowSession.getSession();
WorkflowData data = workItem.getWorkflowData();
String path = null;
String type = data.getPayloadType();
if (type.equals(TYPE_JCR_PATH) && data.getPayload() != null) {
String payloadData = (String) data.getPayload();
if (session.itemExists(payloadData)) {
path = payloadData;
}
} else if (data.getPayload() != null && type.equals(TYPE_JCR_UUID)) {
Node node = session.getNodeByUUID((String) data.getPayload());
path = node.getPath();
}
// CUSTOMIZED CODE IF REQUIRED....
if (path != null) {
// check for resource collection
ResourceCollection rcCollection = ResourceCollectionUtil.getResourceCollection((Node)session.getItem(path), rcManager);
// get list of paths to replicate (no resource collection: size == 1
// otherwise size >= 1
List<String> paths = getPaths(path, rcCollection);
for (String aPath: paths) {
// CUSTOMIZED CODE....
}
} else {
log.warn("Cannot process because path is null for this " + "workitem: " + workItem.toString());
}
}
/**
* helper
*/
private List<String> getPaths(String path, ResourceCollection rcCollection) {
List<String> paths = new ArrayList<String>();
if (rcCollection == null) {
paths.add(path);
} else {
log.debug("ResourceCollection detected " + rcCollection.getPath());
// this is a resource collection. the collection itself is not
// replicated. only its members
try {
List<Node> members = rcCollection.list(new String[]{"cq:Page", "dam:Asset"});
for (Node member: members) {
String mPath = member.getPath();
paths.add(mPath);
}
} catch(RepositoryException re) {
log.error("Cannot build path list out of the resource collection " + rcCollection.getPath());
}
}
return paths;
}
}
Ett enkelt sätt att börja skapa ett eget anpassat steg är att kopiera ett befintligt steg från:
/libs/cq/workflow/components/model
Återskapa sökvägen under /apps; till exempel:
/apps/cq/workflow/components/model
De nya mapparna är av typen nt:folder
:
- apps
- cq
- workflow (nt:folder)
- components (nt:folder)
- model (nt:folder)
Det här steget gäller inte för den klassiska UI-modellredigeraren.
Placera sedan det kopierade steget i mappen /apps; till exempel som:
/apps/cq/workflow/components/model/myCustomStep
Här är resultatet av vårt skräddarsydda steg:
Eftersom endast rubriken och inte informationen inte visas på kortet i standardgränssnittet, details.jsp
behövs inte som den var för den klassiska gränssnittsredigeraren.
Använd följande egenskaper på noden:
/apps/cq/workflow/components/model/myCustomStep
Intresseområden:
sling:resourceSuperType
Måste ärva från ett befintligt steg.
I det här exemplet ärver vi från bassteget vid cq/workflow/components/model/step
men du kan använda andra supertyper som participant
, process
, osv.
jcr:title
Visar titeln när komponenten visas i stegwebbläsaren (den vänstra panelen i arbetsflödesmodellredigeraren).
cq:icon
Används för att ange en Korallsikon för steget.
componentGroup
Måste vara något av följande:
Nu kan du öppna en arbetsflödesmodell för redigering. I stegen i webbläsaren kan du filtrera så att du ser Mitt anpassade steg:
Dra Mitt anpassade steg På modellen visas kortet:
Om nej cq:icon
har definierats för steget återges en standardikon med de två första bokstäverna i titeln. Till exempel:
Efter Skapa det grundläggande steget, definiera steget Konfigurera dialogrutan enligt följande:
Konfigurera egenskaperna på noden cq:editConfig
enligt följande:
Intresseområden:
cq:inherit
När inställt på true
ärver stegkomponenten egenskaperna från det steg som du angav i sling:resourceSuperType
.
cq:disableTargeting
Ange efter behov.
Konfigurera egenskaperna på noden cq:formsParameter
enligt följande:
Intresseområden:
jcr:title
Anger standardtiteln på stegkortet i modellkartan och i Titel fält för Min egen - stegegenskaper konfigurationsdialogruta.
Du kan också definiera egna anpassade egenskaper.
Konfigurera egenskaperna på noden cq:listeners
.
The cq:listener
Med noden och dess egenskaper kan du ange händelsehanterare som reagerar på händelser i den pekaktiverade UI-modellredigeraren. som att dra ett steg till en modellsida eller redigera en stegegenskap.
Intresseområden:
afterMove: REFRESH_PAGE
afterdelete: CQ.workflow.flow.Step.afterDelete
afteredit: CQ.workflow.flow.Step.afterEdit
afterinsert: CQ.workflow.flow.Step.afterInsert
Den här konfigurationen är viktig för att redigeraren ska fungera korrekt. I de flesta fall får den här konfigurationen inte ändras.
Inställning cq:inherit
till true (på cq:editConfig
(se ovan) kan du ärva den här konfigurationen utan att behöva inkludera den explicit i stegdefinitionen. Om inget arv finns på plats måste du lägga till den här noden med följande egenskaper och värden.
I det här exemplet har arv aktiverats så att vi kan ta bort cq:listeners
och steget fungerar fortfarande korrekt.
Nu kan du lägga till en instans av steget i en arbetsflödesmodell. När du Konfigurera I det här steget ser du dialogrutan:
Markering för ett anpassat steg visas i .content.xml
för komponentens rotnod. Provet .content.xml
som används i det här exemplet:
/apps/cq/workflow/components/model/myCustomStep/.content.xml
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="https://sling.apache.org/jcr/sling/1.0" xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0"
cq:icon="bell"
jcr:primaryType="cq:Component"
jcr:title="My Custom Step"
sling:resourceSuperType="cq/workflow/components/model/process"
allowedParents="[*/parsys]"
componentGroup="Workflow"/>
The _cq_editConfig.xml
exempel som används i det här exemplet:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0" xmlns:nt="https://www.jcp.org/jcr/nt/1.0"
cq:disableTargeting="{Boolean}true"
cq:inherit="{Boolean}true"
jcr:primaryType="cq:EditConfig">
<cq:formParameters
jcr:primaryType="nt:unstructured"
jcr:title="My Custom Step Card"
SAMPLE_PROPERY="sample value"/>
<cq:listeners
jcr:primaryType="cq:EditListenersConfig"
afterdelete="CQ.workflow.flow.Step.afterDelete"
afteredit="CQ.workflow.flow.Step.afterEdit"
afterinsert="CQ.workflow.flow.Step.afterInsert"
afterMove="REFRESH_PAGE"/>
</jcr:root>
The _cq_dialog/.content.xml
exempel som används i det här exemplet:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="https://sling.apache.org/jcr/sling/1.0" xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0" xmlns:nt="https://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="nt:unstructured"
jcr:title="My Custom - Step Properties"
sling:resourceType="cq/gui/components/authoring/dialog">
<content
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/tabs">
<items jcr:primaryType="nt:unstructured">
<common
cq:hideOnEdit="true"
jcr:primaryType="nt:unstructured"
jcr:title="Common"
sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns"/>
<process
cq:hideOnEdit="true"
jcr:primaryType="nt:unstructured"
jcr:title="Process"
sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns"/>
<mycommon
jcr:primaryType="nt:unstructured"
jcr:title="Common"
sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns">
<items jcr:primaryType="nt:unstructured">
<columns
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/container">
<items jcr:primaryType="nt:unstructured">
<title
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/textfield"
fieldLabel="Title"
name="./jcr:title"/>
<description
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/textarea"
fieldLabel="Description"
name="./jcr:description"/>
</items>
</columns>
</items>
</mycommon>
<advanced
jcr:primaryType="nt:unstructured"
jcr:title="Advanced"
sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns">
<items jcr:primaryType="nt:unstructured">
<columns
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/container">
<items jcr:primaryType="nt:unstructured">
<email
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/checkbox"
fieldDescription="Notify user via email."
fieldLabel="Email"
name="./metaData/PROCESS_AUTO_ADVANCE"
text="Notify user via email."
value="true"/>
</items>
</columns>
</items>
</advanced>
</items>
</content>
</jcr:root>
Lägg märke till de gemensamma noderna och processnoderna i dialogdefinitionen. Dessa ärvs från det processteg som vi använde som supertyp för vårt anpassade steg:
sling:resourceSuperType : cq/workflow/components/model/process
Klassiska dialogrutor för modellredigering i användargränssnittet fungerar fortfarande med den pekaktiverade standardredigeraren.
Men AEM har moderniseringsverktyg om du vill uppgradera dina klassiska dialogrutor för gränssnittssteg till standarddialogrutor. Efter konverteringen finns det fortfarande några manuella förbättringar som kan göras i dialogrutan för vissa fall.
Om en uppgraderad dialogruta är tom kan du titta i dialogrutor i /libs
som har liknande funktionalitet som exempel på hur en lösning kan tillhandahållas. Till exempel:
/libs/cq/workflow/components/model
/libs/cq/workflow/components/workflow
/libs/dam/components
/libs/wcm/workflow/components/autoassign
/libs/cq/projects
Du får inte ändra något i /libs
, använd dem bara som exempel. Om du vill utnyttja något av de befintliga stegen kopierar du dem till /apps
och ändra dem där.