AEM 6.4 chegou ao fim do suporte estendido e esta documentação não é mais atualizada. Para obter mais detalhes, consulte nossa períodos de assistência técnica. Encontre as versões compatíveis here.
Esta página ajuda a estender as funcionalidades do Gerenciador de vários sites:
Esta página deve ser lida junto com:
O Multi Site Manager e sua API são usados ao criar um site, portanto, são destinados ao uso somente em um ambiente de criação.
O gerenciamento de vários sites consiste nos seguintes pacotes:
Os principais objetos de API MSM interagem da seguinte maneira (consulte também Termos usados):
Blueprint
A Blueprint
(como em configuração do blueprint) especifica as páginas das quais uma live copy pode herdar conteúdo.
O uso de uma configuração do blueprint ( Blueprint
) é opcional, mas:
LiveRelationship
O LiveRelationship
especifica a conexão (relação) entre um recurso na ramificação da live copy e seu recurso equivalente de origem/blueprint.
LiveRelationship
Os objetos fornecem acesso (referências) às configurações de implementação ( RolloutConfig
), LiveCopy
e LiveStatus
objetos relacionados ao relacionamento./content/copy/us
do source/blueprint em /content/we-retail/language-masters
. Os recursos /content/we.retail/language-masters/en/jcr:content
e /content/copy/us/en/jcr:content
formar uma relação.LiveCopy
mantém os detalhes de configuração dos relacionamentos ( LiveRelationship
) entre os recursos de live copy e seus recursos de origem/blueprint.
LiveCopy
classe para acessar o caminho da página, o caminho da página de origem/blueprint, as configurações de implementação e se as páginas filhas também estão incluídas no LiveCopy
.LiveCopy
é criado sempre que o nó é criado Criar Site ou Criar Live Copy é usada.LiveStatus
objetos fornecem acesso ao status de tempo de execução de um LiveRelationship
. Use para consultar o status de sincronização de uma live copy.
LiveAction
é uma ação executada em cada recurso envolvido na implantação.
LiveActionFactory
cria LiveAction
objetos considerando LiveAction
configuração. As configurações são armazenadas como recursos no repositório.
RolloutConfig
contém uma lista de LiveActions
, para ser usado quando acionado. O LiveCopy
herda o RolloutConfig
e o resultado está presente no LiveRelationship
.
Crie ações de sincronização personalizadas para usar com suas configurações de implementação. Crie uma ação de sincronização quando a variável ações instaladas não atenda aos requisitos específicos de seu aplicativo. Para fazer isso, crie duas classes:
com.day.cq.wcm.msm.api.LiveAction
interface que executa a ação.com.day.cq.wcm.msm.api.LiveActionFactory
e cria instâncias de LiveAction
classe .O LiveActionFactory
cria instâncias do LiveAction
classe para uma determinada configuração:
LiveAction
As classes incluem os seguintes métodos:
getName
: Retorna o nome da ação O nome é usado para fazer referência à ação, por exemplo, em configurações de implementação.
execute
: Executa as tarefas da ação.LiveActionFactory
As classes incluem os seguintes membros:
LIVE_ACTION_NAME
: Um campo que contém o nome do LiveAction
. Esse nome deve coincidir com o valor retornado pelo getName
do método LiveAction
classe .createAction
: Cria uma instância do LiveAction
. O Resource
pode ser usado para fornecer informações de configuração.createsAction
: Retorna o nome do LiveAction
.Use o LiveAction
nó de configuração no repositório para armazenar informações que afetam o comportamento em tempo de execução do LiveAction
instância. O nó no repositório que armazena o LiveAction
está disponível para a LiveActionFactory
em tempo de execução. Portanto, você pode adicionar propriedades ao nó de configuração e usá-las em LiveActionFactory
conforme necessário.
Por exemplo, um LiveAction
precisa armazenar o nome do autor do blueprint. Uma propriedade do nó de configuração inclui o nome da propriedade da página do blueprint que armazena as informações. No tempo de execução, a variável LiveAction
recupera o nome da propriedade da configuração e obtém o valor da propriedade.
O parâmetro da variável LiveActionFactory
.createAction
é um método Resource
objeto. Essa Resource
o objeto representa a variável cq:LiveSyncAction
nó para essa ação em tempo real na configuração de implementação; see Criação de uma configuração de implementação. Como de costume, ao usar um nó de configuração, você deve adaptá-lo a um 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);
}
Os seguintes objetos são fornecidos como parâmetros da variável execute
do método LiveAction
objeto:
A Resource
objeto que representa a origem da Live Copy.
A Resource
objeto que representa o destino da Live Copy.
O LiveRelationship
objeto para a live copy.
O autoSave
indica se sua LiveAction
O deve salvar as alterações feitas no repositório.
O valor de redefinição indica o modo de redefinição de implementação.
Nesses objetos, você pode obter todas as informações sobre a variável LiveCopy
. Também é possível usar a variável Resource
objetos a obter ResourceResolver
, Session
e Node
objetos. Esses objetos são úteis para manipular o conteúdo do repositório:
Na primeira linha do código a seguir, source é o Resource
objeto da página de origem:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
O Resource
argumentos podem ser null
ou Resources
objetos que não se adaptam a Node
objetos, como NonExistingResource
objetos.
Crie uma configuração de implementação quando as configurações de implementação instaladas não atenderem aos requisitos do aplicativo:
A nova configuração de implementação estará disponível para você ao definir configurações de implementação em um blueprint ou página de Live Copy.
Consulte também a práticas recomendadas para personalizar implantações.
Para criar uma nova configuração de implementação:
CRXDE Lite aberto; por exemplo:
http://localhost:4502/crx/de
Vá até :
/apps/msm/<your-project>/rolloutconfigs
Esta é a versão personalizada do seu projeto:
/libs/msm/wcm/rolloutconfigs
Deve ser criada se essa for a primeira configuração.
Você não deve alterar nada no caminho /libs.
Isso ocorre porque o conteúdo de /libs é substituído na próxima vez que você atualizar sua instância (e pode ser substituído quando você aplicar um hotfix ou pacote de recursos).
O método recomendado para configuração e outras alterações é:
Nos termos do Criar um nó com as seguintes propriedades:
contentCopy
ou workflow
.cq:RolloutConfig
Adicione as seguintes propriedades a este nó:
Nome: jcr:title
Tipo: String
Valor: Um título de identificação que será exibido na interface do usuário.
Nome: jcr:description
Tipo: String
Valor: Uma descrição opcional.
Nome: cq:trigger
Tipo: String
Valor: O Acionador da implantação a ser usado. Selecione de:
rollout
modification
publish
deactivate
Clique em Salvar tudo.
As configurações de implementação são armazenadas abaixo da variável nó de configuração de implementação que você criou em /apps/msm/<your-project>/rolloutconfigs
nó .
Adicionar nós filhos do tipo cq:LiveSyncAction
para adicionar ações de sincronização à configuração de implementação. A ordem dos nós de ação de sincronização determina a ordem em que as ações ocorrem.
Ainda no CRXDE Lite, selecione o Configuração de implantação nó .
Por exemplo:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
Criar um nó com as seguintes propriedades de nó:
contentCopy
ou workflow
.cq:LiveSyncAction
Adicione e configure quantos nós de ação de sincronização forem necessários. Reorganize os nós de ação para que sua ordem corresponda à ordem em que você deseja que ocorram. O nó de ação mais superior ocorre primeiro.
Clique em Salvar tudo.
Siga os procedimentos desta seção para desenvolver um LiveActionFactory
e usá-lo em uma configuração de implementação. Os procedimentos usam o Maven e o Eclipse para desenvolver e implantar o LiveActionFactory
:
LiveActionFactory
interface e implante o pacote OSGi.O projeto Maven e o código-fonte da classe Java estão disponíveis no repositório Git público.
CÓDIGO NO GITHUB
Você pode encontrar o código desta página no GitHub
O procedimento a seguir requer que você tenha adicionado o perfil público da adobe ao arquivo de configurações Maven.
Abra um terminal ou uma sessão de linha de comando e altere o diretório para apontar para o local de criação do projeto.
Digite o seguinte comando:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
Especifique os seguintes valores no prompt interativo:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
Inicie o Eclipse e importar o projeto Maven.
Adicione dependências para que o compilador do Eclipse possa fazer referência às classes usadas no LiveActionFactory
código.
No Eclipse Project Explorer, abra o arquivo :
MyLiveActionFactory/pom.xml
No editor, clique no botão pom.xml
e localize a project/dependencyManagement/dependencies
seção.
Adicione o XML a seguir dentro do dependencyManagement
e depois salve o arquivo.
<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 o arquivo POM do pacote a partir de Explorador de projetos at MyLiveActionFactory-bundle/pom.xml
.
No editor, clique no botão pom.xml
e localize a seção projeto/dependências . Adicione o seguinte XML dentro do elemento de dependências e salve o arquivo:
<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>
O seguinte LiveActionFactory
classe implementa um LiveAction
que registra mensagens sobre as páginas de origem e de destino e copia a variável cq:lastModifiedBy
propriedade do nó de origem para o nó de destino. O nome da ação ao vivo é exampleLiveAction
.
No Eclipse Project Explorer, clique com o botão direito do mouse no MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
e clique em Novo > Classe. Para o Nome, insira ExampleLiveActionFactory
e, em seguida, clique em Concluir.
Abra o ExampleLiveActionFactory.java
, substitua o conteúdo pelo seguinte código e salve o arquivo.
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 {
}
}
}
Usando o terminal ou a sessão de comando, altere o diretório para MyLiveActionFactory
diretório (o diretório do projeto Maven). Em seguida, digite o seguinte comando:
mvn -PautoInstallPackage clean install
O AEM error.log
deve indicar que o pacote foi iniciado.
Por exemplo, 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]
Crie a configuração de implantação do MSM que usa a variável LiveActionFactory
que você criou:
Criar e configurar um Implementar a configuração com o procedimento padrão - e utilizando as propriedades:
publish
Configure a configuração de implementação criada no procedimento anterior para que ela use a variável ExampleLiveActionFactory
classe .
CRXDE Lite aberto; por exemplo, http://localhost:4502/crx/de.
Crie o seguinte nó em /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
:
exampleLiveAction
cq:LiveSyncAction
Clique em Salvar tudo.
Selecione o exampleLiveAction
e adicione a seguinte propriedade:
repLastModBy
Boolean
true
Essa propriedade indica para a variável ExampleLiveAction
que cq:LastModifiedBy
deve ser replicada da origem para o nó de destino.
Clique em Salvar tudo.
Criar uma live copy da ramificação Inglês/Produtos do site de referência We.Retail usando sua configuração de implementação:
Origem: /content/we-retail/language-masters/en/products
Configuração de implantação: Exemplo de configuração de implementação
Ative o Produtos (inglês) da ramificação de origem e observe as mensagens de log que a variável LiveAction
classe gera:
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 usa um conjunto padrão de códigos de idioma e país.
O MSM usa uma lista armazenada de códigos de idioma e país para determinar o nome do país associado ao nome da versão de idioma da sua página. Você pode alterar os seguintes aspectos da lista, se necessário:
en
, de
, entre outros)A lista de idiomas é armazenada abaixo do /libs/wcm/core/resources/languages
nó . Cada nó filho representa um idioma ou um país de idioma:
O nome do nó é o código do idioma (como en
ou de
) ou o código language_country (como en_us
ou de_ch
).
O language
A propriedade do nó armazena o nome completo do idioma para o código.
O country
A propriedade do nó armazena o nome completo do país para o código.
Quando o nome do nó consiste apenas em um código de idioma (como en
), a propriedade country é *
e um defaultCountry
armazena o código do país do idioma para indicar o país a ser usado.
Para modificar os idiomas:
Abra o CRXDE Lite no navegador da Web; por exemplo, http://localhost:4502/crx/de
Selecione o /apps
e clique em Criar, em seguida Criar pasta.
Dê um nome para a nova pasta wcm
.
Repita a etapa anterior para criar a variável /apps/wcm/core
árvore de pastas. Criar um nó do tipo sling:Folder
no núcleo chamado resources
.
Clique com o botão direito do mouse no /libs/wcm/core/resources/languages
e clique em Copiar.
Clique com o botão direito do mouse no /apps/wcm/core/resources
e clique em Colar. Modifique os nós secundários conforme necessário.
Clique em Salvar tudo.
Clique em Ferramentas, Operações then Console da Web. Nesse console, clique em OSGi, em seguida Configuração.
Localize e clique em Gerenciador de Idioma do Day CQ WCM e alterar o valor de Lista de idiomas para /apps/wcm/core/resources/languages
, depois clique em Salvar.
Ao criar uma propriedade de página personalizada, talvez seja necessário considerar se a nova propriedade deve ser qualificada para implantação em qualquer live copy.
Por exemplo, se duas novas propriedades de página estiverem sendo adicionadas:
Email de contato:
Estilo visual principal:
Em seguida, é necessário garantir que:
Email de contato:
Estilo visual principal:
Se uma propriedade de página está sujeita a implantação e, portanto, sujeita a cancelamento/reintegração da herança ao editar, é controlada pela propriedade de diálogo:
cq-msm-lockable
é aplicável a itens em uma caixa de diálogo da interface habilitada para toque
criará o símbolo de vínculo de cadeia na caixa de diálogo
permite editar somente se a herança for cancelada (o vínculo da cadeia está quebrado)
se aplica somente ao primeiro nível filho do recurso
Tipo: String
Valor: detém o nome da propriedade em consideração (e é comparável ao valor da propriedade name
; por exemplo, consulte
/libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title
When cq-msm-lockable
tiver sido definida, a quebra/fechamento da cadeia interagirá com o MSM da seguinte forma:
se o valor de cq-msm-lockable
é:
Relativo (por exemplo, myProperty
ou ./myProperty
)
cq:propertyInheritanceCancelled
.Absoluto (por exemplo, /image
)
cq:LiveSyncCancelled
mixin to ./image
e configuração cq:isCancelledForChildren
para true
.cq-msm-lockable aplica-se ao primeiro nível filho do recurso a ser editado e não é funcional em nenhum ancestral de nível mais profundo, independentemente se o valor for definido como absoluto ou relativo.
Quando você reativa a herança, a propriedade da página de Live Copy não é sincronizada automaticamente com a propriedade de origem. Você pode solicitar manualmente uma sincronização, se necessário.