AEM 6.4 heeft het einde van de uitgebreide ondersteuning bereikt en deze documentatie wordt niet meer bijgewerkt. Raadpleeg voor meer informatie onze technische ondersteuningsperioden. Ondersteunde versies zoeken hier.
Dit onderwerp beschrijft hoe te om de componenten van de douanestap voor uw werkschema's te ontwikkelen, toen hoe te programmatically met werkschema's in wisselwerking te staan.
Het maken van een aangepaste workflowstap omvat de volgende activiteiten:
U kunt ook communiceren met uw workflows vanuit uw programma's en scripts.
Een workflowcomponent definieert de vormgeving en het gedrag van de stap bij het maken van workflowmodellen:
Zoals met alle componenten, workflowstapcomponenten overerven van de component die is opgegeven voor de component sling:resourceSuperType
eigenschap. Het volgende diagram toont de hiërarchie van cq:component
knooppunten die de basis vormen van alle workflowstapcomponenten. Het diagram bevat ook de Processtap, Stap deelnemer, en Stap dynamische deelnemer componenten, aangezien dit de gemeenschappelijkste (en fundamentele) uitgangspunt voor het ontwikkelen van de componenten van de douanestappen zijn.
U moet niets wijzigen in de /libs
pad.
Dit komt omdat de inhoud van /libs
wordt de volgende keer overschreven wanneer u een upgrade uitvoert van uw exemplaar (en kan worden overschreven wanneer u een hotfix- of functiepakket toepast).
De aanbevolen methode voor configuratie en andere wijzigingen is:
/libs
krachtens /apps
/apps
De /libs/cq/workflow/components/model/step
component is de dichtstbijzijnde gangbare voorouder van de Processtap, Stap deelnemer, en Stap dynamische deelnemer, die alle de volgende items overerven:
step.jsp
De step.jsp
wordt de titel van de step-component weergegeven wanneer deze aan een model wordt toegevoegd.
Een dialoogvenster met de volgende tabbladen:
Wanneer de tabbladen van het dialoogvenster Bewerken van een stapcomponent niet overeenkomen met deze standaardweergave, heeft de stapcomponent scripts, knoopeigenschappen of dialoogtabbladen gedefinieerd die deze overgeërfde tabbladen overschrijven.
De volgende objecten zijn beschikbaar (afhankelijk van het type stap) in ECMA-scripts:
WorkItem workItem
WorkflowSession workflowSession
WorkflowData workflowData
args
: array met de procesargumenten.
sling
: toegang tot andere osgi - diensten.
jcrSession
U kunt metagegevens over workflows gebruiken om de informatie die tijdens de levensduur van de workflow vereist is, voort te zetten. Een algemene vereiste voor workflowstappen is dat gegevens voor toekomstig gebruik in de workflow moeten worden behouden of dat de blijvend opgeslagen gegevens moeten worden opgehaald.
Er zijn drie typen objecten MetaDataMap - voor Workflow
, WorkflowData
en WorkItem
objecten. Ze hebben allemaal hetzelfde doel: metagegevens opslaan.
Een WorkItem heeft zijn eigen MetaDataMap die slechts kan worden gebruikt terwijl dat werkpunt (b.v. stap) loopt.
Beide Workflow
en WorkflowData
metadatamaps worden over de gehele werkstroom gedeeld. In deze gevallen wordt het aanbevolen alleen de WorkflowData
metagegevensoverzicht.
Workflowstapcomponenten kunnen gemaakt op dezelfde manier als een andere component.
Om van één van de (bestaande) componenten van de basisstap over te erven, voeg het volgende bezit aan toe cq:Component
knooppunt:
Naam: sling:resourceSuperType
Type: String
Waarde: Een van de volgende paden die wordt omgezet in een basiscomponent:
cq/workflow/components/model/process
cq/workflow/components/model/participant
cq/workflow/components/model/dynamic_participant
Gebruik de volgende procedure om standaardwaarden op te geven voor de Titel en Beschrijving velden op de Vaak tab.
De veldwaarden worden weergegeven op de stapinstantie wanneer aan beide volgende voorwaarden wordt voldaan:
In het dialoogvenster Bewerken van de stap worden de titel en beschrijving opgeslagen op de volgende locaties: >
./jcr:title
./jcr:description
locaties
Aan deze vereiste wordt voldaan wanneer in het dialoogvenster Bewerken het tabblad Algemeen wordt gebruikt dat /libs/cq/flow/components/step/step
component implementeert.
De step-component of een voorouder van de component overschrijft de component niet step.jsp
die de /libs/cq/flow/components/step/step
component implementeert.
Onder de cq:Component
knooppunt, voeg het volgende knooppunt toe:
cq:editConfig
cq:EditConfig
Voor meer informatie over de knoop cq:editConfig, zie Het bewerkingsgedrag van een component configureren.
Onder de cq:EditConfig
knooppunt, voeg het volgende knooppunt toe:
cq:formParameters
nt:unstructured
Toevoegen String
eigenschappen van de volgende namen voor de cq:formParameters
knooppunt:
jcr:title
: De waarde vult de Titel van het Vaak tab.jcr:description
: De waarde vult de Beschrijving van het Vaak tab.Zie Gegevens behouden en openen. Zie met name voor informatie over het benaderen van de eigenschapswaarde tijdens runtime Dialoogvenstereigenschapswaarden openen bij uitvoering.
De eigenschap name van cq:Widget
Hiermee wordt het JCR-knooppunt opgegeven dat de waarde van de widget opslaat. Wanneer widgets in het dialoogvenster met workflowstapcomponenten waarden opslaan onder de ./metaData
node, de waarde wordt toegevoegd aan de workflow MetaDataMap
.
Een tekstveld in een dialoogvenster is bijvoorbeeld een cq:Widget
knooppunt met de volgende eigenschappen:
Naam | Type | Waarde |
---|---|---|
xtype |
String |
textarea |
name |
String |
./metaData/subject |
fieldLabel |
String |
Email Subject |
De waarde die in dit tekstveld wordt opgegeven, wordt toegevoegd aan de instantie van de werkstroom [MetaDataMap](#metadatamaps)
en is gekoppeld aan de subject
toets.
Wanneer de toets PROCESS_ARGS
, is de waarde gemakkelijk beschikbaar in ECMA manuscriptimplementaties via args
variabele. In dit geval is de waarde van de eigenschap name ./metaData/PROCESS_ARGS.
Elke component van de basisstap laat de ontwikkelaars van het werkschemamodel toe om de volgende zeer belangrijke eigenschappen in ontwerptijd te vormen:
Om de component voor gebruik in een specifiek werkschemascenario te concentreren, vorm de belangrijkste eigenschap in het ontwerp en verwijder de capaciteit voor modelontwikkelaars om het te veranderen.
Voeg onder het cq:component-knooppunt het volgende knooppunt toe:
cq:editConfig
cq:EditConfig
Voor meer informatie over de knoop cq:editConfig, zie Het bewerkingsgedrag van een component configureren.
Voeg onder het knooppunt cq:EditConfig het volgende knooppunt toe:
cq:formParameters
nt:unstructured
Voeg een String
aan de cq:formParameters
knooppunt. Het supertype van de component bepaalt de naam van het bezit:
PROCESS
PARTICIPANT
DYNAMIC_PARTICIPANT
Geef de waarde van de eigenschap op:
PROCESS
: Het pad naar het ECMA-script of de PID van de service die het stapgedrag implementeert.PARTICIPANT
: De id van de gebruiker aan wie het werkitem is toegewezen.DYNAMIC_PARTICIPANT
: Het pad naar het ECMA-script of de PID van de service die de gebruiker selecteert om het werkitem toe te wijzen.Om de capaciteit van modelontwikkelaars te verwijderen om uw bezitswaarden te veranderen, vervang de dialoog van het componentensupertype.
Pas uw component van de deelnemersstap aan om eigenschappen te verstrekken die in worden gevonden Stap voor deelnemer aan formulier en Stap deelnemer van dialoogvenster componenten:
Voer de volgende procedure op uw nieuwe component uit (zie Aangepaste workflowonderdelen maken):
Onder de cq:Component
knooppunt, voeg het volgende knooppunt toe:
cq:editConfig
cq:EditConfig
Voor meer informatie over de knoop cq:editConfig, zie Het bewerkingsgedrag van een component configureren.
Voeg onder het knooppunt cq:EditConfig het volgende knooppunt toe:
cq:formParameters
nt:unstructured
Als u een formulier wilt presenteren terwijl de gebruiker het werkitem opent, voegt u de volgende eigenschap toe aan de cq:formParameters
knooppunt:
FORM_PATH
String
Als u een aangepast dialoogvenster wilt weergeven wanneer de gebruiker het werkitem heeft voltooid, voegt u de volgende eigenschap toe aan de cq:formParameters
node
DIALOG_PATH
String
Onder de cq:Component
knooppunt, toevoegen cq:EditConfig
knooppunt. Hieronder wordt een nt:unstructured
node (moet een naam hebben cq:formParameters
) en aan dat knooppunt de volgende eigenschappen toevoegen:
Naam: PROCESS_AUTO_ADVANCE
Type: Boolean
Waarde:
true
de workflow wordt in die stap uitgevoerd en vervolg - dit is standaard en ook aanbevolenfalse
, de workflow zal worden uitgevoerd en stopgezet; hiervoor is extra verwerking nodig, dus true
wordt aanbevolenNaam: DO_NOTIFY
Boolean
U kunt werkschemagegevens gebruiken om informatie voort te zetten die tijdens het leven van het werkschema - en tussen stappen wordt vereist. Een algemene vereiste voor workflowstappen is dat gegevens voor toekomstig gebruik behouden blijven of dat de blijvend gegevens uit eerdere stappen worden opgehaald.
De metagegevens van de workflow worden opgeslagen in een MetaDataMap
object. De Java API biedt de Workflow.getWorkflowData
methode om een WorkflowData
object dat het juiste MetaDataMap
object. Dit WorkflowData
MetaDataMap
-object beschikbaar is voor de OSGi-service of het ECMA-script van een step-component.
De methode voor het uitvoeren van de opdracht WorkflowProcess
de uitvoering wordt goedgekeurd WorkItem
object. Gebruik dit object om de WorkflowData
object voor de huidige werkstroominstantie. In het volgende voorbeeld wordt een item aan de workflow toegevoegd MetaDataMap
object en logt elk item vervolgens in. Het item ("mijnsleutel", "Mijn stapwaarde") is beschikbaar voor volgende stappen in de workflow.
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());
}
}
De graniteWorkItem
variable is the ECMA script representation of the current WorkItem
Java-object. Daarom kunt u graniteWorkItem
variabele voor het verkrijgen van de metagegevens van de workflow. Het volgende ECMA-script kan worden gebruikt om een Processtap om een item aan de workflow toe te voegen MetaDataMap
en registreer elk item vervolgens. Deze items zijn vervolgens beschikbaar voor volgende stappen in de workflow.
De metaData
De variabele die onmiddellijk beschikbaar voor het step manuscript is de meta-gegevens van de stap. De metagegevens van de stap verschillen van de metagegevens van de workflow.
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));
}
De MetaDataMap
Het object met workflowinstanties is handig voor het opslaan en ophalen van gegevens gedurende de gehele levensduur van de workflow. Voor de implementatie van workflowcomponenten, MetaDataMap
is vooral nuttig om componentenbezitswaarden bij runtime terug te winnen.
Voor informatie over het configureren van het dialoogvenster met componenten om eigenschappen op te slaan als metagegevens over workflows raadpleegt u Eigenschapwaarden opslaan in werkstroommetagegevens.
De workflow MetaDataMap
is beschikbaar voor Java- en ECMA-scriptprocesimplementaties:
In Java-implementaties van de WorkflowProcess-interface args
parameter is MetaDataMap
object voor de workflow.
In ECMA manuscriptimplementaties, is de waarde beschikbaar gebruikend args
en metadata
variabelen.
Het dialoogvenster Bewerken van het dialoogvenster Processtap bevat de Argumenten eigenschap. De waarde van de Argumenten eigenschap wordt opgeslagen in de metagegevens van de workflow en is gekoppeld aan de eigenschap PROCESS_ARGS
toets.
In het volgende diagram wordt de waarde van de Argumenten eigenschap is argument1, argument2
:
De volgende Java-code is de execute
methode voor een WorkflowProcess
uitvoering. De methode registreert de waarde in de args
MetaDataMap
die verband houdt met de PROCESS_ARGS
toets.
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());
}
}
Wanneer een processtap wordt uitgevoerd die deze Java-implementatie gebruikt, bevat het logbestand de volgende vermelding:
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
Het volgende ECMA-script wordt gebruikt als het proces voor het Processtap. Het registreert het aantal argumenten en de argumentwaarden:
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"));
In deze sectie wordt beschreven hoe u met argumenten voor processtappen werkt. De informatie is ook van toepassing op dynamische deelnemerselecties.
Zie Voorbeeld voor een ander voorbeeld van het opslaan van componenteigenschappen in workflowmetagegevens: Creeer een Stap van het Werkschema van de Logger. In dit voorbeeld wordt een dialoogvenster weergegeven waarin de metagegevenswaarde wordt gekoppeld aan een andere sleutel dan PROCESS_ARGS.
Binnen een script voor een Processtap component, argumenten zijn beschikbaar via args
object.
Wanneer u een component met een aangepaste stap maakt, metaData
is beschikbaar in een script. Dit object is beperkt tot één tekenreeksargument.
Wanneer de processtappen tijdens het proces van een werkschema zijn begonnen, verzenden de stappen een verzoek naar een dienst OSGi of voeren een manuscript ECMA uit. Ontwikkel de dienst of het manuscript ECMA dat de acties uitvoert die uw werkschema vereist.
Voor informatie over het associëren van uw component van de Stap van het Proces met de dienst of het manuscript, zie Processtap of De stapimplementatie overschrijven.
Een processtap definiëren als een OSGI-servicecomponent (Java-bundel):
Maak de bundel en plaats deze in de OSGI-container. Raadpleeg de documentatie over het maken van een bundel met CRXDE Lite of Eclipse.
De SDAB-component moet de WorkflowProcess
interface met zijn execute()
methode. Zie de voorbeeldcode hieronder.
De pakketnaam moet aan de <*Private-Package*>
van de maven-bundle-plugin
configuratie.
Voeg het SCR bezit toe process.label
en stelt de waarde in die u nodig hebt. Dit zal de naam zijn die uw processtap zoals wanneer het gebruiken van generische wordt vermeld Processtap component. Zie het onderstaande voorbeeld.
In de Modellen de redacteur, voegt de processtap aan het werkschema toe gebruikend generisch Processtap component.
In het dialoogvenster Bewerken (van het dialoogvenster Processtap), ga naar de Proces en selecteert u de procesimplementatie.
Als u argumenten in uw code gebruikt, stelt u de Procesargumenten. Bijvoorbeeld: false.
Sla de wijzigingen op voor zowel de stap als het workflowmodel (linksboven in de modeleditor).
De methoden java, respectievelijk de klassen die de uitvoerbare Java-methode implementeren, worden geregistreerd als OSGI-services, waarmee u tijdens runtime op elk moment methoden kunt toevoegen.
De volgende component OSGI voegt de eigenschap toe approved
naar het knooppunt met pagina-inhoud wanneer de laadbewerking een pagina is:
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");
}
}
Als het proces drie keer in een rij mislukt, wordt een item in het Postvak In van de workflowbeheerder geplaatst.
Met ECMA-scripts kunnen scriptontwikkelaars processtappen implementeren. De scripts bevinden zich in de JCR-opslagplaats en worden daar uitgevoerd.
In de volgende tabel staan de variabelen die direct beschikbaar zijn voor het verwerken van scripts, waarmee toegang wordt verleend tot objecten van de Java API voor de workflow.
Java-klasse | Naam scriptvariabele | Beschrijving |
---|---|---|
com.adobe.granite.workflow.exec.WorkItem |
graniteWorkItem |
De huidige step-instantie. |
com.adobe.granite.workflow.WorkflowSession |
graniteWorkflowSession |
De workflowsessie van de huidige step-instantie. |
String[] (bevat procesargumenten) |
args |
De step-argumenten. |
com.adobe.granite.workflow.metadata.MetaDataMap |
metaData |
De metagegevens van de huidige step-instantie. |
org.apache.sling.scripting.core.impl.InternalScriptHelper |
sling |
Biedt toegang tot de Sling-runtimeomgeving. |
Het volgende voorbeeldscript laat zien hoe u toegang krijgt tot het JCR-knooppunt dat de payload van de workflow vertegenwoordigt. De graniteWorkflowSession
De variabele wordt aangepast aan een JCR-sessievariabele, die wordt gebruikt om het knooppunt op te halen uit het payload-pad.
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();
}
}
Het volgende script controleert of de lading een afbeelding is ( .png
), maakt u er een zwart-witafbeelding van en slaat u deze op als een knooppunt op hetzelfde niveau.
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();
}
}
Het script gebruiken:
Maak het script (bijvoorbeeld met CRXDE Lite) en sla het op in de onderstaande opslagplaats /apps/myapp/workflow/scripts
Een titel opgeven die het script identificeert in het dialoogvenster Processtap bewerken, voegt u de volgende eigenschappen toe aan het dialoogvenster jcr:content
knooppunt van uw script:
Naam | Type | Waarde |
---|---|---|
jcr:mixinTypes |
Name[] |
mix:title |
jcr:title |
String |
De naam die moet worden weergegeven in het dialoogvenster Bewerken. |
Bewerk de Processtap en geeft u het script op dat moet worden gebruikt.
U kunt deelnemerskiezers ontwikkelen voor Stap dynamische deelnemer componenten.
Wanneer een Stap dynamische deelnemer is gestart tijdens een werkstroom, moet de stap bepalen aan welke deelnemer het gegenereerde werkitem kan worden toegewezen. Hiervoor moet u een van de volgende stappen uitvoeren:
U kunt de dienst of een manuscript ontwikkelen ECMA dat de deelnemer volgens de vereisten van uw werkschema selecteert.
Voor informatie over het koppelen van uw Stap dynamische deelnemer component met de dienst of het manuscript, zie Stap dynamische deelnemer of De stapimplementatie overschrijven.
Een deelnemersstap definiëren als een OSGI-servicecomponent (Java-klasse):
De SDAB-component moet de ParticipantStepChooser
interface met zijn getParticipant()
methode. Zie de voorbeeldcode hieronder.
Maak de bundel en plaats deze in de OSGI-container.
Voeg het SCR bezit toe chooser.label
en stelt de waarde naar wens in. Dit is de naam die uw deelnemerkiezer in de lijst krijgt met Stap dynamische deelnemer component. Zie het voorbeeld:
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";
}
}
In de Modellen de redacteur, voegt de dynamische deelnemersstap aan het werkschema toe gebruikend generisch Stap dynamische deelnemer component.
Selecteer in het dialoogvenster Bewerken de optie Deelnemerkiezer en selecteert u de gewenste implementatie.
Als u argumenten in uw code gebruikt, stelt u Procesargumenten. In dit voorbeeld: /content/we-retail/de
.
Sla de wijzigingen op voor zowel de stap als het workflowmodel.
U kunt een manuscript tot stand brengen ECMA dat de gebruiker selecteert die het het werkpunt wordt toegewezen dat Stap deelnemer wordt gegenereerd. Het script moet een functie met de naam getParticipant
dat vereist geen argumenten en retourneert een String
die de id van een gebruiker of groep bevat.
Scripts bevinden zich in de JCR-opslagplaats en worden daar uitgevoerd.
De volgende tabel bevat een lijst met variabelen die directe toegang bieden tot Java-workflowobjecten in uw scripts.
Java-klasse | Naam scriptvariabele |
---|---|
com.adobe.granite.workflow.exec.WorkItem |
graniteWorkItem |
com.adobe.granite.workflow.WorkflowSession |
graniteWorkflowSession |
String[] (bevat procesargumenten) |
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";
}
}
}
Maak het script (bijvoorbeeld met CRXDE Lite) en sla het op in de onderstaande opslagplaats /apps/myapp/workflow/scripts
Een titel opgeven die het script identificeert in het dialoogvenster Processtap bewerken, voegt u de volgende eigenschappen toe aan het dialoogvenster jcr:content
knooppunt van uw script:
Naam | Type | Waarde |
---|---|---|
jcr:mixinTypes |
Name[] |
mix:title |
jcr:title |
String |
De naam die moet worden weergegeven in het dialoogvenster Bewerken. |
Bewerk de Stap dynamische deelnemer en geeft u het script op dat moet worden gebruikt.
Workflowpakketten kan worden doorgegeven aan een workflow voor verwerking. Workflowpakketten bevatten verwijzingen naar bronnen zoals pagina's en elementen.
De volgende stappen in het workflowproces accepteren workflowpakketten voor activering van bulkpagina's:
U kunt workflowstappen ontwikkelen om de pakketbronnen te verkrijgen en deze te verwerken. De volgende leden van de com.day.cq.workflow.collection
bieden toegang tot workflowpakketten:
ResourceCollection
: Workflowpakketklasse.ResourceCollectionUtil
: Gebruik om voorwerpen terug te winnen ResourceCollection.ResourceCollectionManager
: Hiermee maakt en haalt u verzamelingen op. Een implementatie wordt opgesteld als dienst OSGi.In het volgende voorbeeld van de Java-klasse ziet u hoe u pakketbronnen kunt verkrijgen:
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;
}
}
Een gemakkelijke manier om uw eigen douanestap te beginnen te creëren is een bestaande stap van te kopiëren:
/libs/cq/workflow/components/model
Maak het pad opnieuw onder /apps; bijvoorbeeld:
/apps/cq/workflow/components/model
De nieuwe mappen zijn van het type nt:folder
:
- apps
- cq
- workflow (nt:folder)
- components (nt:folder)
- model (nt:folder)
Deze stap is niet van toepassing op de klassieke UI Model redacteur.
Plaats de gekopieerde stap vervolgens in de map /apps; zoals:
/apps/cq/workflow/components/model/myCustomStep
Hier is het resultaat van onze voorbeeld aangepaste stap:
Omdat in standaard UI, slechts de titel en niet de details niet op de kaart worden getoond, details.jsp
is niet nodig zoals het voor de klassieke redacteur UI was.
Pas de volgende eigenschappen toe op het knooppunt:
/apps/cq/workflow/components/model/myCustomStep
Eigenschappen van belang:
sling:resourceSuperType
Moet overerven van een bestaande stap.
In dit voorbeeld overerven we van de basisstap bij cq/workflow/components/model/step
, maar u kunt andere supertypen gebruiken zoals participant
, process
, enz.
jcr:title
Wordt de titel weergegeven wanneer de component in de stapbrowser wordt weergegeven (linkerdeelvenster van de werkstroommodeleditor).
cq:icon
Wordt gebruikt om een Koraal, pictogram voor de stap.
componentGroup
Moet een van de volgende items zijn:
U kunt nu een workflowmodel openen voor bewerking. In de browser met stappen kunt u filteren om te zien Mijn aangepaste stap:
Slepen Mijn aangepaste stap op het model wordt de kaart weergegeven:
Indien niet cq:icon
is gedefinieerd voor de stap, wordt een standaardpictogram weergegeven met de eerste twee letters van de titel. Bijvoorbeeld:
Na De basisstap maken, definieert u de stap Configureren als volgt:
De eigenschappen op het knooppunt configureren cq:editConfig
als volgt:
Eigenschappen van belang:
cq:inherit
Wanneer ingesteld op true
overerft uw component step eigenschappen van de stap die u hebt opgegeven in sling:resourceSuperType
.
cq:disableTargeting
Stel dit naar wens in.
De eigenschappen op het knooppunt configureren cq:formsParameter
als volgt:
Eigenschappen van belang:
jcr:title
Hiermee stelt u de standaardtitel in voor de stapkaart in het modeloverzicht en in het dialoogvenster Titel van het Mijn aangepaste - stapeigenschappen configuratiedialoogvenster.
U kunt ook uw eigen aangepaste eigenschappen definiëren.
De eigenschappen op het knooppunt configureren cq:listeners
.
De cq:listener
de knoop en zijn eigenschappen staan u toe om gebeurtenismanagers te plaatsen die op gebeurtenissen in de aanraking-toegelaten UI modelredacteur reageren; zoals het slepen van een stap naar een modelpagina of het bewerken van stapeigenschappen.
Belangeneigenschappen:
afterMove: REFRESH_PAGE
afterdelete: CQ.workflow.flow.Step.afterDelete
afteredit: CQ.workflow.flow.Step.afterEdit
afterinsert: CQ.workflow.flow.Step.afterInsert
Deze configuratie is essentieel voor het goed functioneren van de redacteur. In de meeste gevallen mag deze configuratie niet worden gewijzigd.
Instellen cq:inherit
naar waar (op cq:editConfig
knoop, zie hierboven) staat u toe om deze configuratie te erven, zonder het in uw stapdefinitie uitdrukkelijk te hoeven omvatten. Als er geen overerving is, moet u dit knooppunt met de volgende eigenschappen en waarden toevoegen.
In dit voorbeeld is de overerving geactiveerd, zodat we de cq:listeners
en de stap functioneren nog steeds correct.
U kunt nu een instantie van uw stap toevoegen aan een workflowmodel. Wanneer u Configureren de stap die u ziet:
Opmaak voor een aangepaste stap wordt weergegeven in het dialoogvenster .content.xml
van het basisknooppunt van de component. Het voorbeeld .content.xml
gebruikt voor dit voorbeeld:
/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"/>
De _cq_editConfig.xml
in dit voorbeeld gebruikt voorbeeld:
<?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>
De _cq_dialog/.content.xml
in dit voorbeeld gebruikt voorbeeld:
<?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>
Let op de algemene knooppunten en procesknooppunten in de dialoogdefinitie. Deze worden geërft van de processtap die wij als supertype voor onze douanestreep hebben gebruikt:
sling:resourceSuperType : cq/workflow/components/model/process
Dialoogvensters van de klassieke UI-modeleditor werken nog steeds met de standaardinterface-editor met aanraakbediening.
AEM heeft moderniseringsinstrumenten als u de dialoogvensters met klassieke UI-stappen wilt bijwerken naar de standaarddialoogvensters voor gebruikersinterface. Na de conversie zijn er nog enkele handmatige verbeteringen die in bepaalde gevallen in de dialoog kunnen worden aangebracht.
Als een bijgewerkt dialoogvenster leeg is, kunt u dialoogvensters bekijken in /libs
die gelijkaardige functionaliteit als voorbeelden van hoe te om een oplossing te verstrekken hebben. Bijvoorbeeld:
/libs/cq/workflow/components/model
/libs/cq/workflow/components/workflow
/libs/dam/components
/libs/wcm/workflow/components/autoassign
/libs/cq/projects
U mag niets wijzigen in /libs
en gebruik ze gewoon als voorbeelden. Als u een van de bestaande stappen wilt gebruiken, kopieert u deze naar /apps
en wijzigen ze daar.