Implementazione della denominazione delle pagine lato server per Analytics implementing-server-side-page-naming-for-analytics
Adobe Analytics utilizza s.pageName per identificare in modo univoco le pagine e associare i dati raccolti per le pagine. In genere, in AEM si eseguono le seguenti attività per assegnare un valore a questa proprietà che AEM inviata ad Analytics:
-
Utilizza il framework del servizio cloud di Analytics per mappare una variabile CQ su Analytics
s.pageNameproprietà. (Vedi Mappatura dei dati dei componenti con le proprietà di Adobe Analytics.) -
Progetta il componente pagina in modo che includa la variabile CQ mappata sul
s.pageNameproprietà. (Vedi Implementazione del tracciamento di Adobe Analytics per i componenti personalizzati.)
Per esporre i dati dei rapporti di Analytics nella console Sites e in Approfondimenti contenuto, AEM richiede il valore della s.pageName per ogni pagina. L’API Java di AEM Analytics definisce il AnalyticsPageNameProvider Interfaccia implementata per fornire alla console Sites e a Approfondimenti contenuto il valore di s.pageName proprietà. Le AnaltyicsPageNameProvider il servizio risolve la proprietà pageName sul server a scopo di reporting, in quanto può essere impostata dinamicamente utilizzando Javascript sul client a scopo di tracciamento.
Servizio provider di nomi di pagina predefinito di Analytics the-default-analytics-page-name-provider-service
La DefaultPageNameProvider è il servizio predefinito che determina il valore del s.pageName da utilizzare per recuperare i dati di Analytics per una pagina. Il servizio funziona in combinazione con il componente pagina di base AEM ( /libs/foundation/components/page). Questo componente pagina definisce le seguenti variabili CQ che devono essere mappate su s.pageName proprietà:
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.
La DefaultPageNameProvider il servizio determina quale di queste variabili CQ è mappata a s.pageName nel framework dei servizi cloud di Analytics. Il servizio determina quindi la proprietà pagina appropriata da utilizzare per il recupero dei dati dei rapporti di analytics:
-
pagedata.path: Il servizio utilizzapage.getPath() -
pagedata.title: Il servizio utilizzapage.getTitle() -
pagedata.navTitle: Il servizio utilizzapage.getNavigationTitle()
La page l'oggetto è com.day.cq.wcm.api.Page Oggetto Java per la pagina.
Se non mappi una variabile CQ sul s.pageName proprietà 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.
Mantenimento della continuità nei rapporti di Analytics maintaining-continuity-in-analytics-reporting
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 della pagina di base possono essere facilmente modificate. Ad esempio, lo spostamento di una pagina modifica il valore di pagedata.path e interrompe la continuità dello storico dei rapporti:
- I dati raccolti per il percorso precedente non sono più associati alla pagina.
- Se una pagina diversa utilizza il percorso utilizzato da un’altra pagina, la pagina diversa eredita i dati di tale percorso.
Per garantire la continuità delle segnalazioni, s.pageName devono avere le seguenti caratteristiche:
- Univoco.
- Stabile.
- Leggibile per l'uomo.
Ad esempio, un componente pagina personalizzato può includere una proprietà di pagina che gli autori utilizzano per specificare un ID univoco per la pagina utilizzata come valore per il s.pageProperties proprietà:
- La pagina include una variabile di analisi impostata sul valore dell'ID univoco memorizzato nella proprietà page.
- La variabile di analisi è mappata alla variabile
s.pagePropertiesnel framework di Analytics. - L'implementazione dell'interfaccia AnalyticsPageNameProvider recupera il valore della proprietà page da utilizzare per eseguire query sui dati di Analytics della pagina.
s.pageName valore.Implementazione di un servizio provider di nomi di pagina di Analytics implementing-an-analytics-page-name-provider-service
Implementare com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider come servizio OSGi per personalizzare la logica che recupera il s.pageName valore della proprietà. L’analisi delle pagine Sites e l’analisi dei contenuti utilizzano il servizio per recuperare i dati dei rapporti da Analytics.
L’interfaccia AnalyticsPageNameProvider definisce due metodi da implementare:
-
getPageName: Restituisce un valoreStringche rappresenta il valore da utilizzare comes.pageNameproprietà. -
getResource: Restituisce un valoreorg.apache.sling.api.resource.Resourceche rappresenta la pagina associata allas.pageNameproprietà.
Entrambi i metodi richiedono un com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext come parametro. La AnalyticsPageNameContext class fornisce informazioni sul contesto delle chiamate di analytics:
- Percorso base della risorsa pagina.
- La
Frameworkoggetto per la configurazione del servizio cloud di Analytics. - La
Resourceoggetto per la pagina. - La
ResourceResolveroggetto per la pagina.
La classe fornisce anche un setter per il nome della pagina.
Implementazione di esempio di AnalyticsPageNameProvider example-analyticspagenameprovider-implementation
Esempio AnalyticsPageNameProvider l'implementazione supporta un componente pagina personalizzato:
- Il componente estende il componente della pagina di base.
- La finestra di dialogo include un campo che viene utilizzato dagli autori per specificare il valore del
s.pageNameproprietà. - Il valore della proprietà viene memorizzato nella proprietà pageName della proprietà
jcr:contentnodo delle istanze della pagina. - La proprietà analytics che memorizza il
s.pageNameviene chiamatapagedata.pagename. Questa proprietà è mappata als.pageNamenel framework di Analytics.
La seguente attuazione getPageName restituisce il valore della proprietà node pageName se il mapping del framework è configurato 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. Tieni presente che la classificazione 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 + "\"";
}
}