Adobe Analytics utilizza la proprietà s.pageName
per identificare in modo univoco le pagine e per associare i dati raccolti per le pagine. In genere, per assegnare un valore a questa proprietà che AEM inviata ad Analytics, vengono eseguite le seguenti operazioni in AEM:
Utilizzate il framework del servizio cloud di Analytics per mappare una variabile CQ alla proprietà Analytics s.pageName
. (Vedere Mappatura dei dati dei componenti con proprietà Adobe Analytics.)
Progettare il componente pagina in modo che includa la variabile CQ mappata sulla proprietà s.pageName
. (Vedere Implementazione tracciamento Adobe Analytics per componenti personalizzati.)
Per esporre i dati dei report di Analytics nella console Siti e in Content Insight, AEM richiede il valore della proprietà s.pageName
per ogni pagina. L'API Java AEM Analytics definisce l'interfaccia AnalyticsPageNameProvider
implementata per fornire alla console Siti e a Content Insights il valore della proprietà s.pageName
. Il servizio AnaltyicsPageNameProvider
risolve la proprietà pageName sul server a scopo di reporting, in quanto può essere impostata in modo dinamico utilizzando Javascript sul client a scopo di tracciamento.
Il servizio DefaultPageNameProvider
è il servizio predefinito che determina il valore della proprietà s.pageName
da utilizzare per il recupero dei dati di Analytics per una pagina. Il servizio funziona insieme al componente AEM pagina di base ( /libs/foundation/components/page
). Questo componente di pagina definisce le seguenti variabili CQ che devono essere mappate sulla proprietà s.pageName
:
pagedata.path
: Il valore è impostato sul percorso della pagina.pagedata.title
: Il valore è impostato sul titolo della pagina.pagedata.navTitle
: Il valore è impostato sul titolo di navigazione della pagina.Il servizio DefaultPageNameProvider
determina quale di queste variabili CQ viene mappata alla proprietà s.pageName
nel framework del servizio cloud di Analytics. Il servizio determina quindi la proprietà pagina appropriata da utilizzare per il recupero dei dati dei report di analisi:
pagedata.path
: Il servizio utilizza page.getPath()
pagedata.title
: Il servizio utilizza page.getTitle()
pagedata.navTitle
: Il servizio utilizza page.getNavigationTitle()
L'oggetto page
è l'oggetto Java com.day.cq.wcm.api.Page
della pagina.
Se non mappate una variabile CQ sulla proprietà s.pageName
nel framework, il valore per s.pageName
viene generato dal percorso della pagina. Ad esempio, la pagina con il percorso /content/geometrixx/en
utilizza il valore content:geometrixx:en
per s.pageName
.
Il servizio DefaultPageNameProvider utilizza una classificazione del servizio pari a 100.
Per mantenere una cronologia completa dei dati di analisi per una pagina è necessario che il valore della proprietà s.pageName utilizzata per una pagina non cambi mai. Tuttavia, le proprietà di analisi definite dal componente pagina di base possono essere facilmente modificate. Ad esempio, spostando una pagina si modifica il valore di pagedata.path
e si interrompe la continuità della cronologia del reporting:
Per garantire la continuità della segnalazione, il valore di s.pageName
deve avere le seguenti caratteristiche:
Ad esempio, un componente pagina personalizzato può includere una proprietà pagina che gli autori utilizzano per specificare un ID univoco per la pagina che viene utilizzata come valore per la proprietà s.pageProperties
:
s.pageProperties
nel framework Analytics.Chiedi aiuto al tuo consulente Analytics per sviluppare una strategia efficace per il tuo s.pageName
valore.
Implementate l'interfaccia com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider
come servizio OSGi per personalizzare la logica che recupera il valore della proprietà s.pageName
. L'analisi delle pagine Siti e Content Insight utilizzano il servizio per recuperare i dati dei report da Analytics.
L'interfaccia AnalyticsPageNameProvider definisce due metodi da implementare:
getPageName
: Restituisce un String
valore che rappresenta il valore da utilizzare come s.pageName
proprietà.
getResource
: Restituisce un org.apache.sling.api.resource.Resource
oggetto che rappresenta la pagina associata alla s.pageName
proprietà.
Entrambi i metodi utilizzano un oggetto com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext
come parametro. La classe AnalyticsPageNameContext
fornisce informazioni sul contesto delle chiamate di analisi:
Framework
per la configurazione del servizio cloud di Analytics.Resource
per la pagina.ResourceResolver
per la pagina.La classe fornisce inoltre un setter per il nome della pagina.
L'implementazione di esempio seguente AnalyticsPageNameProvider
supporta un componente pagina personalizzato:
s.pageName
.jcr:content
delle istanze di pagina.s.pageName
è denominata pagedata.pagename
. Questa proprietà viene mappata sulla proprietà s.pageName
nel framework Analytics.La seguente implementazione del metodo getPageName
restituisce il valore della proprietà node pageName se la mappatura framework è configurata correttamente:
public String getPageName(AnalyticsPageNameContext context) {
String pageName = null;
Framework framework = context.getFramework();
Resource resource = context.getResource();
if (resource != null && framework != null && framework.mapsSCVariable(S_PAGE_NAME)) {
String cqVar = framework.getMapping(S_PAGE_NAME);
Page page = resource.adaptTo(Page.class);
if (cqVar.equals("pagedata.pagename")) {
pageName = page.getProperties().get("pageName",null);
}
}
return pageName;
}
La seguente implementazione del metodo getResource restituisce l'oggetto Resource per la pagina:
public Resource getResource(AnalyticsPageNameContext context) {
Resource res = null;
Framework framework = context.getFramework();
ResourceResolver resolver = context.getResourceResolver();
String pageName = context.getPageName();
String basePath = context.getBasePath();
if (pageName != null && basePath != null && resolver != null
&& framework != null && framework.mapsSCVariable(S_PAGE_NAME)) {
String cqVar = framework.getMapping(S_PAGE_NAME);
if (cqVar.equals("pagedata.pagename")) {
Iterator<Resource>
hits = resolver.findResources(createQuery(pageName, basePath, "pagename"), Query.JCR_SQL2);
if (hits.hasNext()) {
res = hits.next();
res = res.getParent();
}
}
}
return res;
}
private String createQuery(String pageName, String basePath, String propName) {
return "SELECT * FROM [cq:PageContent] WHERE ISDESCENDANTNODE(["
+ basePath + "]) and [" + propName + "] = \"" + pageName + "\"";
}
Il codice seguente rappresenta l'intera classe, incluse le annotazioni SCR che configurano il servizio. La classifica del servizio è 200 e sostituisce il servizio predefinito.
/*************************************************************************
*
* ADOBE CONFIDENTIAL
* __________________
*
* Copyright 2019 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
**************************************************************************/
package com.day.cq.analytics.sitecatalyst;
import java.util.Iterator;
import javax.jcr.query.Query;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext;
import com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider;
import com.day.cq.analytics.sitecatalyst.Framework;
import com.day.cq.wcm.api.Page;
import static com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext.S_PAGE_NAME;
/**
* Default implementation of {@link AnalyticsPageNameProvider} that resolves
* page title, path or navTitle if mapped in {@link Framework}.
*/
@Component(
service = { AnalyticsPageNameProvider.class },
property = {
Constants.SERVICE_DESCRIPTION + "=Example Page Name Resolver implementation",
Constants.SERVICE_RANKING + ":Integer=200"
}
)
public class ExamplePageNameProvider implements AnalyticsPageNameProvider {
public String getPageName(AnalyticsPageNameContext context) {
String pageName = null;
Framework framework = context.getFramework();
Resource resource = context.getResource();
if (resource != null && framework != null && framework.mapsSCVariable(S_PAGE_NAME)) {
String cqVar = framework.getMapping(S_PAGE_NAME);
Page page = resource.adaptTo(Page.class);
if (cqVar.equals("pagedata.path")) {
pageName = page.getProperties().get("pageName",null);
}
}
return pageName;
}
public Resource getResource(AnalyticsPageNameContext context) {
Resource res = null;
Framework framework = context.getFramework();
ResourceResolver resolver = context.getResourceResolver();
String pageName = context.getPageName();
String basePath = context.getBasePath();
if (pageName != null && basePath != null && resolver != null
&& framework != null && framework.mapsSCVariable(S_PAGE_NAME)) {
String cqVar = framework.getMapping(S_PAGE_NAME);
if (cqVar.equals("pagedata.pagename")) {
Iterator<Resource>
hits = resolver.findResources(createQuery(pageName, basePath, "pagename"), Query.JCR_SQL2);
if (hits.hasNext()) {
res = hits.next();
res = res.getParent();
}
}
}
return res;
}
private String createQuery(String pageName, String basePath, String propName) {
return "SELECT * FROM [cq:PageContent] WHERE ISDESCENDANTNODE(["
+ basePath + "]) and [" + propName + "] = \"" + pageName + "\"";
}
}