Este documento le ayuda a comprender cómo ampliar la funcionalidad del Administrador de varios sitios y abarca los siguientes temas.
Esta página es más fácil de entender en el contexto del documento Reutilización del contenido: Administrador de varios sitios.
El Administrador de varios sitios y su API se utilizan al crear un sitio web y, como tal, solo están pensados para su uso en un entorno de creación.
Multi Site Management consta de los siguientes paquetes:
Los objetos de API de MSM principales interactúan de la siguiente manera (consulte también la sección Términos utilizados):
Blueprint
- A Blueprint
(como en configuración de modelo) especifica las páginas desde las que una live copy puede heredar contenido.
El uso de una configuración de modelo ( Blueprint
) es opcional, pero:
LiveRelationship
- El LiveRelationship
especifica la conexión (relación) entre un recurso de la rama de live copy y su recurso de origen/modelo equivalente.
Las relaciones se utilizan para realizar la herencia y el despliegue.
LiveRelationship
Los objetos de proporcionan acceso (referencias) a las configuraciones de despliegue ( RolloutConfig
), LiveCopy
, y LiveStatus
objetos relacionados con la relación.
Por ejemplo, se crea una Live Copy en /content/copy/us
desde el origen/modelo en /content/wknd/language-masters
. Los recursos /content/wknd/language-masters/en/jcr:content
y /content/copy/us/en/jcr:content
formar una relación.
LiveCopy
- A LiveCopy
contiene los detalles de configuración de las relaciones (LiveRelationship
) entre los recursos de live copy y sus recursos de origen/modelo.
Utilice el LiveCopy
para acceder a la ruta de la página, la ruta de la página de origen/modelo, las configuraciones de despliegue y si las páginas secundarias también se incluyen en la LiveCopy
.
A LiveCopy
El nodo se crea cada vez que Crear sitio o Crear Live Copy se utiliza.
LiveStatus
- LiveStatus
proporcionan acceso al estado de tiempo de ejecución de un objeto LiveRelationship
. Se utiliza para consultar el estado de sincronización de una Live Copy.
LiveAction
- A LiveAction
es una acción que se ejecuta en cada recurso implicado en el despliegue.
LiveAction
Las solo se generan mediante RolloutConfig
s.LiveActionFactory
- A LiveActionFactory
crea LiveAction
objetos dados a LiveAction
configuración. Las configuraciones se almacenan como recursos en el repositorio.
RolloutConfig
- El RolloutConfig
contiene una lista de LiveActions
, que se utilizará cuando se active. El LiveCopy
hereda el RolloutConfig
y el resultado está presente en la variable LiveRelationship
.
RolloutConfig
(que déclencheur el LiveAction
s).Puede crear acciones de sincronización personalizadas para utilizarlas con las configuraciones de despliegue. Esto puede resultar útil cuando la variable acciones instaladas no cumplen los requisitos específicos de su aplicación.
Para ello, cree dos clases:
com.day.cq.wcm.msm.api.LiveAction
que realiza la acción.com.day.cq.wcm.msm.api.LiveActionFactory
y crea instancias de su LiveAction
claseEl LiveActionFactory
crea instancias del LiveAction
para una configuración determinada:
LiveAction
Las clases incluyen los métodos siguientes:
getName
- Devuelve el nombre de la acción
execute
- Realiza las tareas de la acción
LiveActionFactory
Las clases incluyen los siguientes miembros:
LIVE_ACTION_NAME
- Un campo que contiene el nombre del asociado LiveAction
getName
método del LiveAction
clase.createAction
: crea una instancia de LiveAction
Resource
se puede utilizar para proporcionar información de configuración.createsAction
- Devuelve el nombre del asociado LiveAction
Utilice el LiveAction
nodo de configuración en el repositorio para almacenar información que afecta al comportamiento en tiempo de ejecución del LiveAction
ejemplo. El nodo en el repositorio que almacena el LiveAction
La configuración de está disponible para LiveActionFactory
durante la ejecución. Por lo tanto, puede agregar propiedades al nodo de configuración a y utilizarlas en su LiveActionFactory
según sea necesario.
Por ejemplo, una LiveAction
debe almacenar el nombre del autor del modelo. Una propiedad del nodo de configuración incluye el nombre de la propiedad de la página de modelo que almacena la información. En tiempo de ejecución, la variable LiveAction
recupera el nombre de propiedad de la configuración y, a continuación, obtiene el valor de propiedad.
El parámetro del LiveActionFactory.createAction
El método es un Resource
objeto. Esta Resource
representa el objeto cq:LiveSyncAction
para esta acción activa en la configuración de despliegue.
Consulte Creación de una configuración de despliegue para obtener más información.
Como de costumbre, al utilizar un nodo de configuración, debe adaptarlo a un ValueMap
objeto:
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);
}
Los siguientes objetos se proporcionan como parámetros del execute
método del LiveAction
objeto:
Resource
objeto que representa el origen de live copyResource
que representa el destino de live copy.LiveRelationship
objeto para live copy
autoSave
indica si su LiveAction
debe guardar los cambios realizados en el repositorioreset
Este valor indica el modo de restablecimiento del despliegue.A partir de estos objetos, puede obtener información sobre LiveCopy
. También puede utilizar la variable Resource
objetos que obtener ResourceResolver
, Session
, y Node
objetos. Estos objetos son útiles para manipular el contenido del repositorio:
En la primera línea del siguiente código, el origen es el Resource
objeto de la página de origen:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
El Resource
los argumentos pueden ser null
o Resources
objetos que no se adaptan a Node
objetos, como NonExistingResource
objetos.
Puede crear una configuración de despliegue cuando las configuraciones de despliegue instaladas no cumplan con los requisitos de la aplicación. Siga estos dos pasos:
La nueva configuración de despliegue está disponible al establecer configuraciones de despliegue en una página de modelo o Live Copy.
Consulte también la prácticas recomendadas para personalizar despliegues.
Para crear una configuración de despliegue:
Abrir CRXDE Lite en https://<host>:<port>/crx/de
.
Vaya a /apps/msm/<your-project>/rolloutconfigs
, la versión personalizada del proyecto de /libs/msm/wcm/rolloutconfigs
.
/libs
La rama debe utilizarse como plantilla para crear la nueva rama en /apps
.En esta ubicación, cree un nodo con las siguientes propiedades:
contentCopy
o workflow
cq:RolloutConfig
Agregue las siguientes propiedades a este nodo:
Nombre: jcr:title
Tipo: String
Valor: un título de identificación que aparecerá en la interfaz de usuario
Nombre: jcr:description
Tipo: String
Valor: una descripción opcional.
Nombre: cq:trigger
Tipo: String
Valor: La Desplegar Déclencheur para utilizar
rollout
modification
publish
deactivate
Haga clic en Guardar todo.
Las configuraciones de despliegue se almacenan debajo de nodo de configuración de despliegue que ha creado en la variable /apps/msm/<your-project>/rolloutconfigs
nodo.
Agregar nodos secundarios de tipo cq:LiveSyncAction
para agregar acciones de sincronización a la configuración de lanzamiento. El orden de los nodos de acción de sincronización determina el orden en que se producen las acciones.
En CRXDE Lite, seleccione su Configuración de despliegue nodo, por ejemplo /apps/msm/myproject/rolloutconfigs/myrolloutconfig
.
Cree un nodo con las siguientes propiedades de nodo:
contentCopy
o workflow
.cq:LiveSyncAction
Añada y configure tantos nodos de acción de sincronización como sea necesario.
Reorganice los nodos de acción para que su orden coincida con el orden en que desea que se produzcan.
Siga los procedimientos de esta sección para desarrollar una LiveActionFactory
y utilizarlo en una configuración de despliegue. Los procedimientos utilizan Maven y Eclipse para desarrollar e implementar el LiveActionFactory
:
LiveActionFactory
interfaz e implemente el paquete OSGi.Proyecto Maven y código fuente de la clase Java está disponible en el repositorio Git público.
El siguiente procedimiento requiere que haya agregado la variable adobe-public
al archivo de configuración de Maven.
Abra una sesión de terminal o de línea de comandos y cambie el directorio para que apunte a la ubicación de donde crear el proyecto.
Introduzca el siguiente comando:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Especifique los siguientes valores en la solicitud interactiva:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Iniciar Eclipse y Importe el proyecto Maven.
Agregue dependencias para que el compilador Eclipse pueda hacer referencia a las clases que se utilizan en el LiveActionFactory
código.
En el Explorador del proyecto Eclipse, abra el archivo MyLiveActionFactory/pom.xml
.
En el editor, haga clic en pom.xml
y busque la pestaña project/dependencyManagement/dependencies
sección.
Agregue el siguiente XML dentro de la variable dependencyManagement
y, a continuación, guarde el archivo.
<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>
Abra el archivo POM para el paquete desde Explorador de proyectos en MyLiveActionFactory-bundle/pom.xml
.
En el editor, haga clic en pom.xml
y busque la sección proyecto/dependencias. Agregue el siguiente XML dentro del elemento dependencies y, a continuación, guarde el archivo:
<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>
Lo siguiente LiveActionFactory
clase implementa un LiveAction
que registra mensajes sobre las páginas de origen y destino y copia el cq:lastModifiedBy
del nodo de origen al nodo de destino. El nombre de la acción activa es exampleLiveAction
.
En el Explorador del proyecto Eclipse, haga clic con el botón secundario en MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
paquete y haga clic en Nuevo > Clase.
Para el Nombre, introduzca ExampleLiveActionFactory
y luego haga clic en Finalizar.
Abra el ExampleLiveActionFactory.java
, reemplace el contenido por el siguiente código y guarde el archivo.
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 {
}
}
}
Con el terminal o la sesión de comandos, cambie el directorio a MyLiveActionFactory
(el directorio del proyecto Maven). A continuación, introduzca el siguiente comando:
mvn -PautoInstallPackage clean install
AEM El error.log
debe indicar que el paquete está iniciado, visible en los registros en 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]
Cree la configuración de despliegue de MSM que utiliza el LiveActionFactory
que ha creado:
Creación y configuración de un Configuración de despliegue con el procedimiento estándar uso de las propiedades:
publish
Configure la configuración de despliegue que creó en el procedimiento anterior para que utilice el ExampleLiveActionFactory
clase.
Abra CRXDE Lite.
Cree el siguiente nodo en /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Haga clic en Guardar todo.
Seleccione el exampleLiveAction
y agregue una propiedad para indicar a ExampleLiveAction
que el cq:LastModifiedBy
La propiedad debe replicarse desde el nodo de origen al nodo de destino.
repLastModBy
Boolean
true
Haga clic en Guardar todo.
Creación de una Live Copy de la rama Inglés/Productos del sitio de referencia de WKND con la configuración de despliegue:
Origen: /content/wknd/language-masters/en/products
Configuración de despliegue: Configuración de despliegue de ejemplo
Activar el Productos (inglés) de la rama de origen y observe los mensajes de registro que la variable LiveAction
La clase 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 ***
AEM utiliza un conjunto predeterminado de códigos de idioma y país.
MSM utiliza una lista almacenada de códigos de idioma y país para determinar el nombre del país asociado al nombre de la versión de idioma de la página. Si es necesario, puede cambiar los siguientes aspectos de la lista:
en
, de
, entre otros)La lista de idiomas se almacena debajo de /libs/wcm/core/resources/languages
nodo. Cada nodo secundario representa un idioma o un idioma-país:
El nombre del nodo es el código de idioma (como en
o de
) o el código language_country (por ejemplo, en_us
o de_ch
).
El language
La propiedad del nodo almacena el nombre completo del idioma del código.
El country
La propiedad del nodo almacena el nombre completo del país para el código.
Cuando el nombre del nodo solo consta de un código de idioma (como en
), la propiedad del país es *
y un adicional de defaultCountry
La propiedad almacena el código del idioma-país para indicar el país que se va a utilizar.
Para modificar los idiomas:
Abra CRXDE Lite.
Seleccione el /apps
y haga clic en Crear, entonces Crear carpeta.
Asigne un nombre a la nueva carpeta wcm
.
Repita el paso anterior para crear el /apps/wcm/core
árbol de carpetas. Creación de un nodo de tipo sling:Folder
in core
llamado resources
.
Haga clic con el botón derecho en /libs/wcm/core/resources/languages
y haga clic en Copiar.
Haga clic con el botón derecho en /apps/wcm/core/resources
y haga clic en Pegar. Modifique los nodos secundarios según sea necesario.
Haga clic en Guardar todo.
Clic Herramientas, Operaciones entonces Consola web. Desde esta consola, haga clic en OSGi, entonces Configuración.
Busque y haga clic en Administrador de idiomas de CQ WCM por día y cambie el valor de Lista de idiomas hasta /apps/wcm/core/resources/languages
, luego haga clic en Guardar.
Al crear una propiedad de página personalizada, es posible que tenga que considerar si la nueva propiedad debe cumplir los requisitos para su despliegue en cualquier Live Copy.
Por ejemplo, si se agregan dos propiedades de página nuevas:
Correo electrónico de contacto:
Estilo visual clave:
A continuación, debe asegurarse de que:
Correo electrónico de contacto:
Estilo visual clave:
La propiedad dialog controla si una propiedad de página está sujeta a despliegue y, por lo tanto, a cancelación o restablecimiento de la herencia al editar:
cq-msm-lockable
String
name
Por ejemplo, consulte
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Cuándo cq-msm-lockable
se ha definido, romper/cerrar la cadena interactuará con MSM de la siguiente manera:
Si el valor de cq-msm-lockable
es:
Relativo (por ejemplo, myProperty
o ./myProperty
)
cq:propertyInheritanceCancelled
.Absoluto (por ejemplo, /image
)
Si se interrumpe la cadena, se cancelará la herencia añadiendo cq:LiveSyncCancelled
mixin a ./image
y configuración cq:isCancelledForChildren
hasta true
.
Al cerrar la cadena, se revertirá la herencia.
cq-msm-lockable
se aplica al primer nivel secundario del recurso que se va a editar y no funciona en ningún antecesor de nivel más profundo, independientemente de si el valor se define como absoluto o relativo.
Al volver a habilitar la herencia, la propiedad de página Live Copy no se sincroniza automáticamente con la propiedad de origen. Puede solicitar manualmente una sincronización si es necesario.