Questo tutorial di sviluppo illustra come sviluppare per AEM Projects. In questo tutorial verrà creato un modello di progetto personalizzato che può essere utilizzato per creare nuovi progetti in AEM per la gestione dei flussi di lavoro e delle attività di authoring dei contenuti.
Questo video offre una breve dimostrazione del flusso di lavoro completato creato nell’esercitazione seguente.
AEM Projects è una funzione dell’AEM progettata per semplificare la gestione e il raggruppamento di tutti i flussi di lavoro e le attività associati alla creazione di contenuti come parte di un’implementazione di AEM Sites o Assets.
Progetti AEM viene fornito con diversi Modelli di progetto preconfigurati. Durante la creazione di un nuovo progetto, gli autori possono scegliere tra questi modelli disponibili. Le implementazioni di grandi dimensioni dell’AEM con requisiti di business univoci richiedono la creazione di modelli di progetto personalizzati, personalizzati in base alle esigenze. Creando un modello di progetto personalizzato, gli sviluppatori possono configurare il dashboard del progetto, connettersi ai flussi di lavoro personalizzati e creare ruoli di business aggiuntivi per un progetto. Daremo un'occhiata alla struttura di un modello di progetto e ne creeremo uno di esempio.
Questo tutorial illustra il codice necessario per creare un modello di progetto personalizzato. È possibile scaricare e installare pacchetto allegato in un ambiente locale da seguire insieme all’esercitazione. Puoi anche accedere all’intero progetto Maven in hosting su GitHub.
Questo tutorial presuppone una conoscenza di base di Pratiche di sviluppo dell'AEM e una certa familiarità con Configurazione del progetto AEM Maven. Tutto il codice menzionato è destinato a essere utilizzato come riferimento e deve essere distribuito solo a un sviluppo locale istanza AEM.
I modelli di progetto devono essere inseriti nel controllo del codice sorgente e trovarsi nella cartella dell’applicazione in /apps. Idealmente dovrebbero essere posizionate in una sottocartella con la convenzione di denominazione di */projects/templates/<my-template>. Utilizzando questa convenzione per i nomi, eventuali nuovi modelli personalizzati diventano automaticamente disponibili per gli autori durante la creazione di un progetto. La configurazione dei modelli di progetto disponibili è impostata su: /content/projects/jcr:content nodo in base al cq:allowedTemplates proprietà. Per impostazione predefinita, questa è un’espressione regolare: /(apps|libs)/.*/projects/templates/.*
Il nodo principale di un modello di progetto avrà jcr:primaryType di cq:Template. Sotto il nodo principale di sono presenti 3 nodi: gadget, ruoli, e workflow. Questi nodi sono tutti nt:unstructured. Sotto il nodo principale può trovarsi anche un file thumbnail.png che viene visualizzato quando si seleziona il modello nella procedura guidata Crea progetto.
Struttura completa dei nodi:
/apps/<my-app>
+ projects (nt:folder)
+ templates (nt:folder)
+ <project-template-root> (cq:Template)
+ gadgets (nt:unstructured)
+ roles (nt:unstructured)
+ workflows (nt:unstructured)
Il nodo principale del modello di progetto è di tipo cq:Template. In questo nodo puoi configurare le proprietà jcr:title e jcr:descrizione visualizzato nella Creazione guidata progetto. Esiste anche una proprietà denominata procedura guidata che punta a un modulo che popolerà le Proprietà del progetto. Il valore predefinito di: /libs/cq/core/content/projects/wizard/steps/defaultproject.html funziona correttamente per la maggior parte dei casi, in quanto consente all’utente di popolare le proprietà di progetto di base e aggiungere membri al gruppo.
*Nota: la Creazione guidata progetto non utilizza il servlet Sling POST. Invece, i valori vengono inviati a un servlet personalizzato:com.adobe.cq.projects.impl.servlet.ProjectServlet. Da tenere in considerazione quando si aggiungono campi personalizzati.
Un esempio di procedura guidata personalizzata è disponibile per il modello di progetto di traduzione: /libs/cq/core/content/projects/wizard/translationproject/defaultproject.
Su questo nodo non sono presenti proprietà aggiuntive, ma i figli del nodo gadget controllano quali tessere di progetto popolano il dashboard del progetto quando viene creato un nuovo progetto. Riquadri progetto (noti anche come gadget o pod) sono schede semplici che popolano l’area di lavoro di un progetto. Un elenco completo delle tessere ootb è disponibile in: /libs/cq/gui/components/projects/admin/pod. I proprietari dei progetti possono sempre aggiungere/rimuovere tessere dopo la creazione di un progetto.
Ci sono 3 Ruoli predefiniti per ogni progetto: Osservatori, Editor, e Proprietari. Aggiungendo nodi secondari sotto il nodo dei ruoli è possibile aggiungere ulteriori ruoli di progetto specifici per l’azienda per il modello. Puoi quindi collegare questi ruoli a flussi di lavoro specifici associati al progetto.
Uno dei motivi più interessanti per la creazione di un modello di progetto personalizzato è la possibilità di configurare i flussi di lavoro disponibili per l'utilizzo con il progetto. che possono generare flussi di lavoro integrati o personalizzati. Sotto workflow nodo deve essere un modelli nodo (anche nt:unstructured
) e nodi secondari sotto specificano i modelli di flusso di lavoro disponibili. La proprietà modelId punta al modello di flusso di lavoro in /etc/workflow e alla proprietà procedura guidata punta alla finestra di dialogo utilizzata all’avvio del flusso di lavoro. Un grande vantaggio di Progetti è la possibilità di aggiungere una finestra di dialogo personalizzata (procedura guidata) per acquisire metadati specifici dell’azienda all’inizio del flusso di lavoro, che possono stimolare ulteriori azioni all’interno del flusso di lavoro.
<projects-template-root> (cq:Template)
+ workflows (nt:unstructured)
+ models (nt:unstructured)
+ <workflow-model> (nt:unstructured)
- modelId = points to the workflow model
- wizard = dialog used to start the workflow
Poiché stiamo principalmente copiando/configurando nodi, utilizzeremo CRXDE Lite. Nell’istanza AEM locale, apri CRXDE Lite.
Per iniziare, crea una nuova cartella sotto /apps/<your-app-folder>
denominato projects
. Crea un’altra cartella sotto a quella denominata templates
.
/apps/aem-guides/projects-tasks/
+ projects (nt:folder)
+ templates (nt:folder)
Per semplificare, verrà avviato il modello personalizzato dal modello di progetto semplice esistente.
/apps/aem-guides/projects-tasks/
+ templates (nt:folder)
+ default (cq:Template)
Ora dovresti avere un percorso come /apps/aem-guides/projects-tasks/projects/templates/authoring-project.
Modifica il jcr:title e jcr:descrizione proprietà del nodo autore-progetto per personalizzare i valori del titolo e della descrizione.
/apps/aem-guides/projects-tasks/projects/
+ templates (nt:folder)
+ authoring-project (cq:Template)
- jcr:title = "Authoring Project"
- jcr:description = "A project to manage approval and publish process for AEM Sites or Assets"
- wizard = "/libs/cq/core/content/projects/wizard/steps/defaultproject.html"
Per questo modello di progetto vogliamo utilizzare le Attività.
Ora il Riquadro Attività viene visualizzato per impostazione predefinita quando viene creato un nuovo progetto.
../projects/templates/authoring-project
+ gadgets (nt:unstructured)
+ team (nt:unstructured)
+ asset (nt:unstructured)
+ work (nt:unstructured)
+ experiences (nt:unstructured)
+ projectinfo (nt:unstructured)
..
+ tasks (nt:unstructured)
- cardWeight = "100"
- jcr:title = "Tasks"
- sling:resourceType = "cq/gui/components/projects/admin/pod/taskpod"
Al modello di progetto verrà aggiunto un Ruolo Approvatore personalizzato.
../projects/templates/authoring-project
+ gadgets (nt:unstructured)
+ roles (nt:unstructured)
+ approvers (nt:unstructured)
- jcr:title = "Approvers"
- roleclass = "owner"
- roleid = "approver"
Copiando il modello di progetto semplice si otterranno 4 flussi di lavoro integrati configurati. Ogni nodo sotto i flussi di lavoro/modelli punta a un flusso di lavoro specifico e a una procedura guidata di dialogo iniziale per tale flusso di lavoro. Più avanti in questo tutorial verrà creato un flusso di lavoro personalizzato per questo progetto. Per ora elimina i nodi sotto il flusso di lavoro/modelli:
../projects/templates/authoring-project
+ gadgets (nt:unstructured)
+ roles (nt:unstructured)
+ workflows (nt:unstructured)
+ models (nt:unstructured)
- (remove ootb models)
Per facilitare agli autori di contenuti l’identificazione del modello di progetto, puoi aggiungere una miniatura personalizzata. La dimensione consigliata è di 319x319 pixel.
jcr:content
e fare doppio clic sul pulsante jcr:data
(evitare di fare clic su 'visualizza').
jcr:data
e puoi caricare una miniatura personalizzata.../projects/templates/authoring-project
+ gadgets (nt:unstructured)
+ roles (nt:unstructured)
+ workflows (nt:unstructured)
+ thumbnail.png (nt:file)
Rappresentazione XML completata del modello di progetto:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:description="A project to manage approval and publish process for AEM Sites or Assets"
jcr:primaryType="cq:Template"
jcr:title="Authoring Project"
ranking="{Long}1"
wizard="/libs/cq/core/content/projects/wizard/steps/defaultproject.html">
<jcr:content
jcr:primaryType="nt:unstructured"
detailsHref="/projects/details.html"/>
<gadgets jcr:primaryType="nt:unstructured">
<team
jcr:primaryType="nt:unstructured"
jcr:title="Team"
sling:resourceType="cq/gui/components/projects/admin/pod/teampod"
cardWeight="60"/>
<tasks
jcr:primaryType="nt:unstructured"
jcr:title="Tasks"
sling:resourceType="cq/gui/components/projects/admin/pod/taskpod"
cardWeight="100"/>
<work
jcr:primaryType="nt:unstructured"
jcr:title="Workflows"
sling:resourceType="cq/gui/components/projects/admin/pod/workpod"
cardWeight="80"/>
<experiences
jcr:primaryType="nt:unstructured"
jcr:title="Experiences"
sling:resourceType="cq/gui/components/projects/admin/pod/channelpod"
cardWeight="90"/>
<projectinfo
jcr:primaryType="nt:unstructured"
jcr:title="Project Info"
sling:resourceType="cq/gui/components/projects/admin/pod/projectinfopod"
cardWeight="100"/>
</gadgets>
<roles jcr:primaryType="nt:unstructured">
<approvers
jcr:primaryType="nt:unstructured"
jcr:title="Approvers"
roleclass="owner"
roleid="approvers"/>
</roles>
<workflows
jcr:primaryType="nt:unstructured"
tags="[]">
<models jcr:primaryType="nt:unstructured">
</models>
</workflows>
</jcr:root>
Ora possiamo testare il nostro modello di progetto creando un nuovo progetto.
Il modello personalizzato dovrebbe essere visualizzato come una delle opzioni per la creazione del progetto.
Dopo aver selezionato il modello personalizzato, fai clic su "Successivo" e osserva che quando popolerai i membri del progetto puoi aggiungerli come ruolo di Approvatore.
Fai clic su Crea per completare la creazione del progetto basato sul modello personalizzato. Noterai nella dashboard del progetto che la sezione Attività e le altre tessere configurate in gadget vengono visualizzate automaticamente.
In genere, i flussi di lavoro AEM incentrati su un processo di approvazione utilizzano i passaggi del flusso di lavoro Partecipante. La Casella in entrata AEM include informazioni dettagliate su Attività e Flusso di lavoro e su una migliore integrazione con i progetti AEM. Queste funzioni rendono più interessante l'utilizzo delle fasi del processo di creazione dei progetti.
L’utilizzo di un passaggio di creazione attività rispetto ai passaggi partecipanti tradizionali offre un paio di vantaggi:
Analogamente ai passaggi Partecipante, le attività possono essere assegnate e instradate in modo dinamico. I metadati delle attività come Titolo, Priorità possono anche essere impostati in modo dinamico in base alle azioni precedenti, come vedremo con la seguente esercitazione.
Anche se le attività hanno alcuni vantaggi rispetto ai passaggi dei partecipanti, hanno un sovraccarico aggiuntivo e non sono così utili al di fuori di un progetto. Inoltre, tutti i comportamenti dinamici delle attività devono essere codificati utilizzando script ecma con proprie limitazioni.
Il diagramma precedente illustra i requisiti di alto livello per il flusso di lavoro di approvazione del nostro esempio.
Il primo passaggio consiste nel creare un'attività per completare la modifica di un contenuto. L’iniziatore del flusso di lavoro potrà scegliere l’assegnatario di questa prima attività.
Una volta completata la prima attività, l’assegnatario disporrà di tre opzioni per l’instradamento del flusso di lavoro:
Normale : il ciclo normale crea un'attività assegnata al gruppo Approvatore del progetto da esaminare e approvare. La priorità dell'attività è Normale e la data di scadenza è 5 giorni dalla data di creazione.
Affrettati - L'instradamento rapido crea anche un'attività assegnata al gruppo Approvatore del progetto. La priorità dell'attività è Alta e la data di scadenza è solo 1 giorno.
Ignora - in questo flusso di lavoro di esempio il partecipante iniziale ha la possibilità di ignorare il gruppo di approvazione. (sì, questo potrebbe vanificare lo scopo di un flusso di lavoro di approvazione, ma ci permette di illustrare ulteriori funzionalità di indirizzamento)
Il gruppo di approvatori può approvare il contenuto o inviarlo nuovamente all'assegnatario iniziale per la rilavorazione. Se viene rimandata per la rielaborazione, viene creata una nuova attività con l’etichetta appropriata "Rinviata per la rielaborazione".
L’ultimo passaggio del flusso di lavoro utilizza il passaggio del processo di attivazione pagina/risorsa e replica il payload.
Dal menu Start di AEM, vai a Strumenti -> Flusso di lavoro -> Modelli. Fai clic su Crea nell’angolo in alto a destra per creare un nuovo modello di flusso di lavoro.
Assegna al nuovo modello un titolo: "Flusso di lavoro di approvazione del contenuto" e un nome URL: "content-approval-workflow".
Per ulteriori informazioni relative a creazione di flussi di lavoro leggi qui.
Come best practice, i flussi di lavoro personalizzati devono essere raggruppati in una cartella separata sotto /etc/workflow/models. In CRXDE Lite crea un nuovo 'nt:folder' sotto /etc/workflow/models denominato "aem-guides". L’aggiunta di una sottocartella assicura che i flussi di lavoro personalizzati non vengano accidentalmente sovrascritti durante gli aggiornamenti o le installazioni di Service Pack.
*Tieni presente che è importante non posizionare mai la cartella o i flussi di lavoro personalizzati sotto le sottocartelle ootb come /etc/workflow/models/dam o /etc/workflow/models/projects, in quanto anche l’intera sottocartella potrebbe essere sovrascritta da aggiornamenti o service pack.
Posizione del modello di flusso di lavoro in 6.3
Se utilizzi AEM 6.4+ la posizione del flusso di lavoro è cambiata. Consulta qui per ulteriori dettagli.
Se utilizzi AEM 6.4+, il modello di flusso di lavoro viene creato in /conf/global/settings/workflow/models
. Ripeti i passaggi precedenti con la directory /conf e aggiungi una sottocartella denominata aem-guides
e spostare il content-approval-workflow
sotto di esso.
Posizione del modello di flusso di lavoro in 6.4+
Introdotta in AEM 6.3 è la possibilità di aggiungere Fasi del flusso di lavoro a un determinato flusso di lavoro. Le fasi vengono visualizzate dall'utente nella casella Posta in arrivo della scheda Informazioni flusso di lavoro. Mostrerà all’utente la fase corrente del flusso di lavoro e le fasi precedenti e successive.
Per configurare le fasi, apri la finestra di dialogo Proprietà pagina dalla barra laterale. La quarta scheda è etichettata "Stadi". Aggiungi i seguenti valori per configurare le tre fasi di questo flusso di lavoro:
Configura gli Stadi del Flusso di lavoro dalla finestra di dialogo Proprietà pagina.
Barra di avanzamento del flusso di lavoro visualizzata dalla casella in entrata AEM.
Facoltativamente, puoi caricare un Immagine alle Proprietà pagina utilizzate come miniatura del flusso di lavoro quando viene selezionata dagli utenti. Le dimensioni dell’immagine devono essere di 319x319 pixel. Aggiunta di un Descrizione Le proprietà della pagina vengono visualizzate anche quando un utente va a selezionare il flusso di lavoro.
Il processo di flusso di lavoro Crea attività progetto è progettato per creare un’attività come passaggio nel flusso di lavoro. Solo dopo aver completato l’attività il flusso di lavoro proseguirà. Un aspetto importante del passaggio Crea attività progetto è che può leggere i valori dei metadati del flusso di lavoro e utilizzarli per creare l’attività in modo dinamico.
Elimina innanzitutto il Passaggio partecipante creato per impostazione predefinita. Dalla barra laterale nel menu dei componenti, espandi la sezione "Progetti" sottotitolo e trascina i tasti "Crea attività progetto" sul modello.
Fai doppio clic sul passaggio "Crea attività progetto" per aprire la finestra di dialogo del flusso di lavoro. Configura le seguenti proprietà:
Questa scheda è comune a tutti i passaggi del processo del flusso di lavoro e verranno impostati Titolo e Descrizione (non visibili all’utente finale). La proprietà importante che verrà impostata è Workflow Stage (Fase del flusso di lavoro) "Modifica contenuto" dal menu a discesa.
Common Tab
-----------------
Title = "Start Task Creation"
Description = "This the first task in the Workflow"
Workflow Stage = "Edit Content"
Il processo di flusso di lavoro Crea attività progetto è progettato per creare un’attività come passaggio nel flusso di lavoro. La scheda Attività consente di impostare tutti i valori dell'attività. Nel nostro caso, vogliamo che l’assegnatario sia dinamico, quindi lasceremo il campo vuoto. I restanti valori della proprietà:
Task Tab
-----------------
Name* = "Edit Content"
Task Priority = "Medium"
Description = "Edit the content and finalize for approval. Once finished submit for approval."
Due In - Days = "2"
La scheda di instradamento è una finestra di dialogo facoltativa che può specificare le azioni disponibili per l'utente che completa l'operazione. Queste azioni sono solo valori stringa e vengono salvate nei metadati del flusso di lavoro. Questi valori possono essere letti da script e/o passaggi di processo più avanti nel flusso di lavoro per "indirizzare" dinamicamente il flusso di lavoro. In base al obiettivi del flusso di lavoro a questa scheda verranno aggiunte tre azioni:
Routing Tab
-----------------
Actions =
"Normal Approval"
"Rush Approval"
"Bypass Approval"
Questa scheda consente di configurare uno script pre-creazione attività in cui è possibile decidere in modo programmatico vari valori dell'attività prima che venga creata. Abbiamo la possibilità di puntare lo script a un file esterno o di incorporare uno script breve direttamente nella finestra di dialogo. Nel nostro caso, lo script pre-creazione attività verrà indirizzato a un file esterno. Nel passaggio 5 creeremo tale script.
Advanced Settings Tab
-----------------
Pre-Create Task Script = "/apps/aem-guides/projects/scripts/start-task-config.ecma"
Nel passaggio precedente si faceva riferimento a uno script di pre-creazione attività. Ora creeremo quello script in cui imposteremo l’assegnatario dell’attività in base al valore di un valore di metadati del flusso di lavoro "assegnatario". Il "assegnatario" Il valore viene impostato quando il flusso di lavoro viene avviato. Leggeremo anche i metadati del flusso di lavoro per scegliere dinamicamente la priorità dell’attività leggendo il file "taskPriority" valore dei metadati del flusso di lavoro e "taskDueDate" da impostare in modo dinamico alla scadenza della prima attività.
Per motivi organizzativi, abbiamo creato una cartella sotto la cartella dell’app contenente tutti gli script relativi al progetto: /apps/aem-guides/projects-tasks/projects/scripts. Crea un nuovo file sotto questa cartella denominato "start-task-config.ecma". *Si noti che il percorso del file start-task-config.ecma corrisponde al percorso impostato nella scheda Impostazioni avanzate al passaggio 4.
Aggiungi quanto segue come contenuto del file:
// start-task-config.ecma
// Populate the task using values stored as workflow metadata originally posted by the start workflow wizard
// set the assignee based on start workflow wizard
var assignee = workflowData.getMetaDataMap().get("assignee", Packages.java.lang.String);
task.setCurrentAssignee(assignee);
//Set the due date for the initial task based on start workflow wizard
var dueDate = workflowData.getMetaDataMap().get("taskDueDate", Packages.java.util.Date);
if (dueDate != null) {
task.setProperty("taskDueDate", dueDate);
}
//Set the priority based on start workflow wizard
var taskPriority = workflowData.getMetaDataMap().get("taskPriority", "Medium");
task.setProperty("taskPriority", taskPriority);
Torna al flusso di lavoro di approvazione dei contenuti. Trascina la selezione Suddivisione O componente (che si trova nella barra laterale sotto la categoria "Flusso di lavoro") sotto Avvia attività Passaggio. Nella finestra di dialogo Comune, seleziona il pulsante di opzione per 3 rami. La suddivisione O leggerà il valore dei metadati del flusso di lavoro "lastTaskAction" per determinare il percorso del flusso di lavoro. Il "lastTaskAction" è impostata su uno dei valori della scheda Indirizzamento configurata nel passaggio 4. Per ciascuna scheda Ramo, compila Script area di testo con i seguenti valori:
function check() {
var lastAction = workflowData.getMetaDataMap().get("lastTaskAction","");
if(lastAction == "Normal Approval") {
return true;
}
return false;
}
function check() {
var lastAction = workflowData.getMetaDataMap().get("lastTaskAction","");
if(lastAction == "Rush Approval") {
return true;
}
return false;
}
function check() {
var lastAction = workflowData.getMetaDataMap().get("lastTaskAction","");
if(lastAction == "Bypass Approval") {
return true;
}
return false;
}
*Si noti che viene eseguita una corrispondenza Stringa diretta per determinare la route, pertanto è importante che i valori impostati negli script Branch corrispondano ai valori di Route impostati nel passaggio 4.
Trascina un altro elemento "Crea attività progetto" posiziona il cursore sul modello all’estrema sinistra (Ramo 1) sotto la divisione OR. Compila la finestra di dialogo con le seguenti proprietà:
Common Tab
-----------------
Title = "Approval Task Creation"
Description = "Create a an approval task for Project Approvers. Priority is Medium."
Workflow Stage = "Approval"
Task Tab
------------
Name* = "Approve Content for Publish"
Task Priority = "Medium"
Description = "Approve this content for publication."
Days = "5"
Routing Tab - Actions
----------------------------
"Approve and Publish"
"Send Back for Revision"
Poiché questo è il percorso di approvazione normale, la priorità dell'attività è impostata su Medio. Inoltre, al gruppo Approvatori vengono concessi 5 giorni per completare l'Attività. L’assegnatario viene lasciato vuoto nella scheda Attività poiché questo viene assegnato in modo dinamico nella scheda Impostazioni avanzate. Al completamento di questa attività, al gruppo approvatori vengono assegnati due percorsi possibili: "Approva e pubblica" se approvano il contenuto e può essere pubblicato e "Invia di nuovo per revisione" in caso di problemi che l’editor originale deve risolvere. L’approvatore può lasciare commenti che l’editor originale visualizzerà se il flusso di lavoro gli viene restituito.
Nelle sezioni precedenti di questo tutorial è stato creato un modello di progetto con un ruolo Approvatori. Ogni volta che viene creato un nuovo progetto da questo modello, viene creato un gruppo specifico per il progetto per il ruolo Approvatori. Proprio come un Passaggio Partecipante, un'attività può essere assegnata solo a un Utente o a un Gruppo. Questa attività deve essere assegnata al gruppo di progetti che corrisponde al gruppo di approvatori. Tutti i flussi di lavoro avviati all’interno di un progetto avranno metadati che mappano i Ruoli del progetto al gruppo specifico del progetto.
Copia e incolla il seguente codice nel Script area di testo della scheda Impostazioni avanzate . Questo codice legge i metadati del flusso di lavoro e assegna l’attività al gruppo Approvatori del progetto. Se non è possibile trovare il valore del gruppo approvatori, verrà eseguito il fallback assegnando l'attività al gruppo Administrators.
var projectApproverGrp = workflowData.getMetaDataMap().get("project.group.approvers","administrators");
task.setCurrentAssignee(projectApproverGrp);
Trascina un altro elemento "Crea attività progetto" posiziona il modello nel ramo centrale (Ramo 2) sotto la divisione OR. Compila la finestra di dialogo con le seguenti proprietà:
Common Tab
-----------------
Title = "Rush Approval Task Creation"
Description = "Create a an approval task for Project Approvers. Priority is High."
Workflow Stage = "Approval"
Task Tab
------------
Name* = "Rush Approve Content for Publish"
Task Priority = "High"
Description = "Rush approve this content for publication."
Days = "1"
Routing Tab - Actions
----------------------------
"Approve and Publish"
"Send Back for Revision"
Poiché questo è il percorso di approvazione rapida, la priorità dell'attività è impostata su Alta. Inoltre, al gruppo Approvatori viene assegnato un solo giorno per completare l'attività. L’assegnatario viene lasciato vuoto nella scheda Attività poiché questo viene assegnato in modo dinamico nella scheda Impostazioni avanzate.
Possiamo riutilizzare lo stesso frammento di script del passaggio 7 per popolare Script area di testo nella scheda Impostazioni avanzate . Copia e incolla il codice seguente:
var projectApproverGrp = workflowData.getMetaDataMap().get("project.group.approvers","administrators");
task.setCurrentAssignee(projectApproverGrp);
Trascina + rilascia un componente nessuna operazione all’estrema destra del ramo (Ramo 3). Il componente Nessuna operazione non esegue alcuna azione e avanza immediatamente, rappresentando il desiderio dell’editor originale di ignorare il passaggio di approvazione. Tecnicamente potremmo lasciare questo ramo senza alcun passaggio del flusso di lavoro, ma come best practice aggiungeremo un passaggio Nessuna operazione. Questo chiarisce agli altri sviluppatori qual è lo scopo del ramo 3.
Fai doppio clic sul passaggio del flusso di lavoro e configura il Titolo e la Descrizione:
Common Tab
-----------------
Title = "Bypass Approval"
Description = "Placeholder step to indicate that the original editor decided to bypass the approver group."
Il modello di flusso di lavoro deve essere simile a questo dopo la configurazione di tutti e tre i rami nella suddivisione O.
Poiché il gruppo Approvatori ha la possibilità di inviare nuovamente il flusso di lavoro all’editor originale per ulteriori revisioni, ci baseremo su Vai a passaggio per leggere l’ultima azione eseguita e instradare il flusso di lavoro all’inizio o lasciarlo continuare.
Trascina il componente Vai al passaggio (che si trova nella barra laterale in Flusso di lavoro) sotto la divisione O dove si unisce di nuovo. Fai doppio clic su e configura le seguenti proprietà nella finestra di dialogo:
Common Tab
----------------
Title = "Goto Step"
Description = "Based on the Approver groups action route the workflow to the beginning or continue and publish the payload."
Process Tab
---------------
The step to go to. = "Start Task Creation"
L’ultimo elemento che configureremo è lo script come parte del passaggio del processo Vai a. Il valore Script può essere incorporato tramite la finestra di dialogo o configurato per puntare a un file esterno. Lo script Vai a deve contenere function check() e restituisce true se il flusso di lavoro deve andare al passaggio specificato. Se si restituiscono risultati falsi, il flusso di lavoro continua.
Se il gruppo di approvatori sceglie "Invia di nuovo per revisione" (configurato nei passaggi 7 e 8), il flusso di lavoro deve essere restituito al "Avvia creazione attività" passaggio.
Nella scheda Processo aggiungere il frammento seguente all'area di testo Script:
function check() {
var lastAction = workflowData.getMetaDataMap().get("lastTaskAction","");
if(lastAction == "Send Back for Revision") {
return true;
}
return false;
}
Per pubblicare il payload utilizzeremo l’ootb Attiva pagina/risorsa Passaggio del processo. Questo passaggio del processo richiede una configurazione ridotta e aggiungerà il payload del flusso di lavoro alla coda di replica per l’attivazione. Il passaggio successivo al passaggio Vai a verrà aggiunto e potrà essere raggiunto solo se il gruppo di approvatori ha approvato il contenuto per la pubblicazione o se l’editor originale ha scelto il percorso Ignora approvazione.
Trascina la selezione Attiva pagina/risorsa Passaggio del processo (disponibile nella barra laterale in Flusso di lavoro WCM) sotto il Passaggio vai a nel modello.
Descrizione dell’aspetto del modello di flusso di lavoro dopo l’aggiunta del passaggio Vai a e il passaggio Attiva pagina/risorsa.
Se il gruppo di approvatori invia nuovamente il contenuto per la revisione, lo comunicheremo all’editor originale. Possiamo farlo modificando dinamicamente le proprietà di creazione dell’Attività. Verrà disattivato il valore della proprietà lastActionTaken di "Invia di nuovo per revisione". Se tale valore è presente, verranno modificati il titolo e la descrizione per indicare che questa attività è il risultato del rinvio del contenuto per la revisione. Aggiorneremo inoltre la priorità a "Alta" in modo che sia il primo elemento su cui lavora l’editor. Infine, verrà impostata una data di scadenza dell’attività a un giorno dal momento in cui il flusso di lavoro è stato rimandato per la revisione.
Sostituisci l’inizio start-task-config.ecma
script (creato nel passaggio 5) con quanto segue:
// start-task-config.ecma
// Populate the task using values stored as workflow metadata originally posted by the start workflow wizard
// set the assignee based on start workflow wizard
var assignee = workflowData.getMetaDataMap().get("assignee", Packages.java.lang.String);
task.setCurrentAssignee(assignee);
//Set the due date for the initial task based on start workflow wizard
var dueDate = workflowData.getMetaDataMap().get("taskDueDate", Packages.java.util.Date);
if (dueDate != null) {
task.setProperty("taskDueDate", dueDate);
}
//Set the priority based on start workflow wizard
var taskPriority = workflowData.getMetaDataMap().get("taskPriority", "Medium");
task.setProperty("taskPriority", taskPriority);
var lastAction = workflowData.getMetaDataMap().get("lastTaskAction","");
//change the title and priority if the approver group sent back the content
if(lastAction == "Send Back for Revision") {
var taskName = "Review and Revise Content";
//since the content was rejected we will set the priority to High for the revison task
task.setProperty("taskPriority", "High");
//set the Task name (displayed as the task title in the Inbox)
task.setProperty("name", taskName);
task.setProperty("nameHierarchy", taskName);
//set the due date of this task 1 day from current date
var calDueDate = Packages.java.util.Calendar.getInstance();
calDueDate.add(Packages.java.util.Calendar.DATE, 1);
task.setProperty("taskDueDate", calDueDate.getTime());
}
Quando si avvia un flusso di lavoro da un progetto, è necessario specificare una procedura guidata per avviare il flusso di lavoro. Procedura guidata predefinita: /libs/cq/core/content/projects/workflowwizards/default_workflow
consente all’utente di immettere un Titolo flusso di lavoro, un commento di inizio e un percorso di payload per il flusso di lavoro da eseguire. Ci sono anche diversi altri esempi trovati in: /libs/cq/core/content/projects/workflowwizards
.
La creazione di una procedura guidata personalizzata può essere molto utile in quanto consente di raccogliere informazioni critiche prima dell’avvio del flusso di lavoro. I dati vengono memorizzati come parte dei metadati del flusso di lavoro e i processi del flusso di lavoro possono leggerli e cambiare dinamicamente il comportamento in base ai valori immessi. Verrà creata una procedura guidata personalizzata per assegnare dinamicamente la prima attività nel flusso di lavoro in base a un valore della procedura guidata iniziale.
In CRXDE-Lite creeremo una sottocartella sotto a /apps/aem-guides/projects-tasks/projects
cartella denominata "procedure guidate". Copia la procedura guidata predefinita da: /libs/cq/core/content/projects/workflowwizards/default_workflow
sotto la cartella delle procedure guidate appena creata e rinominala in content-approval-start. Ora il percorso completo dovrebbe essere: /apps/aem-guides/projects-tasks/projects/wizards/content-approval-start
.
La procedura guidata predefinita è una procedura guidata a due colonne la cui prima colonna mostra Titolo, Descrizione e Miniatura del modello di flusso di lavoro selezionato. La seconda colonna include campi per Titolo flusso di lavoro, Commento iniziale e Percorso payload. La procedura guidata è un modulo interfaccia utente touch standard e utilizza Componenti modulo interfaccia utente Granite per compilare i campi.
Verrà aggiunto un campo aggiuntivo alla procedura guidata utilizzato per impostare l’assegnatario della prima attività nel flusso di lavoro (vedi Creare il modello di flusso di lavoro: passaggio 5).
Sotto ../content-approval-start/jcr:content/items/column2/items
crea un nuovo nodo di tipo nt:unstructured
denominato "assegna". Verrà utilizzato il componente Selettore utente Progetti (basato su Componente Selettore utente Granite). Questo campo modulo consente di limitare facilmente la selezione di utenti e gruppi solo a quelli appartenenti al progetto corrente.
Di seguito è riportata la rappresentazione XML del assegna nodo:
<assign
granite:class="js-cq-project-user-picker"
jcr:primaryType="nt:unstructured"
sling:resourceType="cq/gui/components/projects/admin/userpicker"
fieldLabel="Assign To"
hideServiceUsers="{Boolean}true"
impersonatesOnly="{Boolean}true"
showOnlyProjectMembers="{Boolean}true"
name="assignee"
projectPath="${param.project}"
required="{Boolean}true"/>
Verrà inoltre aggiunto un campo di selezione della priorità che determinerà la priorità della prima attività nel flusso di lavoro (vedere Creare il modello di flusso di lavoro: passaggio 5).
Sotto /content-approval-start/jcr:content/items/column2/items
crea un nuovo nodo di tipo nt:unstructured
denominato priorità. Utilizzeremo Componente Seleziona interfaccia utente Granite per compilare il campo modulo.
Sotto priorità verrà aggiunto un nodo elementi nodo di nt:unstructured. Sotto elementi nodo aggiungi altri 3 nodi per popolare le opzioni di selezione Alta, Media e Bassa. Ogni nodo è di tipo nt:unstructured e deve avere text e valore proprietà. Sia il testo che il valore devono avere lo stesso valore:
Per il nodo Medio aggiungi un’ulteriore proprietà booleana denominata "selected" con un valore impostato su true. In questo modo il valore predefinito nel campo di selezione sarà Medio.
Di seguito è riportata una rappresentazione XML della struttura e delle proprietà del nodo:
<priority
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/select"
fieldLabel="Task Priority"
name="taskPriority">
<items jcr:primaryType="nt:unstructured">
<high
jcr:primaryType="nt:unstructured"
text="High"
value="High"/>
<medium
jcr:primaryType="nt:unstructured"
selected="{Boolean}true"
text="Medium"
value="Medium"/>
<low
jcr:primaryType="nt:unstructured"
text="Low"
value="Low"/>
</items>
</priority>
Consentiremo all’iniziatore del flusso di lavoro di impostare la scadenza dell’attività iniziale. Utilizzeremo Selezione data interfaccia utente Granite per acquisire questo input. Verrà inoltre aggiunto un campo nascosto con TypeHint per garantire che l’input venga memorizzato come proprietà di tipo Data nel JCR.
Aggiungi due nt:unstructured nodi con le seguenti proprietà rappresentate in XML:
<duedate
granite:rel="project-duedate"
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/datepicker"
displayedFormat="YYYY-MM-DD HH:mm"
fieldLabel="Due Date"
minDate="today"
name="taskDueDate"
type="datetime"/>
<duedatetypehint
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/form/hidden"
name="taskDueDate@TypeHint"
type="datetime"
value="Calendar"/>
È possibile visualizzare il codice completo della finestra di dialogo di avvio della procedura guidata qui.
L’ultima cosa da fare è assicurarci che il modello di flusso di lavoro sia disponibile per essere avviato dall’interno di uno dei progetti. A tal fine, è necessario rivedere il Modello di progetto creato nella parte 1 di questa serie.
La configurazione del flusso di lavoro è un'area di un modello di progetto che specifica i flussi di lavoro disponibili da utilizzare con quel progetto. La configurazione è anche responsabile della specifica dell’Avvio guidato flusso di lavoro durante l’avvio del flusso di lavoro (creato nel passaggi precedenti). La configurazione del flusso di lavoro di un modello di progetto è "live", il che significa che l’aggiornamento della configurazione del flusso di lavoro avrà effetto sui nuovi progetti creati e sui progetti esistenti che utilizzano il modello.
In CRXDE-Lite passa al modello di progetto di authoring creato in precedenza alle /apps/aem-guides/projects-tasks/projects/templates/authoring-project/workflows/models
.
Sotto il nodo dei modelli aggiungi un nuovo nodo denominato contentapproval con un tipo di nodo nt:unstructured. Aggiungi le seguenti proprietà al nodo:
<contentapproval
jcr:primaryType="nt:unstructured"
modelId="/etc/workflow/models/aem-guides/content-approval-workflow/jcr:content/model"
wizard="/apps/aem-guides/projects-tasks/projects/wizards/content-approval-start.html"
/>
Se utilizzi AEM 6.4, la posizione del flusso di lavoro è cambiata. Puntare il modelId
alla posizione del modello di flusso di lavoro di runtime in /var/workflow/models/aem-guides/content-approval-workflow
Consulta qui per ulteriori dettagli sulla modifica della posizione del flusso di lavoro.
<contentapproval
jcr:primaryType="nt:unstructured"
modelId="/var/workflow/models/aem-guides/content-approval-workflow"
wizard="/apps/aem-guides/projects-tasks/projects/wizards/content-approval-start.html"
/>
Una volta che il flusso di lavoro di approvazione del contenuto è stato aggiunto al modello di progetto, dovrebbe essere disponibile per l’avvio dalla sezione Flusso di lavoro del progetto. Lanciate e giocate con i vari percorsi che abbiamo creato.