Sobreposições overlays
O Adobe Experience Manager (AEM) — e, antes disso, o CQ — há muito tempo usa o princípio de sobreposições para permitir que você estenda e personalize os consoles e outras funcionalidades (por exemplo, criação de página).
Sobreposição é um termo usado em muitos contextos. Nesse contexto (extensão do AEM), uma sobreposição significa usar a funcionalidade predefinida e impor suas próprias definições sobre ela (para personalizar a funcionalidade padrão).
Em uma instância padrão, a funcionalidade predefinida é mantida em /libs
e é prática recomendada definir sua sobreposição (personalizações) na ramificação /apps
. O AEM usa um caminho de pesquisa para localizar um recurso, pesquisando primeiro a ramificação /apps
e depois a ramificação /libs
(o caminho de pesquisa pode ser configurado). Esse mecanismo significa que sua sobreposição (e as personalizações definidas lá) tem prioridade.
Desde o AEM 6.0, foram feitas alterações no modo como as sobreposições são implementadas e usadas:
-
AEM 6.0 e posterior - para sobreposições relacionadas ao Granite (ou seja, a interface habilitada para toque)
-
Método
-
Reconstruir a estrutura
/libs
apropriada em/apps
.Isso não requer uma cópia 1:1. O Sling Resource Merger é usado para fazer referência cruzada das definições originais necessárias. O Sling Resource Merger fornece serviços para acessar e mesclar recursos com mecanismos de diferenciação.
-
Em
/apps
, faça as alterações.
-
-
Vantagens
- Mais robusto para alterações em
/libs
. - Apenas redefina o que é necessário.
- Mais robusto para alterações em
-
-
Sobreposições não-Granite e sobreposições antes do AEM 6.0
-
Método
-
Copiar o conteúdo de
/libs
para/apps
Copie a subramificação inteira, incluindo as propriedades.
-
Em
/apps
, faça as alterações.
-
-
Desvantagens
- Embora as alterações não sejam perdidas quando algo for alterado em
/libs
, talvez seja necessário recriar determinadas alterações que ocorrem na sobreposição em/apps
.
- Embora as alterações não sejam perdidas quando algo for alterado em
-
Sobreposições são o método recomendado para muitas alterações, como configurar seus consoles ou criar a categoria de seleção para o navegador de ativos no painel lateral (usado ao criar páginas). Elas são necessárias como:
-
Não fazer alterações na
/libs
ramificação As alterações feitas podem ser perdidas, pois essa ramificação pode sofrer alterações sempre que você:- atualizar na sua instância
- aplicar um hotfix
- instalar um pacote de recursos
-
Eles concentram as alterações em um local, facilitando o rastreamento, a migração, o backup ou a depuração de alterações, conforme necessário.
Configurar os caminhos de pesquisa configuring-the-search-paths
Para sobreposições, o recurso entregue é uma agregação dos recursos e propriedades recuperados, dependendo dos caminhos de pesquisa que podem ser definidos:
-
O recurso Caminho de Pesquisa do Resolvedor conforme definido na configuração OSGi para a Fábrica do Resolvedor de Recursos Apache Sling.
- A ordem de cima para baixo dos caminhos de pesquisa indica suas respectivas prioridades.
- Em uma instalação padrão, os padrões primários são
/apps
,/libs
- portanto, o conteúdo de/apps
tem uma prioridade mais alta do que a de/libs
(isto é, ele sobreposições).
-
Dois usuários de serviço precisam de acesso JCR:READ ao local em que os scripts são armazenados. Esses usuários são: components-search-service (usado pelo com.day.cq.wcm.coto access/cache components) e sling-scripting (usado por org.apache.sling.servlets.resolver para localizar servlets).
-
A configuração a seguir também deve ser configurada de acordo com o local onde você coloca os scripts (neste exemplo, em /etc, /libs ou /apps).
code language-none PID = org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl resource.resolver.searchpath=["/etc","/apps","/libs"] resource.resolver.vanitypath.whitelist=["/etc/","/apps/","/libs/","/content/"]
-
Finalmente, o Resolvedor de Servlet também deve ser configurado (neste exemplo, para adicionar /etc também)
code language-none PID = org.apache.sling.servlets.resolver.SlingServletResolver servletresolver.paths=["/bin/","/libs/","/apps/","/etc/","/system/","/index.servlet","/login.servlet","/services/"]
Exemplo de uso example-of-usage
Alguns exemplos são abordados quando: