Ce document vous aide à comprendre comment étendre les fonctionnalités de Multi Site Manager et couvre les rubriques suivantes.
Cette page est plus facile à comprendre dans le contexte du document. Réutilisation de contenu : Multi Site Manager.
Le Multi Site Manager et son API sont utilisés lors de la création d’un site web. Ils ne sont donc destinés qu’à être utilisés dans un environnement de création.
La gestion multisite se compose des packages suivants :
Les principaux objets API MSM interagissent comme suit (voir aussi la section Termes utilisés) :
Blueprint
- A Blueprint
(comme dans configuration du plan directeur) indique les pages à partir desquelles une Live Copy peut hériter du contenu.
L’utilisation d’une configuration de plan directeur (Blueprint
) est facultative, mais :
LiveRelationship
- La variable LiveRelationship
spécifie la connexion (relation) entre une ressource de la branche Live Copy et sa ressource source/plan directeur équivalente.
Les relations sont utilisées lors de la réalisation de l’héritage et du déploiement.
Les objets LiveRelationship
fournissent un accès (références) aux objets de configuration de déploiement (RolloutConfig
), LiveCopy
et LiveStatus
liés à la relation.
Par exemple, une Live Copy est créée dans /content/copy/us
à partir de la source ou du plan directeur au niveau /content/wknd/language-masters
. Les ressources /content/wknd/language-masters/en/jcr:content
et /content/copy/us/en/jcr:content
forment une relation.
LiveCopy
- A LiveCopy
contient les détails de configuration des relations (LiveRelationship
) entre les ressources Live Copy et leurs ressources source/de plan directeur.
Utilisez la classe LiveCopy
pour accéder au chemin d’accès de la page, au chemin d’accès de la page de source ou de plan directeur, aux configurations de déploiement et si les pages enfants sont également incluses dans la LiveCopy
.
Un nœud LiveCopy
est créé chaque fois que Créer un site ou Créer une Live Copy est utilisé.
LiveStatus
- LiveStatus
permet d’accéder à l’état d’exécution d’un LiveRelationship
. Permet d’interroger le statut de synchronisation d’une Live Copy.
LiveAction
- A LiveAction
est une action exécutée sur chaque ressource impliquée dans le déploiement.
LiveAction
s sont uniquement générés par RolloutConfig
s.LiveActionFactory
- A LiveActionFactory
crée LiveAction
objet d’une LiveAction
configuration. Les configurations sont stockées en tant que ressources dans le référentiel.
RolloutConfig
- La variable RolloutConfig
contient une liste de LiveActions
, à utiliser lors du déclenchement. La LiveCopy
hérite de RolloutConfig
et le résultat est présent dans LiveRelationship
.
RolloutConfig
(qui déclenche l’événement LiveAction
s).Vous pouvez créer des actions de synchronisation personnalisées à utiliser avec vos configurations de déploiement. Cela peut s’avérer utile lorsque la variable actions installées ne remplissez pas les exigences spécifiques à votre application.
Pour ce faire, créez deux classes :
com.day.cq.wcm.msm.api.LiveAction
qui effectue l’action.com.day.cq.wcm.msm.api.LiveActionFactory
et crée des instances de votre LiveAction
classLa LiveActionFactory
crée des instances de la classe LiveAction
pour une configuration donnée :
Les classes LiveAction
incluent les méthodes suivantes :
getName
- Renvoie le nom de l’action
execute
- Effectue les tâches de l’action
Les classes LiveActionFactory
incluent les méthodes suivantes :
LIVE_ACTION_NAME
- Champ contenant le nom de l’objet associé LiveAction
getName
de la classe LiveAction
.createAction
- Crée une instance de la fonction LiveAction
Resource
peut être utilisé pour fournir des informations de configuration.createsAction
- Renvoie le nom de l’objet associé LiveAction
Utilisez le nœud de configuration LiveAction
dans le référentiel pour stocker les informations qui affectent le comportement d’exécution de l’instance LiveAction
. Le nœud du référentiel qui stocke la configuration LiveAction
est disponible pour l’objet LiveActionFactory
lors de l’exécution. Par conséquent, vous pouvez ajouter des propriétés au nœud de configuration et les utiliser dans votre implémentation LiveActionFactory
si nécessaire.
Par exemple, un LiveAction
doit stocker le nom de l’auteur du plan directeur. Une propriété du nœud de configuration inclut le nom de la propriété de la page plan directeur qui stocke les informations. Lorsqu’elle est exécutée, la LiveAction
récupère le nom de la propriété à partir de la configuration, puis obtient la valeur de la propriété.
Le paramètre de la méthode LiveActionFactory.createAction
est un objet Resource
. Ceci Resource
représente l’objet cq:LiveSyncAction
pour cette action en direct dans la configuration du déploiement.
Voir Création d’une configuration de déploiement pour plus d’informations.
Comme d’habitude, lorsque vous utilisez un nœud de configuration, vous devez l’adapter à un objet 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);
}
Les objets suivants sont fournis en tant que paramètres de la méthode execute
de l’objet LiveAction
:
Resource
qui représente la source de la Live Copy ;Resource
qui représente la cible de la Live Copy.LiveRelationship
pour la Live Copy
autoSave
indique si la variable LiveAction
doit enregistrer les modifications apportées au référentiel.reset
indique le mode de réinitialisation du déploiement.À partir de ces objets, vous pouvez obtenir des informations sur la variable LiveCopy
. Vous pouvez également utiliser les objets Resource
pour obtenir les objets ResourceResolver
, Session
et Node
. Ces objets sont utiles pour manipuler le contenu du référentiel :
Dans la première ligne du code suivant, source est l’objet Resource
de la page source :
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Les arguments Resource
peuvent être des objets null
ou Resources
qui ne s’adaptent pas aux objets Node
, tels que les objets NonExistingResource
.
Vous pouvez créer une configuration de déploiement lorsque les configurations de déploiement installées ne répondent pas aux exigences de votre application en procédant comme suit :
La nouvelle configuration de déploiement est alors disponible pour vous lors de la définition des configurations de déploiement sur une page de plan directeur ou de Live Copy.
Consultez également les bonnes pratiques pour la personnalisation des déploiements.
Pour créer une configuration de déploiement :
Ouvrez le CRXDE Lite sur https://<host>:<port>/crx/de
.
Accédez à /apps/msm/<your-project>/rolloutconfigs
, la version personnalisée de votre projet de /libs/msm/wcm/rolloutconfigs
.
/libs
doit être utilisée comme modèle pour créer la branche sous /apps
.Sous cet emplacement, créez un noeud avec les propriétés suivantes :
contentCopy
ou workflow
cq:RolloutConfig
Ajoutez les propriétés suivantes à ce nœud :
Nom : jcr:title
Type : String
Valeur: un titre d’identification qui s’affichera dans l’interface utilisateur.
Nom : jcr:description
Type : String
Valeur : une description facultative.
Nom : cq:trigger
Type : String
Valeur: la variable Déclencheur de déploiement à utiliser
rollout
modification
publish
deactivate
Cliquez sur Enregistrer tout.
Les configurations de déploiement sont stockées sous le noeud de configuration de déploiement que vous avez créé sous le /apps/msm/<your-project>/rolloutconfigs
noeud .
Ajoutez des nœuds enfants de type cq:LiveSyncAction
pour ajouter des actions de synchronisation à la configuration de déploiement. L’ordre des nœuds d’action de synchronisation détermine l’ordre dans lequel les actions se produisent.
Dans CRXDE Lite, sélectionnez votre Configuration du déploiement noeud, par exemple : /apps/msm/myproject/rolloutconfigs/myrolloutconfig
.
Créez un noeud avec les propriétés de noeud suivantes :
contentCopy
ou workflow
.cq:LiveSyncAction
Ajoutez et configurez autant de noeuds d’action de synchronisation que nécessaire.
Réorganisez les noeuds d’action de sorte que leur ordre corresponde à l’ordre dans lequel vous souhaitez qu’ils se produisent.
Suivez les procédures de cette section pour développer une LiveActionFactory
et l’utiliser dans une configuration de déploiement. Les procédures utilisent Maven et Eclipse pour développer et déployer la LiveActionFactory
:
LiveActionFactory
interface et déployez le lot OSGi.Le projet Maven et le code source de la classe Java est disponible dans le référentiel Git public.
La procédure suivante nécessite que vous ayez ajouté la variable adobe-public
profil de votre fichier de paramètres Maven.
Ouvrez une session de terminal ou de ligne de commande, puis modifiez le répertoire pour qu’il pointe vers l’emplacement où le projet sera créé.
Saisissez la commande suivante :
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Spécifiez les valeurs suivantes à l’invite interactive :
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Démarrez Eclipse et importez le projet Maven.
Ajoutez des dépendances pour que le compilateur Eclipse puisse référencer les classes utilisées dans le code LiveActionFactory
.
Dans l’Explorateur de projets Eclipse, ouvrez le fichier . MyLiveActionFactory/pom.xml
.
Dans l’éditeur, cliquez sur l’onglet pom.xml
et localisez la section project/dependencyManagement/dependencies
.
Ajoutez le code XML suivant dans l’élément dependencyManagement
, puis enregistrez le fichier.
<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>
Ouvrez le fichier POM pour le bundle depuis l’explorateur de projets à l’adresse MyLiveActionFactory-bundle/pom.xml
.
Dans l’éditeur, cliquez sur l’onglet pom.xml
et localisez la section project/dependencies. Ajoutez le code XML suivant dans l’élément des dépendances, puis enregistrez le fichier :
<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 classe LiveActionFactory
suivante implémente une LiveAction
qui enregistre les messages sur les pages source et cible et copie la propriété cq:lastModifiedBy
du nœud source vers le nœud cible. Le nom de la live action est exampleLiveAction
.
Dans l’Explorateur de projets Eclipse, cliquez avec le bouton droit sur la MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
module et cliquez sur Nouveau > Classe.
Comme nom, entrez ExampleLiveActionFactory
, puis cliquez sur Terminer.
Ouvrez le fichier ExampleLiveActionFactory.java
, remplacez le contenu par le code suivant et enregistrez le fichier.
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 {
}
}
}
A l’aide du terminal ou de la session de commande, remplacez le répertoire par le répertoire MyLiveActionFactory
(répertoire du projet Maven). Ensuite, entrez la commande suivante :
mvn -PautoInstallPackage clean install
L'AEM error.log
doit indiquer que le lot est démarré, visible dans les journaux à l’adresse https://<host>:<port>/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]
Créez la configuration de déploiement du MSM qui utilise la LiveActionFactory
que vous avez créée :
Création et configuration d’une Configuration du déploiement selon la procédure standard à l’aide des propriétés :
publish
Paramétrez la configuration de déploiement que vous avez créée dans la procédure précédente afin qu’elle utilise la classe ExampleLiveActionFactory
.
Ouvrez CRXDE Lite.
Créez le nœud correspondant sous /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Cliquez sur Enregistrer tout.
Sélectionnez la variable exampleLiveAction
et ajoutez une propriété à indiquer au ExampleLiveAction
, qui cq:LastModifiedBy
doit être répliquée de la source vers le noeud cible.
repLastModBy
Boolean
true
Cliquez sur Enregistrer tout.
Création d’une Live Copy de la branche English/Products du site de référence WKND à l’aide de votre configuration de déploiement :
Source : /content/wknd/language-masters/en/products
Configuration de déploiement : exemple de configuration de déploiement
Activez la page Products (en anglais) de la branche source et observez les messages de journalisation générés par la 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 utilise un ensemble par défaut de codes de langue et de pays.
MSM utilise une liste stockée de codes de langue et de pays pour déterminer le nom du pays associé au nom de la version linguistique de votre page. Si nécessaire, vous pouvez modifier les aspects suivants de la liste :
en
, de
, entre autres)La liste des langues est stockée sous le nœud /libs/wcm/core/resources/languages
. Chaque nœud enfant représente une langue ou un code langue-pays :
Le nom du noeud est le code de langue (par exemple, en
ou de
) ou le code language_country (par exemple en_us
ou de_ch
).
La propriété language
du nœud stocke le nom complet de la langue pour le code.
La propriété country
du nœud stocke le nom complet du pays pour le code.
Lorsque le nom de nœud consiste uniquement en un code de langue (en
, par exemple), la propriété de pays est *
et une propriété supplémentaire defaultCountry
stocke le code langue-pays pour indiquer le pays à utiliser.
Pour modifier les langues :
Ouvrez CRXDE Lite.
Sélectionnez le dossier /apps
et cliquez sur Créer, puis sur Créer un dossier.
Nommez le nouveau dossier wcm
.
Répétez l’étape précédente pour créer l’arborescence de dossiers /apps/wcm/core
. Création d’un noeud de type sling:Folder
in core
appelé resources
.
Cliquez avec le bouton droit sur le nœud /libs/wcm/core/resources/languages
et cliquez sur Copier.
Cliquez avec le bouton droit sur le dossier /apps/wcm/core/resources
et cliquez sur Coller. Modifiez les nœuds enfants selon les besoins.
Cliquez sur Enregistrer tout.
Cliquez sur Outils, Opérations puis Console Web. Dans cette console, cliquez sur OSGi, puis Configuration.
Recherchez et cliquez sur le Gestionnaire de langues de gestion de contenu Web Day CQ et redéfinissez la valeur de Liste de langues sur /apps/wcm/core/resources/languages
, puis cliquez sur Enregistrer.
Lors de la création d’une propriété de page personnalisée, vous devrez peut-être déterminer si la nouvelle propriété doit être éligible au déploiement sur des Live Copies.
Par exemple, si deux nouvelles propriétés de page sont ajoutées :
Contact e-mail :
Style visuel clé :
Assurez-vous ensuite que les propriétés suivantes sont correctement configurées :
Contact e-mail :
Style visuel clé :
La propriété de boîte de dialogue détermine si une propriété de page est soumise au déploiement, et donc à l’annulation ou au rétablissement de l’héritage lors de la modification :
cq-msm-lockable
String
name
Par exemple, voir
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Lorsque cq-msm-lockable
a été défini, la rupture/le verrouillage de la chaîne interagit avec le MSM de la façon suivante :
Si la valeur de cq-msm-lockable
est :
Relatif (par exemple, myProperty
ou ./myProperty
)
cq:propertyInheritanceCancelled
.Absolu (par exemple, /image
)
La rupture de la chaîne annule l’héritage en ajoutant la variable cq:LiveSyncCancelled
mixin to ./image
et définition cq:isCancelledForChildren
to true
.
La fermeture de la chaîne rétablit l’héritage.
cq-msm-lockable
s’applique au premier niveau enfant de la ressource à éditer et il n’est pas fonctionnel à un niveau plus profond, que la valeur soit définie comme absolue ou relative.
Lorsque vous réactivez l’héritage, la propriété de page de la Live Copy n’est pas automatiquement synchronisée avec la propriété source. Vous pouvez demander manuellement une synchronisation si nécessaire.