Cette page vous explique comment étendre les fonctionnalités de Multi Site Manager :
Cette page doit être lue conjointement avec :
Le Multi Site Manager et son API sont utilisés lors de la création d’un site Web. Ils sont donc destinés exclusivement à l’environnement de création.
La gestion de sites multiples comprend les modules suivants :
Les principaux objets de l’API MSM interagissent comme suit (voir aussi Termes utilisés) :
Blueprint
Un Blueprint
(comme dans la configuration du plan directeur) spécifie les pages à partir desquelles une copie dynamique peut hériter du contenu.
L'utilisation d'une configuration de plan directeur ( Blueprint
) est facultative, mais :
LiveRelationship
Le LiveRelationship
paramètre spécifie la connexion (relation) entre une ressource de la branche de la copie dynamique et sa ressource source/prototype équivalente.
LiveRelationship
les objets fournissent un accès (références) aux configurations de déploiement ( RolloutConfig
), LiveCopy
et LiveStatus
aux objets liés à la relation./content/copy/us
à partir de la source/du plan directeur à /content/we-retail/language-masters
. Les ressources /content/we.retail/language-masters/en/jcr:content
et /content/copy/us/en/jcr:content
forment une relation.LiveCopy
contient les détails de configuration des relations ( LiveRelationship
) entre les ressources de copie dynamique et leurs ressources source/plan directeur.
LiveCopy
pour accéder au chemin de la page, au chemin de la page source/prototype, aux configurations de déploiement et à la question de savoir si les pages enfants sont également incluses dans LiveCopy
.LiveCopy
est créé chaque fois que Créer un site ou Créer une Live Copy est utilisé.Les objets LiveStatus
donnent accès à l’état d’exécution d’une LiveRelationship
. Permet d’interroger l’état de synchronisation d’une Live Copy.
LiveAction
est une action exécutée sur chaque ressource impliquée dans le déploiement.
LiveActionFactory
crée LiveAction
des objets en fonction d’une LiveAction
configuration. Les configurations sont stockées en tant que ressources dans le référentiel.
RolloutConfig
contient une liste de LiveActions
, à utiliser lors du déclenchement. Le LiveCopy
hérite du RolloutConfig
et le résultat est présent dans le LiveRelationship
.
Créez des actions de synchronisation personnalisées à utiliser avec vos configurations de déploiement. Créez une action de synchronisation lorsque les actions installées ne répondent pas aux exigences spécifiques de votre application. Pour ce faire, créez deux classes :
com.day.cq.wcm.msm.api.LiveAction
qui exécute l'action.com.day.cq.wcm.msm.api.LiveActionFactory
et crée des instances de votre classe LiveAction
.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 qui sert à la désigner, par exemple, dans les configurations de déploiement.
execute
: réalise les tâches de l’action.Les classes LiveActionFactory
incluent les méthodes suivantes :
LIVE_ACTION_NAME
: Champ contenant le nom du champ associé LiveAction
. Ce nom doit coïncider avec la valeur renvoyée par la méthode getName
de la classe LiveAction
.createAction
: Crée une instance du LiveAction
. Le paramètre facultatif Resource
peut être utilisé pour fournir des informations de configuration.createsAction
: Renvoie le nom de l’élément 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, une 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
. Cet objet Resource
représente le nœud cq:LiveSyncAction
pour cette LiveAction dans la configuration du déploiement. Voir Création d’une configuration de déploiement. 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
:
Un objet Resource
représentant la source de la Live Copy.
Un objet Resource
représentant la cible de la Live Copy.
Objet LiveRelationship
pour la Live Copy.
La valeur autoSave
indique si votre LiveAction
doit enregistrer les modifications apportées au référentiel.
La valeur reset indique le mode de réinitialisation du déploiement.
À partir de ces objets, vous pouvez obtenir toutes les informations sur la 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
.
Créez une configuration de déploiement lorsque celles installées ne répondent pas aux exigences de votre application :
La nouvelle configuration de déploiement est disponible quand vous définissez des configurations de déploiement sur une page Plan directeur ou Live Copy.
Voir aussi les bonnes pratiques de personnalisation des déploiements.
Pour créer une configuration de déploiement :
CRXDE Lite ouvert ; par exemple :
http://localhost:4502/crx/de
Accédez à :
/apps/msm/<your-project>/rolloutconfigs
Il s'agit de la version personnalisée de votre projet de :
/libs/msm/wcm/rolloutconfigs
Doit être créé s’il s’agit de votre première configuration.
Vous ne devez rien modifier dans le chemin /libs.
En effet, le contenu de /libs est remplacé dès que vous mettez à niveau votre instance (et risque de l’être si vous appliquez un correctif ou un Feature Pack).
La méthode recommandée pour la configuration et d’autres modifications est la suivante :
Sous cette Créer 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 : Titre identifiant qui apparaîtra dans l’interface utilisateur.
Nom : jcr:description
Type : String
Valeur : Description facultative.
Nom : cq:trigger
Type : String
Valeur : Le Déclencheur de déploiement à utiliser. Faites un choix parmi
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 noeud /apps/msm/<your-project>/rolloutconfigs
.
Ajoutez des noeuds 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.
Toujours en CRXDE Lite, sélectionnez votre noeud Configuration de déploiement.
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 nœuds d’action de synchronisation que vous le souhaitez. Réorganisez les nœuds d’action afin que leur ordre corresponde à celui dans lequel vous souhaitez qu’ils se produisent. Le nœud d’action le plus haut se produit en premier.
Cliquez sur Enregistrer tout.
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
et déployez le bundle OSGi.Le projet Maven et le code source de la classe Java sont disponibles dans le référentiel Git public.
CODE SUR GITHUB
Vous pouvez trouver le code de cette page sur GitHub.
La procédure suivante requiert l’ajout préalable du profil adobe-public à votre fichier de paramètres Maven.
Ouvrez une session de terminal ou de ligne de commande et modifiez le répertoire de manière à ce qu’il pointe vers l’emplacement de création du projet.
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
Lancez 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
.
Depuis l’explorateur de projet Eclipse, ouvrez le fichier :
MyLiveActionFactory/pom.xml
Dans l’éditeur, cliquez sur l’onglet pom.xml
et recherchez 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 Project Explorer à 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 dependencies, 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 l’action en direct est exampleLiveAction
.
Dans l'Explorateur de projets Eclipse, cliquez avec le bouton droit sur le package MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
et cliquez sur New > Class. 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
Le fichier AEM error.log
doit indiquer que le bundle est démarré.
Par exemple, 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]
Créez la configuration de déploiement MSM qui utilise la LiveActionFactory
que vous avez créée :
Créez une configuration de déploiement selon la procédure standard et à l’aide des propriétés :
publish
Configurez la configuration de déploiement que vous avez créée lors de la procédure précédente afin qu'elle utilise la classe ExampleLiveActionFactory
.
Ouvrez CRXDE Lite, par exemple http://localhost:4502/crx/de
Créez le noeud suivant sous /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Cliquez sur Enregistrer tout.
Sélectionnez le nœud exampleLiveAction
et ajoutez la propriété suivante :
repLastModBy
Boolean
true
Cette propriété indique à la classe ExampleLiveAction
que la propriété cq:LastModifiedBy
doit être répliquée de la source vers le nœud cible.
Cliquez sur Enregistrer tout.
Créez une Live Copy de la branche English/Products du site de référence We.Retail en utilisant votre configuration de déploiement :
Source : /content/we-retail/language-masters/en/products
Configuration du déploiement : Exemple de configuration de déploiement
Activez la page Products (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 de codes de langue et de pays par défaut.
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. Vous pouvez modifier les aspects suivants de la liste si nécessaire :
en
, de
, entre autres)La liste de langue est stockée sous le noeud /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 (tel que en
ou de
) ou le code langue_pays (tel que 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 du noeud se compose uniquement d’un code de langue (tel que en
), la propriété country est *
et une autre propriété defaultCountry
stocke le code du pays de langue pour indiquer le pays à utiliser.
Pour modifier les langues :
Ouvrez CRXDE Lite dans votre navigateur web, par exemple http://localhost:4502/crx/de
Sélectionnez le dossier /apps
, puis cliquez sur Créer, puis 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éez un noeud de type sling:Folder
dans le noyau appelé resources
.
Cliquez avec le bouton droit sur le noeud /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. Depuis cette console, cliquez sur OSGi, puis sur Configuration.
Recherchez Day CQ WCM Language Manager et cliquez sur Day CQ WCM Language Manager<a1/>, puis modifiez la valeur de <a2/>Language Liste en /apps/wcm/core/resources/languages
, puis cliquez sur Enregistrer.
Lors de la création d’une propriété de page personnalisée, il faut parfois déterminer si la nouvelle propriété doit pouvoir être déployée sur des Live Copy.
Par exemple, si deux nouvelles propriétés de page sont ajoutées :
Contact Email :
Key Visual Style :
Ensuite, vous devez vous assurer que :
Contact Email :
Key Visual Style :
Le fait qu’une propriété de page puisse être déployée et, par conséquent, soumise à l’annulation/au rétablissement de l’héritage lors de sa modification, est contrôlé par la propriété de la boîte de dialogue :
cq-msm-lockable
s’applique aux éléments d’une boîte de dialogue de l’IU tactile
crée le symbole de chaînage dans la boîte de dialogue
n’autorise la modification que si l’héritage est annulé (le chaînage est rompu)
s'applique uniquement au premier niveau enfant de la ressource
Type : String
Valeur : détient le nom du bien à l'étude (et est comparable à la valeur du bien 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 MSM de la façon suivante :
si la valeur de cq-msm-lockable
est :
Relatif (par ex. myProperty
ou ./myProperty
)
cq:propertyInheritanceCancelled
.Absolu (ex. /image
)
cq:LiveSyncCancelled
à ./image
et en définissant cq:isCancelledForChildren
à true
.cq-msm-lockable s'applique au premier niveau enfant de la ressource à modifier et ne fonctionne pas sur un ancêtre de 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 cela est nécessaire.