Questa pagina consente di estendere le funzionalità di Multi Site Manager:
Questa pagina deve essere letta insieme a:
Multi Site Manager e le relative API vengono utilizzate per la creazione di un sito Web, pertanto sono destinate solo all’utilizzo in un ambiente di authoring.
Multi Site Management è costituito dai pacchetti seguenti:
I principali oggetti API MSM interagiscono come segue (vedere anche Termini utilizzati):
Blueprint
Un Blueprint
(come nella configurazione 🔗blueprint) specifica le pagine da cui una Live Copy può ereditare il contenuto.
L'utilizzo di una configurazione blueprint ( Blueprint
) è facoltativo, ma:
LiveRelationship
Specifica LiveRelationship
la connessione (relazione) tra una risorsa nel ramo Live Copy e la risorsa sorgente/blueprint equivalente.
LiveRelationship
gli oggetti forniscono l'accesso (riferimenti) alle configurazioni di rollout ( RolloutConfig
) LiveCopy
e LiveStatus
agli oggetti correlati alla relazione./content/copy/us
dall'origine/blueprint all'indirizzo /content/we-retail/language-masters
. Le risorse /content/we.retail/language-masters/en/jcr:content
e /content/copy/us/en/jcr:content
formano una relazione.LiveCopy
contiene i dettagli di configurazione per le relazioni ( LiveRelationship
) tra le risorse Live Copy e le relative risorse di origine/blueprint.
LiveCopy
per accedere al percorso della pagina, al percorso della pagina di origine/blueprint, alle configurazioni di rollout e all'eventuale inclusione di pagine figlie nella LiveCopy
.LiveCopy
viene creato ogni volta che si utilizza Crea sito o Crea Live Copy.LiveStatus
forniscono l'accesso allo stato di runtime di un LiveRelationship
. Consente di eseguire una query sullo stato di sincronizzazione di una Live Copy.
LiveAction
è un'azione eseguita su ogni risorsa coinvolta nel rollout.
LiveActionFactory
crea LiveAction
gli oggetti in base a una LiveAction
configurazione. Le configurazioni sono memorizzate come risorse nella directory archivio.
RolloutConfig
contiene un elenco di LiveActions
, da utilizzare quando viene attivato. Il LiveCopy
eredita il RolloutConfig
e il risultato è presente nel LiveRelationship
.
Create azioni di sincronizzazione personalizzate da utilizzare con le configurazioni di rollout. Creare un'azione di sincronizzazione quando le azioni installate non soddisfano i requisiti specifici dell'applicazione. A tale scopo, creare due classi:
com.day.cq.wcm.msm.api.LiveAction
che esegue l'azione.com.day.cq.wcm.msm.api.LiveActionFactory
e crea istanze della classe LiveAction
.LiveActionFactory
crea le istanze della classe LiveAction
per una determinata configurazione:
LiveAction
le classi includono i metodi seguenti:
getName
: Restituisce il nome dell'azione Il nome viene utilizzato per fare riferimento all'azione, ad esempio nelle configurazioni di rollout.
execute
: Esegue le attività dell'azione.LiveActionFactory
le classi includono i seguenti membri:
LIVE_ACTION_NAME
: Campo che contiene il nome dell'associato LiveAction
. Questo nome deve corrispondere al valore restituito dal metodo getName
della classe LiveAction
.createAction
: Crea un'istanza dell' LiveAction
. Il parametro opzionale Resource
può essere utilizzato per fornire informazioni sulla configurazione.createsAction
: Restituisce il nome dell'associato LiveAction
.Utilizzare il nodo di configurazione LiveAction
nell'archivio per memorizzare informazioni che influiscono sul comportamento di runtime dell'istanza LiveAction
. Il nodo nell'archivio che memorizza la configurazione LiveAction
è disponibile per l'oggetto LiveActionFactory
in fase di esecuzione. Di conseguenza, puoi aggiungere proprietà al nodo di configurazione e utilizzarle nell'implementazione LiveActionFactory
in base alle esigenze.
Ad esempio, un LiveAction
deve memorizzare il nome dell'autore della blueprint. Una proprietà del nodo di configurazione include il nome della proprietà della pagina di blueprint in cui sono memorizzate le informazioni. In fase di esecuzione, il LiveAction
recupera il nome della proprietà dalla configurazione, quindi ottiene il valore della proprietà.
Il parametro del metodo LiveActionFactory
.createAction
è un oggetto Resource
. Questo oggetto Resource
rappresenta il nodo cq:LiveSyncAction
per questa azione live nella configurazione di rollout; vedere Creazione di una configurazione rollout. Come di consueto, quando si utilizza un nodo di configurazione è necessario adattarlo a un oggetto ValueMap
:
public LiveAction createAction(Resource resource) throws WCMException {
ValueMap config;
if (resource == null || resource.adaptTo(ValueMap.class) == null) {
config = new ValueMapDecorator(Collections.<String, Object>emptyMap());
} else {
config = resource.adaptTo(ValueMap.class);
}
return new MyLiveAction(config, this);
}
I seguenti oggetti sono forniti come parametri del metodo execute
dell'oggetto LiveAction
:
Un oggetto Resource
che rappresenta l'origine della Live Copy.
Un oggetto Resource
che rappresenta la destinazione di Live Copy.
L'oggetto LiveRelationship
per la Live Copy.
Il valore autoSave
indica se LiveAction
deve salvare le modifiche apportate alla directory archivio.
Il valore reset indica la modalità di ripristino rollout.
Da questi oggetti è possibile ottenere tutte le informazioni sul LiveCopy
. È inoltre possibile utilizzare gli oggetti Resource
per ottenere gli oggetti ResourceResolver
, Session
e Node
. Questi oggetti sono utili per manipolare il contenuto dell'archivio:
Nella prima riga del codice seguente, source è l'oggetto Resource
della pagina di origine:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Gli argomenti Resource
possono essere oggetti null
o Resources
che non si adattano agli oggetti Node
, ad esempio NonExistingResource
.
Create una configurazione di rollout quando le configurazioni di rollout installate non soddisfano i requisiti dell'applicazione:
La nuova configurazione di rollout è quindi disponibile quando imposti le configurazioni di rollout su una pagina blueprint o Live Copy.
Vedere anche le procedure ottimali per la personalizzazione dei rollout.
Per creare una nuova configurazione di rollout:
CRXDE Lite aperto; ad esempio:
http://localhost:4502/crx/de
Accedi a :
/apps/msm/<your-project>/rolloutconfigs
Questa è la versione personalizzata del progetto di:
/libs/msm/wcm/rolloutconfigs
Deve essere creato se si tratta della prima configurazione.
Non è necessario modificare nulla nel percorso /libs.
Questo perché il contenuto di /libs viene sovrascritto al successivo aggiornamento dell'istanza (e potrebbe essere sovrascritto quando si applica un hotfix o un feature pack).
Il metodo consigliato per la configurazione e altre modifiche è:
In questo Create un nodo con le seguenti proprietà:
contentCopy
o workflow
.cq:RolloutConfig
Aggiungi le seguenti proprietà al nodo:
Nome: jcr:title
Tipo: String
Valore: Titolo identificativo che verrà visualizzato nell’interfaccia utente.
Nome: jcr:description
Tipo: String
Valore: Una descrizione facoltativa.
Nome: cq:trigger
Tipo: String
Valore: Attivazione Rollout da utilizzare. Seleziona da:
rollout
modification
publish
deactivate
Fare clic su Salva tutto.
Le configurazioni di rollout sono memorizzate sotto il nodo di configurazione rollout creato sotto il nodo /apps/msm/<your-project>/rolloutconfigs
.
Aggiungete nodi secondari di tipo cq:LiveSyncAction
per aggiungere azioni di sincronizzazione alla configurazione del rollout. L'ordine dei nodi di azione della sincronizzazione determina l'ordine in cui si verificano le azioni.
Ancora in CRXDE Lite, seleziona il nodo Rollout Configuration.
Esempio:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
Crea un nodo con le seguenti proprietà del nodo:
contentCopy
o workflow
.cq:LiveSyncAction
Aggiungi e configura tutti i nodi di azione di sincronizzazione richiesti. Ridisporre i nodi di azione in modo che l'ordine corrisponda all'ordine in cui si desidera che si verifichino. Il nodo di azione superiore si verifica per primo.
Fare clic su Salva tutto.
Seguite le procedure riportate in questa sezione per sviluppare un LiveActionFactory
e utilizzarlo in una configurazione di rollout. Le procedure utilizzano Maven ed Eclipse per sviluppare e distribuire la LiveActionFactory
:
LiveActionFactory
interfaccia e distribuite il bundle OSGi.Il progetto Maven e il codice sorgente della classe Java sono disponibili nel repository Git pubblico.
CODICE SU GITHUB
Puoi trovare il codice di questa pagina su GitHub
La procedura seguente richiede l’aggiunta del profilo adobe-public al file delle impostazioni Maven.
Aprite una sessione di terminale o riga di comando e cambiate la directory in modo che punti alla posizione in cui creare il progetto.
Digitate il comando seguente:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Al prompt interattivo, specificate i seguenti valori:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Avviate Eclipse e importate il progetto Maven.
Aggiungete dipendenze in modo che il compilatore Eclipse possa fare riferimento alle classi utilizzate nel codice LiveActionFactory
.
In Esplora progetti Eclipse, apri il file:
MyLiveActionFactory/pom.xml
Nell'editor, fare clic sulla scheda pom.xml
e individuare la sezione project/dependencyManagement/dependencies
.
Aggiungete il seguente codice XML all'interno dell'elemento dependencyManagement
, quindi salvate il file.
<dependency>
<groupId>com.day.cq.wcm</groupId>
<artifactId>cq-msm-api</artifactId>
<version>5.6.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
<version>2.4.3-R1488084</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.day.cq.wcm</groupId>
<artifactId>cq-wcm-api</artifactId>
<version>5.6.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.json</artifactId>
<version>2.0.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-commons</artifactId>
<version>5.6.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId>
<version>2.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-commons</artifactId>
<version>5.6.4</version>
<scope>provided</scope>
</dependency>
Aprire il file POM per il bundle da Esplora progetti all'indirizzo MyLiveActionFactory-bundle/pom.xml
.
Nell'editor, fare clic sulla scheda pom.xml
e individuare la sezione progetto/dipendenze. Aggiungete il seguente codice XML all’interno dell’elemento dipendenze, quindi salvate il file:
<dependency>
<groupId>com.day.cq.wcm</groupId>
<artifactId>cq-msm-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
</dependency>
<dependency>
<groupId>com.day.cq.wcm</groupId>
<artifactId>cq-wcm-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.json</artifactId>
</dependency>
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-commons</artifactId>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId>
</dependency>
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-commons</artifactId>
</dependency>
La seguente classe LiveActionFactory
implementa un LiveAction
che registra i messaggi relativi alle pagine di origine e di destinazione e copia la proprietà cq:lastModifiedBy
dal nodo di origine al nodo di destinazione. Il nome dell'azione live è exampleLiveAction
.
In Esplora progetti Eclipse, fare clic con il pulsante destro del mouse sul pacchetto MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
e scegliere Nuovo > Classe. Per Name, immettere ExampleLiveActionFactory
, quindi fare clic su Finish.
Aprite il file ExampleLiveActionFactory.java
, sostituite il contenuto con il codice seguente e salvate il file.
package com.adobe.example.msm;
import java.util.Collections;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.commons.json.io.JSONWriter;
import org.apache.sling.commons.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import com.day.cq.wcm.msm.api.ActionConfig;
import com.day.cq.wcm.msm.api.LiveAction;
import com.day.cq.wcm.msm.api.LiveActionFactory;
import com.day.cq.wcm.msm.api.LiveRelationship;
import com.day.cq.wcm.api.WCMException;
@Component(metatype = false)
@Service
public class ExampleLiveActionFactory implements LiveActionFactory<LiveAction> {
@Property(value="exampleLiveAction")
static final String actionname = LiveActionFactory.LIVE_ACTION_NAME;
public LiveAction createAction(Resource config) {
ValueMap configs;
/* Adapt the config resource to a ValueMap */
if (config == null || config.adaptTo(ValueMap.class) == null) {
configs = new ValueMapDecorator(Collections.<String, Object>emptyMap());
} else {
configs = config.adaptTo(ValueMap.class);
}
return new ExampleLiveAction(actionname, configs);
}
public String createsAction() {
return actionname;
}
/************* LiveAction ****************/
private static class ExampleLiveAction implements LiveAction {
private String name;
private ValueMap configs;
private static final Logger log = LoggerFactory.getLogger(ExampleLiveAction.class);
public ExampleLiveAction(String nm, ValueMap config){
name = nm;
configs = config;
}
public void execute(Resource source, Resource target,
LiveRelationship liverel, boolean autoSave, boolean isResetRollout)
throws WCMException {
String lastMod = null;
log.info(" *** Executing ExampleLiveAction *** ");
/* Determine if the LiveAction is configured to copy the cq:lastModifiedBy property */
if ((Boolean) configs.get("repLastModBy")){
/* get the source's cq:lastModifiedBy property */
if (source != null && source.adaptTo(Node.class) != null){
ValueMap sourcevm = source.adaptTo(ValueMap.class);
lastMod = sourcevm.get(com.day.cq.wcm.msm.api.MSMNameConstants.PN_PAGE_LAST_MOD_BY, String.class);
}
/* set the target node's la-lastModifiedBy property */
Session session = null;
if (target != null && target.adaptTo(Node.class) != null){
ResourceResolver resolver = target.getResourceResolver();
session = resolver.adaptTo(javax.jcr.Session.class);
Node targetNode;
try{
targetNode=target.adaptTo(javax.jcr.Node.class);
targetNode.setProperty("la-lastModifiedBy", lastMod);
log.info(" *** Target node lastModifiedBy property updated: {} ***",lastMod);
}catch(Exception e){
log.error(e.getMessage());
}
}
if(autoSave){
try {
session.save();
} catch (Exception e) {
try {
session.refresh(true);
} catch (RepositoryException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
}
public String getName() {
return name;
}
/************* Deprecated *************/
@Deprecated
public void execute(ResourceResolver arg0, LiveRelationship arg1,
ActionConfig arg2, boolean arg3) throws WCMException {
}
@Deprecated
public void execute(ResourceResolver arg0, LiveRelationship arg1,
ActionConfig arg2, boolean arg3, boolean arg4)
throws WCMException {
}
@Deprecated
public String getParameterName() {
return null;
}
@Deprecated
public String[] getPropertiesNames() {
return null;
}
@Deprecated
public int getRank() {
return 0;
}
@Deprecated
public String getTitle() {
return null;
}
@Deprecated
public void write(JSONWriter arg0) throws JSONException {
}
}
}
Utilizzando il terminale o la sessione di comando, cambiare la directory nella directory MyLiveActionFactory
(la directory del progetto Maven). Quindi, digitate il comando seguente:
mvn -PautoInstallPackage clean install
Il file AEM error.log
deve indicare che il bundle è stato avviato.
Ad esempio, http://localhost:4502/system/console/status-slinglogs.
13.08.2013 14:34:55.450 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent RESOLVED
13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTING
13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTED
13.08.2013 14:34:55.453 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle Service [com.adobe.example.msm.ExampleLiveActionFactory,2188] ServiceEvent REGISTERED
13.08.2013 14:34:55.454 *INFO* [OsgiInstallerImpl] org.apache.sling.audit.osgi.installer Started bundle com.adobe.example.msm.MyLiveActionFactory-bundle [316]
Create la configurazione di rollout MSM che utilizza la LiveActionFactory
creata:
Creare e configurare una configurazione rollout con la procedura standard e utilizzare le proprietà:
publish
Configurate la configurazione di rollout creata nella procedura precedente in modo che utilizzi la classe ExampleLiveActionFactory
.
CRXDE Lite aperto; ad esempio, http://localhost:4502/crx/de.
Crea il seguente nodo sotto /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Fare clic su Salva tutto.
Selezionare il nodo exampleLiveAction
e aggiungere la seguente proprietà:
repLastModBy
Boolean
true
Questa proprietà indica alla classe ExampleLiveAction
che la proprietà cq:LastModifiedBy
deve essere replicata dall'origine al nodo di destinazione.
Fare clic su Salva tutto.
Create una copia dal vivo del ramo inglese/prodotto del sito di riferimento We.Retail utilizzando la configurazione di rollout:
Origine: /content/we-retail/language-masters/en/products
Configurazione rollout: Esempio di configurazione del rollout
Attivare la pagina Products (inglese) del ramo di origine e osservare i messaggi di registro generati dalla classe LiveAction
:
16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction *** ExampleLiveAction has been executed.***
16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction *** Target node lastModifiedBy property updated: admin ***
AEM utilizza un set predefinito di codici lingua e paese.
MSM utilizza un elenco memorizzato di codici lingua e paese per determinare il nome del paese associato al nome della versione della lingua della pagina. Se necessario, potete modificare i seguenti aspetti dell’elenco:
en
, de
)L'elenco delle lingue è memorizzato sotto il nodo /libs/wcm/core/resources/languages
. Ogni nodo figlio rappresenta una lingua o un paese della lingua:
Il nome del nodo è il codice della lingua (ad esempio en
o de
) o il codice del paese_lingua (ad esempio en_us
o de_ch
).
La proprietà language
del nodo memorizza il nome completo della lingua per il codice.
La proprietà country
del nodo memorizza il nome completo del paese per il codice.
Quando il nome del nodo è composto solo da un codice della lingua (ad esempio en
), la proprietà country è *
e una proprietà defaultCountry
aggiuntiva memorizza il codice del paese della lingua per indicare il paese da utilizzare.
Per modificare le lingue:
Aprite il CRXDE Lite nel browser Web; ad esempio, http://localhost:4502/crx/de
Selezionare la cartella /apps
e fare clic su Crea, quindi su Crea cartella.
Denominate la nuova cartella wcm
.
Ripetete il passaggio precedente per creare la struttura /apps/wcm/core
della cartella. Create un nodo di tipo sling:Folder
nel nucleo denominato resources
.
Fare clic con il pulsante destro del mouse sul nodo /libs/wcm/core/resources/languages
e scegliere Copia.
Fare clic con il pulsante destro del mouse sulla cartella /apps/wcm/core/resources
e scegliere Incolla. Modificate i nodi secondari come necessario.
Fare clic su Salva tutto.
Fare clic su Strumenti, Operazioni, quindi su Console Web. Da questa console fare clic su OSGi, quindi su Configuration.
Individuare e fare clic su Day CQ WCM Language Manager, quindi modificare il valore di Language List in /apps/wcm/core/resources/languages
, quindi fare clic su Save.
Durante la creazione di una proprietà pagina personalizzata, potrebbe essere necessario considerare se la nuova proprietà deve essere idonea per il rollout in qualsiasi Live Copy.
Ad esempio, se vengono aggiunte due nuove proprietà di pagina:
E-mail di contatto:
Stile visivo chiave:
A questo punto è necessario assicurarsi che:
E-mail di contatto:
Stile visivo chiave:
Se una proprietà di pagina è soggetta al rollout e, di conseguenza, all’annullamento/ripristino dell’ereditarietà durante la modifica, è controllata dalla proprietà dialog:
cq-msm-lockable
è applicabile agli elementi in una finestra di dialogo dell’interfaccia touch
crea il simbolo del collegamento a catena nella finestra di dialogo
consente la modifica solo se l'ereditarietà viene annullata (il collegamento a catena non funziona)
si applica solo al primo livello figlio della risorsa
Tipo: String
Valore: detiene il nome dell’immobile in questione (ed è paragonabile al valore dell’immobile name
; ad esempio, vedete
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Quando cq-msm-lockable
è stato definito, l'interruzione/chiusura della catena interagisce con MSM nel modo seguente:
se il valore di cq-msm-lockable
è:
Relativo (ad esempio myProperty
o ./myProperty
)
cq:propertyInheritanceCancelled
.Assoluto (ad es. /image
)
cq:LiveSyncCancelled
a ./image
e impostando cq:isCancelledForChildren
su true
.cq-msm-lockable si applica al primo livello figlio della risorsa da modificare e non funziona su antenati di livello più profondo, indipendentemente dal fatto che il valore sia definito come assoluto o relativo.
Quando riattivate l'ereditarietà, la proprietà Live Copy page non viene sincronizzata automaticamente con la proprietà source. Se necessario, potete richiedere manualmente una sincronizzazione.