Questa pagina consente di estendere le funzionalità del gestore multisito:
Questa pagina deve essere letta insieme a Riutilizzo del contenuto: Gestore multisito.
Anche le seguenti sezioni di Ristrutturazione dell’archivio Sites potrebbero essere di interesse:
Multi Site Manager e la relativa API vengono utilizzati per la creazione di un sito web, quindi sono destinati solo all’ambiente di authoring.
La gestione multisito è costituita dai seguenti pacchetti:
I principali oggetti API MSM interagiscono come segue (vedi anche Termini utilizzati):
Blueprint
A Blueprint
(come in configurazione blueprint) specifica le pagine da cui una live copy può ereditare il contenuto.
Utilizzo di una configurazione blueprint ( Blueprint
) è facoltativo, ma:
LiveRelationship
Il LiveRelationship
specifica la connessione (relazione) tra una risorsa nel ramo live copy e la relativa risorsa sorgente/blueprint equivalente.
Le relazioni vengono utilizzate per la realizzazione dell’ereditarietà e del rollout.
LiveRelationship
Gli oggetti forniscono accesso (riferimenti) alle configurazioni di rollout ( RolloutConfig
), LiveCopy
, e LiveStatus
oggetti correlati alla relazione.
Ad esempio, una Live Copy viene creata in /content/copy/us
dalla sorgente/blueprint in /content/we-retail/language-masters
. Le risorse /content/we.retail/language-masters/en/jcr:content
e /content/copy/us/en/jcr:content
creare una relazione.
LiveCopy
LiveCopy
contiene i dettagli di configurazione per le relazioni ( LiveRelationship
) tra le risorse live copy e le relative risorse sorgente/blueprint.
Utilizza il LiveCopy
classe per accedere al percorso della pagina, al percorso della pagina sorgente/blueprint, alle configurazioni di rollout e se le pagine figlie sono incluse anche nel LiveCopy
.
A LiveCopy
viene creato ogni volta Crea sito o Crea Live Copy viene utilizzato.
LiveStatus
LiveStatus
gli oggetti forniscono accesso allo stato di runtime di un LiveRelationship
. Utilizza per eseguire una query sullo stato di sincronizzazione di una Live Copy.
LiveAction
A LiveAction
è un’azione eseguita su ogni risorsa coinvolta nel rollout.
LiveActionFactory
Crea LiveAction
oggetti a cui è stato assegnato un LiveAction
configurazione. Le configurazioni vengono memorizzate come risorse nell’archivio.
RolloutConfig
Il RolloutConfig
contiene un elenco di LiveActions
, da utilizzare quando viene attivato. Il LiveCopy
eredita il RolloutConfig
e il risultato è presente nel LiveRelationship
.
Crea azioni di sincronizzazione personalizzate da utilizzare con le configurazioni di rollout. Creare un'azione di sincronizzazione quando azioni installate non soddisfano i requisiti specifici dell'applicazione. A tale scopo, crea due classi:
com.day.cq.wcm.msm.api.LiveAction
che esegue l'azione.com.day.cq.wcm.msm.api.LiveActionFactory
e crea istanze della LiveAction
classe.Il LiveActionFactory
crea istanze del LiveAction
classe per una determinata configurazione:
LiveAction
le classi includono i seguenti metodi:
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 del campo associato LiveAction
. Questo nome deve coincidere con il valore restituito da getName
metodo del LiveAction
classe.
createAction
: crea un’istanza del LiveAction
. L'opzione Resource
Il parametro può essere utilizzato per fornire informazioni di configurazione.
createsAction
: restituisce il nome del associato LiveAction
.
Utilizza il LiveAction
nel repository per memorizzare le informazioni che influiscono sul comportamento in fase di esecuzione del LiveAction
dell'istanza. Il nodo nell’archivio in cui è memorizzato LiveAction
è disponibile per LiveActionFactory
oggetto in fase di runtime. Pertanto, puoi aggiungere proprietà al nodo di configurazione e utilizzarle nel tuo LiveActionFactory
all'occorrenza.
Ad esempio, un LiveAction
deve memorizzare il nome dell’autore blueprint. Una proprietà del nodo di configurazione include il nome della proprietà della pagina blueprint in cui sono memorizzate le informazioni. In fase di runtime, LiveAction
recupera il nome della proprietà dalla configurazione, quindi ottiene il valore della proprietà.
Il parametro del LiveActionFactory.createAction
è un metodo Resource
oggetto. Questo Resource
l'oggetto rappresenta cq:LiveSyncAction
per questa azione live nella configurazione di rollout; vedi Creazione di una configurazione di rollout. Come sempre quando si utilizza un nodo di configurazione, è necessario adattarlo a un ValueMap
oggetto:
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 vengono forniti come parametri del execute
metodo del LiveAction
oggetto:
A Resource
oggetto che rappresenta l’origine della Live Copy.
A Resource
oggetto che rappresenta la destinazione della Live Copy.
Il LiveRelationship
oggetto per la live copy.
Il autoSave
il valore indica se il LiveAction
deve salvare le modifiche apportate all’archivio.
Il valore reset indica la modalità di rollout reset.
Da questi oggetti è possibile ottenere tutte le informazioni relative al LiveCopy
. È inoltre possibile utilizzare Resource
oggetti da ottenere ResourceResolver
, Session
, e Node
oggetti. Questi oggetti sono utili per la manipolazione del contenuto del repository:
Nella prima riga del codice seguente, l’origine è Resource
oggetto della pagina sorgente:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Il Resource
possono essere null
o Resources
oggetti che non si adattano Node
oggetti, come NonExistingResource
oggetti.
Crea 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.
Consulta anche best practice per personalizzare i rollout.
Per creare una nuova configurazione di rollout:
Apri CRXDE Lite; ad esempio:
http://localhost:4502/crx/de
Accedi a :
/apps/msm/<your-project>/rolloutconfigs
Questa è la versione personalizzata del tuo progetto di:
/libs/msm/wcm/rolloutconfigs
Se si tratta della prima configurazione, /libs
il ramo deve essere utilizzato come modello per creare il nuovo ramo in /apps
.
Non è necessario modificare nulla nel /libs
percorso.
Questo perché il contenuto di /libs
viene sovrascritto al successivo aggiornamento dell’istanza (e potrebbe benissimo essere sovrascritto quando applichi un hotfix o un feature pack).
Il metodo consigliato per la configurazione e altre modifiche è:
/libs
) in /apps
/apps
Sotto questo Crea un nodo con le seguenti proprietà:
contentCopy
o workflow
.cq:RolloutConfig
Aggiungi le seguenti proprietà a questo nodo:
Nome: jcr:title
Tipo: String
Valore: titolo che verrà visualizzato nell’interfaccia utente di.
Nome: jcr:description
Tipo: String
Valore: descrizione facoltativa.
Nome: cq:trigger
Tipo: String
Valore: Il Attivatore rollout da utilizzare. Seleziona da:
rollout
modification
publish
deactivate
Clic Salva tutto.
Le configurazioni di rollout sono memorizzate sotto nodo di configurazione rollout che hai creato in /apps/msm/<your-project>/rolloutconfigs
nodo.
Aggiungi nodi figlio di tipo cq:LiveSyncAction
per aggiungere azioni di sincronizzazione alla configurazione di rollout. L'ordine dei nodi delle azioni di sincronizzazione determina l'ordine in cui si verificano le azioni.
Sempre in CRXDE Lite, seleziona il tuo Configurazione rollout nodo.
Ad esempio:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
Crea un nodo con le seguenti proprietà:
contentCopy
o workflow
.cq:LiveSyncAction
Aggiungere e configurare tutti i nodi delle azioni di sincronizzazione necessari. Ridisponi i nodi delle azioni in modo che il loro ordine corrisponda all’ordine in cui desideri che si verifichino. Il nodo di azione più in alto si verifica per primo.
Segui le procedure descritte in questa sezione per sviluppare un’ LiveActionFactory
e utilizzalo in una configurazione di rollout. Le procedure utilizzano Maven ed Eclipse per sviluppare e distribuire LiveActionFactory
:
LiveActionFactory
interfaccia e implementa il bundle OSGi.Il progetto Maven e il codice sorgente della classe Java sono disponibili nell’archivio Git pubblico.
CODICE SU GITHUB
Puoi trovare il codice di questa pagina su GitHub
La procedura seguente richiede che tu abbia aggiunto il profilo adobe-public al file delle impostazioni Maven.
Apri un terminale o una sessione della riga di comando e cambia la directory in modo che punti alla posizione in cui creare il progetto.
Immetti il comando seguente:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Specifica i seguenti valori al prompt interattivo:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Avvia Eclipse e importare il progetto Maven.
Aggiungere le dipendenze in modo che il compilatore Eclipse possa fare riferimento alle classi utilizzate nel LiveActionFactory
codice.
Da Esplora progetto Eclipse, apri il file:
MyLiveActionFactory/pom.xml
Nell’editor, fai clic su pom.xml
e individuare il project/dependencyManagement/dependencies
sezione.
Aggiungi il seguente XML all'interno del dependencyManagement
e quindi salvare 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>
Apri il file POM del bundle da Gestione progetti a MyLiveActionFactory-bundle/pom.xml
.
Nell’editor, fai clic su pom.xml
e individuare la sezione progetto/dipendenze. Aggiungi il seguente XML all’interno dell’elemento dependencies, quindi salva 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>
I seguenti elementi LiveActionFactory
la classe implementa una LiveAction
che registra i messaggi sulle pagine di origine e di destinazione e copia i cq:lastModifiedBy
dal nodo di origine al nodo di destinazione. Il nome dell’azione live è exampleLiveAction
.
In Eclipse Project Explorer, fai clic con il pulsante destro del mouse sul MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
pacchetto e fai clic su Nuovo > Classe. Per Nome, immetti ExampleLiveActionFactory
e quindi fare clic su Fine.
Apri ExampleLiveActionFactory.java
, sostituire il contenuto con il codice seguente e salvare 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, modificare la directory in MyLiveActionFactory
(la directory del progetto Maven). Quindi, immetti il seguente comando:
mvn -PautoInstallPackage clean install
L'AEM error.log
Il file deve indicare che il bundle è stato avviato.
Ad esempio: https://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]
Crea la configurazione di rollout MSM che utilizza LiveActionFactory
creato:
Creare e configurare un Rollout della configurazione con la procedura standard - e utilizzando le proprietà:
publish
Configura la configurazione di rollout creata nella procedura precedente in modo che utilizzi ExampleLiveActionFactory
classe.
Apri CRXDE Lite; ad esempio, https://localhost:4502/crx/de.
Crea il seguente nodo sotto /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Clic Salva tutto.
Seleziona la exampleLiveAction
e aggiungi la seguente proprietà:
repLastModBy
Boolean
true
Questa proprietà indica al ExampleLiveAction
classe che cq:LastModifiedBy
deve essere replicata dal nodo di origine a quello di destinazione.
Clic Salva tutto.
Creare una Live Copy della sezione inglese/prodotti del sito di riferimento We.Retail utilizzando la configurazione di rollout:
Origine: /content/we-retail/language-masters/en/products
Configurazione rollout: esempio di configurazione di rollout
Attiva il Prodotti (inglese) del ramo di origine e osserva i messaggi di registro che LiveAction
la classe genera:
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 ***
L’AEM utilizza un set predefinito di codici per lingua e paese.
MSM utilizza un elenco memorizzato di codici di lingua e paese per determinare il nome del paese associato al nome della versione della lingua della pagina. Se necessario, puoi modificare i seguenti aspetti dell’elenco:
en
, de
, tra gli altri)L'elenco delle lingue è memorizzato sotto /libs/wcm/core/resources/languages
nodo. 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 language_country (ad esempio en_us
o de_ch
).
Il language
del nodo memorizza il nome completo della lingua per il codice.
Il country
del nodo memorizza il nome completo del paese per il codice.
Quando il nome del nodo è costituito solo da un codice della lingua (ad esempio en
), la proprietà country è *
, e un'ulteriore defaultCountry
La proprietà memorizza il codice della lingua-paese per indicare il paese da utilizzare.
Per modificare le lingue:
Apri CRXDE Lite nel browser web; ad esempio, https://localhost:4502/crx/de
Seleziona la /apps
cartella e fai clic su Crea, quindi Crea cartella.
Denomina la nuova cartella wcm
.
Ripeti il passaggio precedente per creare /apps/wcm/core
struttura di cartelle. Creare un nodo di tipo sling:Folder
in core
ha chiamato resources
.
Fare clic con il pulsante destro del mouse /libs/wcm/core/resources/languages
e fai clic su Copia.
Fare clic con il pulsante destro del mouse /apps/wcm/core/resources
cartella e fai clic su Incolla. Modificare i nodi figlio come richiesto.
Clic Salva tutto.
Clic Strumenti, Operazioni allora Console web. Da questa console fai clic su OSGi, quindi Configurazione.
Individua e fai clic su Gestione lingua WCM Day CQ e modificare il valore di Elenco lingue a /apps/wcm/core/resources/languages
, quindi fai clic su Salva.
Quando crei una proprietà di pagina personalizzata, potrebbe essere necessario considerare se la nuova proprietà può 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:
Quindi è necessario assicurarsi che:
E-mail di contatto:
è escluso dalle proprietà di rollout; vedi Esclusione di proprietà e tipi di nodo dalla sincronizzazione.
Stile visivo chiave:
Assicurati di non essere autorizzato a modificare questa proprietà nell’interfaccia utente touch a meno che l’ereditarietà non venga annullata, e di poter quindi ripristinare l’ereditarietà; questo viene controllato facendo clic sui collegamenti a catena o a catena interrotta che attivano per indicare lo stato della connessione.
Se una proprietà di pagina è soggetta a rollout e quindi, in caso di annullamento/ripristino dell’ereditarietà durante la modifica, è controllata dalla proprietà della finestra di dialogo:
cq-msm-lockable
Tipo: String
Valore: detiene il nome della proprietà in questione (ed è paragonabile al valore della proprietà) name
; ad esempio, vedi
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Quando cq-msm-lockable
è stato definito, la rottura/chiusura della catena interagirà con MSM nel modo seguente:
se il valore di cq-msm-lockable
è:
Relativo (ad esempio, myProperty
o ./myProperty
)
cq:propertyInheritanceCancelled
.Assoluto (ad esempio, /image
)
interrompendo la catena, l’ereditarietà verrà annullata aggiungendo il cq:LiveSyncCancelled
mixin a ./image
e l'impostazione cq:isCancelledForChildren
a true
.
la chiusura della catena ripristina l’ereditarietà.
cq-msm-lockable
si applica al primo livello figlio della risorsa da modificare e non funziona su nessun livello precedente più profondo, a prescindere dal fatto che il valore sia definito come assoluto o relativo.
Quando riabiliti l’ereditarietà, la proprietà della pagina Live Copy non viene sincronizzata automaticamente con la proprietà sorgente. Se necessario, è possibile richiedere manualmente una sincronizzazione.