Adobe Analytics verwendet die Eigenschaft s.pageName
, um Seiten eindeutig zu identifizieren und die für die Seiten erfassten Daten zu verknüpfen. Normalerweise führen Sie in AEM die folgenden Aufgaben aus, um dieser Eigenschaft, die AEM an Analytics übermittelt, einen Wert zuzuordnen:
Verwenden Sie das Framework des Analytics-Cloud-Service, um der Analytics-Eigenschaft s.pageName
eine CQ-Variable zuzuordnen. (Siehe Zuordnen von Komponentendaten zu Adobe Analytics Properties.)
Gestalten Sie die Seitenkomponente so, dass sie die CQ-Variable enthält, die Sie der Eigenschaft s.pageName
zuordnen. (Siehe Implementieren des Adobe Analytics-Trackings für benutzerdefinierte Komponenten.)
Um Analytics-Berichtsdaten in der Sites-Konsole und in Inhaltseinblicken anzuzeigen, benötigt AEM den Wert der Eigenschaft s.pageName
für jede Seite. Die AEM Analytics Java-API definiert die AnalyticsPageNameProvider
-Schnittstelle, die Sie implementieren, um die Sites-Konsole und Inhaltseinblicke mit dem Wert der s.pageName
-Eigenschaft bereitzustellen. Ihr Dienst AnaltyicsPageNameProvider
löst die Eigenschaft „pageName“ auf dem Server zu Berichtszwecken auf, da sie dynamisch mittels JavaScript auf dem Client aus Gründen der Nachverfolgung festgelegt werden kann.
Der Dienst DefaultPageNameProvider
ist der Standarddienst, der den Wert der Eigenschaft s.pageName
bestimmt, die zum Abrufen von Analytics-Daten für eine Seite verwendet werden soll. Der Dienst funktioniert in Verbindung mit der AEM Foundation-Seitenkomponente ( /libs/foundation/components/page
). Diese Seitenkomponente definiert die folgenden CQ-Variablen, die für die Zuordnung zur Eigenschaft s.pageName
vorgesehen sind:
pagedata.path
: Der Wert wird auf den Seitenpfad festgelegt.pagedata.title
: Der Wert wird auf den Seitentitel festgelegt.pagedata.navTitle
: Der Wert wird auf den Seitennavigationstitel festgelegt.Der DefaultPageNameProvider
-Dienst bestimmt, welche dieser CQ-Variablen der s.pageName
-Eigenschaft im Analytics Cloud Service-Framework zugeordnet ist. Der Dienst bestimmt dann die entsprechende Seiteneigenschaft, die für das Abrufen von Analytics-Berichtsdaten verwendet werden soll:
pagedata.path
: Der Dienst verwendet page.getPath()
pagedata.title
: Der Dienst verwendet page.getTitle()
pagedata.navTitle
: Der Dienst verwendet page.getNavigationTitle()
Das page
-Objekt ist das Java-Objekt com.day.cq.wcm.api.Page
für die Seite.
Wenn Sie eine CQ-Variable nicht der Eigenschaft s.pageName
im Framework zuordnen, wird der Wert für s.pageName
aus dem Seitenpfad generiert. Beispielsweise verwendet die Seite mit dem Pfad /content/geometrixx/en
den Wert content:geometrixx:en
für s.pageName
.
Der DefaultPageNameProvider-Dienst verwendet das Dienstranking 100.
Ein vollständiger Verlauf der Analysedaten für eine Seite erfordert, dass sich der Wert der Eigenschaft „s.pageName“ nicht ändert, die für eine Seite verwendet wird. Die Analtyics-Eigenschaften, die die Foundation-Seitenkomponente definiert, können jedoch problemlos geändert werden. Beispielsweise ändert das Verschieben einer Seite den Wert von pagedata.path
. Damit ist die Kontinuität des Berichtsverlaufs nicht mehr gewahrt:
Um die Kontinuität der Berichterstellung zu wahren, sollte der Wert von s.pageName
die folgenden Merkmale aufweisen:
Beispielsweise kann eine benutzerdefinierte Seitenkomponente eine Seiteneigenschaft enthalten, mit der Autoren eine eindeutige ID für die Seite angeben, die als Wert für die Eigenschaft s.pageProperties
verwendet wird:
s.pageProperties
im Analytics-Framework zugeordnet.Wenden Sie sich an Ihren Analytics-Berater, um Unterstützung beim Entwickeln einer effektiven Strategie für Ihren Wert s.pageName
zu erhalten.
Implementieren Sie die Schnittstelle com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider
s.pageName
als OSGi-Dienst, um die Logik anzupassen, die den Wert der Eigenschaft „“ abruft. Die Sites-Seitenanalyse und Inhaltseinblicke verwenden den Dienst zum Abrufen der Berichtsdaten von Analytics.
Die Schnittstelle „AnalyticsPageNameProvider“ definiert zwei Methoden, die Sie implementieren müssen:
getPageName
: Gibt einen String
Wert zurück, der den Wert darstellt, der als s.pageName
Eigenschaft verwendet werden soll.
getResource
: Gibt ein org.apache.sling.api.resource.Resource
Objekt zurück, das die Seite darstellt, die mit der s.pageName
Eigenschaft verknüpft ist.
Beide Methoden verwenden ein com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext
-Objekt als Parameter. Die AnalyticsPageNameContext
-Klasse stellt Informationen zum Kontext der Analytics-Aufrufe bereit:
Framework
-Objekt für die Konfiguration des Analytics-Cloud-Service.Resource
-Objekt für die Seite.ResourceResolver
-Objekt für die Seite.Die Klasse stellt auch einen Setter für den Seitennamen zur Verfügung.
Die folgende AnalyticsPageNameProvider
-Beispielimplementierung unterstützt eine Seitenkomponente:
s.pageName
angeben.jcr:content
der Seiteninstanzen gespeichert.s.pageName
speichert, hat den Namen pagedata.pagename
. Die Eigenschaft ist der Eigenschaft s.pageName
im Analytics-Framework zugeordnet.Die folgende Implementierung der Methode getPageName
gibt den Wert der Knoteneigenschaft „pageName“ zurück, wenn die Framework-Zuordnung korrekt konfiguriert ist:
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;
}
Die folgende Implementierung der Methode „getResource“ gibt das Resource-Objekt für die Seite zurück:
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 + "\"";
}
Der folgende Code repräsentiert die gesamte Klasse, einschließlich der SCR-Anmerkungen, die den Dienst konfigurieren. Beachten Sie, dass der Dienstrang 200 lautet, womit der standardmäßige Dienst überschrieben wird.
/*************************************************************************
*
* 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 + "\"";
}
}