Esta página le ayuda a ampliar las funcionalidades del Administrador de múltiples sitios:
Esta página debe leerse junto con:
El Administrador de varios sitios y su API se utilizan al crear un sitio web, por lo que solo están pensados para utilizarse en un entorno de creación.
La Administración de varios sitios consiste en los siguientes paquetes:
Los objetos principales de la API de MSM interactúan de la siguiente manera (consulte también Términos utilizados):
Blueprint
Un Blueprint
(como en la 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 Live Copy y su recurso de origen/modelo equivalente.
LiveRelationship
los objetos proporcionan acceso (referencias) a las configuraciones de despliegue ( RolloutConfig
) LiveCopy
y a LiveStatus
los objetos relacionados con la relación./content/copy/us
desde el origen/modelo en /content/we-retail/language-masters
. Los recursos /content/we.retail/language-masters/en/jcr:content
y /content/copy/us/en/jcr:content
forman una relación.LiveCopy
contiene los detalles de configuración de las relaciones ( LiveRelationship
) entre los recursos de Live Copy y sus recursos de origen/modelo.
LiveCopy
para acceder a la ruta de la página, la ruta de la página de origen/modelo, las configuraciones de implementación y si las páginas secundarias también se incluyen en LiveCopy
.LiveCopy
cada vez que se utiliza Crear sitio o Crear Live Copy.LiveStatus
los objetos proporcionan acceso al estado de tiempo de ejecución de un LiveRelationship
. Se utiliza para consulta del estado de sincronización de una Live Copy.
LiveAction
es una acción que se ejecuta en cada recurso que participa en la implementación.
LiveActionFactory
crea LiveAction
objetos a partir de una LiveAction
configuración. Las configuraciones se almacenan como recursos en el repositorio.
RolloutConfig
contiene una lista de LiveActions
, que se utilizará cuando se active. El LiveCopy
hereda el RolloutConfig
y el resultado está presente en el LiveRelationship
.
Cree acciones de sincronización personalizadas para utilizarlas con las configuraciones de despliegue. Cree una acción de sincronización cuando las acciones instaladas no cumplan los requisitos específicos de la 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 la clase LiveAction
.El LiveActionFactory
crea instancias de la clase LiveAction
para una configuración determinada:
LiveAction
las clases incluyen los siguientes métodos:
getName
:: Devuelve el nombre de la acción. El nombre se utiliza para hacer referencia a la acción, por ejemplo, en las configuraciones de despliegue.
execute
:: Realiza las tareas de la acción.LiveActionFactory
las clases incluyen los siguientes miembros:
LIVE_ACTION_NAME
:: Campo que contiene el nombre del LiveAction
. Este nombre debe coincidir con el valor devuelto por el método getName
de la clase LiveAction
.createAction
:: Crea una instancia del LiveAction
. El parámetro opcional Resource
puede utilizarse para proporcionar información de configuración.createsAction
:: Devuelve el nombre del LiveAction
.Utilice el nodo de configuración LiveAction
del repositorio para almacenar información que afecta al comportamiento de tiempo de ejecución de la instancia LiveAction
. El nodo del repositorio que almacena la configuración LiveAction
está disponible para el objeto LiveActionFactory
durante la ejecución. Por lo tanto, puede agregar propiedades al nodo de configuración y usarlas en la implementación LiveActionFactory
según sea necesario.
Por ejemplo, un LiveAction
debe almacenar el nombre del autor del modelo. Una propiedad del nodo de configuración incluye el nombre de propiedad de la página de modelo que almacena la información. En tiempo de ejecución, LiveAction
recupera el nombre de la propiedad de la configuración y, a continuación, obtiene el valor de la propiedad.
El parámetro del método LiveActionFactory
.createAction
es un objeto Resource
. Este objeto Resource
representa el nodo cq:LiveSyncAction
para esta acción activa en la configuración de despliegue; consulte Creación de una configuración de despliegue. Como de costumbre, al utilizar un nodo de configuración, debe adaptarlo a un objeto 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);
}
Los siguientes objetos se proporcionan como parámetros del método execute
del objeto LiveAction
:
Un objeto Resource
que representa el origen de Live Copy.
Un objeto Resource
que representa el destinatario de Live Copy.
El objeto LiveRelationship
para la Live Copy.
El valor autoSave
indica si su LiveAction
debe guardar los cambios realizados en el repositorio.
El valor reset indica el modo de restablecimiento de la implementación.
Desde estos objetos puede obtener toda la información sobre LiveCopy
. También puede utilizar los objetos Resource
para obtener objetos ResourceResolver
, Session
y Node
. Estos objetos son útiles para manipular el contenido del repositorio:
En la primera línea del código siguiente, el origen es el objeto Resource
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);
Los argumentos Resource
pueden ser objetos null
o Resources
que no se adaptan a objetos Node
, como objetos NonExistingResource
.
Cree una configuración de implementación cuando las configuraciones de implementación instaladas no cumplan los requisitos de la aplicación:
La nueva configuración de lanzamiento estará disponible al establecer las opciones de la misma en una página de Live Copy o modelo.
Consulte también las optimizaciones para personalizar las implementaciones.
Para crear una nueva configuración de implementación:
CRXDE Lite abierto; por ejemplo:
http://localhost:4502/crx/de
Ir a :
/apps/msm/<your-project>/rolloutconfigs
Esta es la versión personalizada de su proyecto de:
/libs/msm/wcm/rolloutconfigs
Debe crearse si esta es la primera configuración.
No debe cambiar nada en la ruta /libs.
Esto se debe a que el contenido de /libs se sobrescribe la próxima vez que actualice la instancia (y es posible que se sobrescriba al aplicar una revisión o un paquete de funciones).
El método recomendado para la configuración y otros cambios es:
Bajo este Crear nodo con las siguientes propiedades:
contentCopy
o workflow
.cq:RolloutConfig
Añada 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: Se utilizará el activador de despliegue. Seleccionar de:
rollout
modification
publish
deactivate
Haga clic en Guardar todo.
Las configuraciones de despliegue se almacenan debajo del nodo de configuración de implementación que ha creado en el nodo /apps/msm/<your-project>/rolloutconfigs
.
Añada nodos secundarios de tipo cq:LiveSyncAction
para agregar acciones de sincronización a la configuración de implementación. El orden de los nodos de acción de sincronización determina el orden en que se producen las acciones.
Todavía en CRXDE Lite, seleccione su nodo Configuración de despliegue.
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 necesite. Reorganice los nodos de acción para que su orden coincida con el orden en que desea que se produzcan. El nodo de acción superior se produce primero.
Haga clic en Guardar todo.
Siga los procedimientos de esta sección para desarrollar un LiveActionFactory
y utilizarlo en una configuración de implementación. Los procedimientos utilizan Maven y Eclipse para desarrollar e implementar el LiveActionFactory
:
LiveActionFactory
interfaz e implemente el paquete OSGi.El proyecto Maven y el código fuente de la clase Java están disponibles en el repositorio Git público.
CÓDIGO DE GITHUB
Puede encontrar el código de esta página en GitHub
El siguiente procedimiento requiere que haya agregado el perfil adobe-public al archivo de configuración Maven.
Abra una sesión de terminal o de línea de comandos y cambie el directorio para que señale la ubicación de dónde desea 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 el mensaje interactivo:
groupId
: com.adobe.example.msm
artifactId
:: MyLiveActionFactory
version
:: 1.0-SNAPSHOT
package
:: MyPackage
appsFolderName
:: myapp
artifactName
:: MyLiveActionFactory package
packageGroup
:: myPackages
Eclipse de inicio e importe el proyecto Maven.
Añada dependencias para que el compilador Eclipse pueda hacer referencia a las clases que se utilizan en el código LiveActionFactory
.
En el Explorador de proyectos de Eclipse, abra el archivo:
MyLiveActionFactory/pom.xml
En el editor, haga clic en la ficha pom.xml
y busque la sección project/dependencyManagement/dependencies
.
Añada el siguiente XML dentro del elemento dependencyManagement
y 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 la ficha pom.xml
y localice la sección proyecto/dependencias. Añada el siguiente XML dentro del elemento dependencias 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>
La siguiente clase LiveActionFactory
implementa un LiveAction
que registra mensajes sobre las páginas de origen y destinatario y copia la propiedad cq:lastModifiedBy
desde el nodo de origen al nodo de destinatario. El nombre de la acción activa es exampleLiveAction
.
En el Explorador de proyectos de Eclipse, haga clic con el botón derecho en el paquete MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
y haga clic en Nuevo > Clase. Para el Nombre, introduzca ExampleLiveActionFactory
y haga clic en Finalizar.
Abra el archivo 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 {
}
}
}
Mediante la sesión de terminal o comando, cambie el directorio al directorio MyLiveActionFactory
(el directorio del proyecto Maven). A continuación, introduzca el siguiente comando:
mvn -PautoInstallPackage clean install
El archivo AEM error.log
debe indicar que se ha iniciado el paquete.
Por ejemplo, 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]
Cree la configuración de implementación MSM que utiliza el LiveActionFactory
que ha creado:
Cree y configure una Configuración de despliegue con el procedimiento estándar y con las propiedades:
publish
Configure la configuración de implementación que creó en el procedimiento anterior para que utilice la clase ExampleLiveActionFactory
.
CRXDE Lite abierto; por ejemplo, http://localhost:4502/crx/de.
Cree el nodo siguiente en /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Haga clic en Guardar todo.
Seleccione el nodo exampleLiveAction
y agregue la siguiente propiedad:
repLastModBy
Boolean
true
Esta propiedad indica a la clase ExampleLiveAction
que la propiedad cq:LastModifiedBy
debe replicarse del origen al nodo destinatario.
Haga clic en Guardar todo.
Cree una copia en directo de la rama de inglés/productos del sitio de referencia de We.Retail con la configuración de implementación:
Fuente: /content/we-retail/language-masters/en/products
Configuración de despliegue: Ejemplo de configuración de despliegue
Active la página Productos (en inglés) de la rama de origen y observe los mensajes de registro que genera la clase 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 utiliza un conjunto predeterminado de códigos de idioma y de país.
MSM utiliza una lista almacenada de códigos de idioma y de 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 idioma se almacena debajo del nodo /libs/wcm/core/resources/languages
. Cada nodo secundario representa un idioma o un país de idioma:
El nombre del nodo es el código de idioma (como en
o de
) o el código de idioma_país (como en_us
o de_ch
).
La propiedad language
del nodo almacena el nombre completo del idioma para el código.
La propiedad country
del nodo almacena el nombre completo del país para el código.
Cuando el nombre del nodo sólo consta de un código de idioma (como en
), la propiedad country es *
y una propiedad defaultCountry
adicional almacena el código del país de idioma para indicar el país que se va a utilizar.
Para modificar los idiomas:
Abra el CRXDE Lite en el navegador web; por ejemplo, http://localhost:4502/crx/de
Seleccione la carpeta /apps
y haga clic en Crear, luego en Crear carpeta.
Asigne un nombre a la nueva carpeta wcm
.
Repita el paso anterior para crear el árbol de carpetas /apps/wcm/core
. Cree un nodo de tipo sling:Folder
en el núcleo denominado resources
.
Haga clic con el botón derecho en el nodo /libs/wcm/core/resources/languages
y haga clic en Copiar.
Haga clic con el botón secundario en la carpeta /apps/wcm/core/resources
y haga clic en Pegar. Modifique los nodos secundarios según sea necesario.
Haga clic en Guardar todo.
Haga clic en Herramientas, Operaciones y luego en Consola Web. Desde esta consola, haga clic en OSGi y luego Configuración.
Busque y haga clic en Day CQ WCM Language Manager, cambie el valor de Lista de idioma a /apps/wcm/core/resources/languages
y, a continuación, haga clic en Guardar.
Al crear una propiedad de página personalizada, es posible que tenga que considerar si la nueva propiedad debe ser elegible para la implementación en cualquier copia en vivo.
Por ejemplo, si se agregan dos propiedades de página nuevas:
Correo electrónico de contacto:
Estilo visual clave:
Luego 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 implementación y, por lo tanto, sujeta a cancelación o restablecimiento de herencia al editar:
cq-msm-lockable
se aplica a los elementos de un cuadro de diálogo de IU táctil
creará el símbolo de vínculo de cadena en el cuadro de diálogo
solo permite la edición si se cancela la herencia (el vínculo de cadena está dañado)
solo se aplica al primer nivel secundario del recurso
Tipo: String
Valor: tiene el nombre del bien objeto de examen (y es comparable al valor del bien name
; por ejemplo, consulte
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
Cuando se define cq-msm-lockable
, 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 (p. ej. /image
)
cq:LiveSyncCancelled
a ./image
y estableciendo cq:isCancelledForChildren
en true
.cq-msm bloqueable 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 la página de Live Copy no se sincroniza automáticamente con la propiedad source. Puede solicitar manualmente una sincronización si es necesario.