Implementera sidnamngivning på serversidan för analys
- Ämnen:
- Developing
Skapat för:
- Developer
Adobe Analytics använder s.pageName
för att unikt identifiera sidor och för att koppla data som samlas in för sidorna. Vanligtvis utför du följande uppgifter i AEM för att tilldela ett värde till den här egenskapen som AEM skickar till Analytics:
-
Använd molntjänstramverket för Analytics för att mappa en CQ-variabel till Analytics
s.pageName
-egenskap. (Se Mappa komponentdata med Adobe Analytics-egenskaper.) -
Utforma sidkomponenten så att den innehåller CQ-variabeln som du mappar till
s.pageName
-egenskap. (Se Implementera Adobe Analytics Tracking för anpassade komponenter.)
För att kunna visa analysrapportdata i Sites-konsolen och i Content Insight måste AEM ha värdet för s.pageName
för varje sida. Java-API:t för AEM Analytics definierar AnalyticsPageNameProvider
det gränssnitt som du implementerar för att tillhandahålla Sites-konsolen och Content Insights med värdet i s.pageName
-egenskap. Dina AnaltyicsPageNameProvider
-tjänsten löser egenskapen pageName på servern i rapporteringssyfte, eftersom den kan ställas in dynamiskt med Javascript på klienten i spårningssyfte.
Sidnamnsprovidertjänsten för standardanalys
The DefaultPageNameProvider
är standardtjänsten som avgör värdet på s.pageName
-egenskap som används för att hämta Analytics-data för en sida. Tjänsten fungerar tillsammans med AEM på grundsidan ( /libs/foundation/components/page
). Den här sidkomponenten definierar följande CQ-variabler som ska mappas till s.pageName
egenskap:
pagedata.path
: Värdet ställs in på sidans sökväg.pagedata.title
: Värdet ställs in på sidrubriken.pagedata.navTitle
: Värdet ställs in på sidnavigeringsrubriken.
The DefaultPageNameProvider
avgör vilken av dessa CQ-variabler som mappas till s.pageName
i molntjänstramverket för Analytics. Tjänsten avgör sedan vilken sidegenskap som ska användas för att hämta analysrapportdata:
-
pagedata.path
: Tjänsten använderpage.getPath()
-
pagedata.title
: Tjänsten använderpage.getTitle()
-
pagedata.navTitle
: Tjänsten använderpage.getNavigationTitle()
The page
objektet är com.day.cq.wcm.api.Page
Java-objekt för sidan.
Om du inte kopplar en CQ-variabel till s.pageName
i ramverket, värdet för s.pageName
genereras från sidsökvägen. Till exempel sidan med banan /content/geometrixx/en
använder värdet content:geometrixx:en
for s.pageName
.
Bevara kontinuitet i analysrapporter
För att upprätthålla en komplett historik med analysdata för en sida måste värdet för egenskapen s.pageName som används för en sida aldrig ändras. Det är dock enkelt att ändra de analysegenskaper som definieras av bassidans komponent. Om du till exempel flyttar en sida ändras värdet för pagedata.path
och bryter kontinuiteten i rapporthistoriken:
- Data som samlades in för föregående sökväg är inte längre kopplade till sidan.
- Om en annan sida använder sökvägen som en annan sida använde, ärver den andra sidan informationen för den sökvägen.
För att säkerställa kontinuiteten i rapporteringen bör värdet av s.pageName
ska ha följande egenskaper:
- Unik.
- Stabil.
- Kan läsas av människor.
En anpassad sidkomponent kan till exempel innehålla en sidegenskap som författare använder för att ange ett unikt ID för sidan som används som värde för s.pageProperties
egenskap:
- Sidan innehåller en analysvariabel som är inställd på värdet för det unika ID som lagras i sidegenskapen.
- Analysvariabeln mappas till
s.pageProperties
i Analytics-ramverket. - Din implementering av gränssnittet AnalyticsPageNameProvider hämtar värdet på sidegenskapen som ska användas för att fråga efter sidanalysdata.
s.pageName
värde.Implementera en leverantör av sidnamn för analyser
Implementera com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider
som en OSGi-tjänst för att anpassa logiken som hämtar s.pageName
egenskapsvärde. Webbplatssidans analys och Content Insight använder tjänsten för att hämta rapportdata från Analytics.
Gränssnittet AnalyticsPageNameProvider definierar två metoder som du måste implementera:
-
getPageName
: Returnerar ettString
värdet som representerar värdet som ska användas soms.pageName
-egenskap. -
getResource
: Returnerar ettorg.apache.sling.api.resource.Resource
objekt som representerar sidan som är associerad meds.pageName
-egenskap.
Båda metoderna har en com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext
-objekt som en parameter. The AnalyticsPageNameContext
klassen ger information om kontexten för analysanropen:
- Sidresursens grundsökväg.
- The
Framework
-objekt för molntjänstkonfigurationen för Analytics. - The
Resource
objekt för sidan. - The
ResourceResolver
objekt för sidan.
Klassen innehåller också en set för sidnamnet.
Exempel på implementering av AnalyticsPageNameProvider
Följande exempel AnalyticsPageNameProvider
implementeringen stöder en anpassad sidkomponent:
- Komponenten utökar bassidans komponent.
- Dialogrutan innehåller ett fält som författare använder för att ange värdet för
s.pageName
-egenskap. - Egenskapsvärdet lagras i egenskapen pageName för
jcr:content
noden för sidinstanserna. - Den analysegenskap som lagrar
s.pageName
egenskapen anropaspagedata.pagename
. Den här egenskapen är mappad tills.pageName
i Analytics-ramverket.
Följande implementering av getPageName
metoden returnerar värdet för nodegenskapen pageName om ramverksmappningen är korrekt konfigurerad:
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;
}
Följande implementering av metoden getResource returnerar resursobjektet för sidan:
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 + "\"";
}
Följande kod representerar hela klassen, inklusive SCR-anteckningar som konfigurerar tjänsten. Observera att servicerankningen är 200 vilket åsidosätter standardtjänsten.
/*************************************************************************
*
* 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 + "\"";
}
}
Experience Manager
- Utveckla användarhandboken - översikt
- Introduktion för utvecklare
- Komma igång med utveckling i AEM Sites – WKND-självstudiekurs
- AEM kärnbegrepp
- Struktur för det AEM användargränssnittet med pekskärm
- Koncepten i det AEM användargränssnittet med pekskärm
- AEM - riktlinjer och bästa praxis
- Använda bibliotek på klientsidan
- Developing and Page Diff
- Begränsningar för redigerare
- CSRF Protection Framework
- Datamodellering - David Nueschelers modell
- Bidrar till AEM
- Dokumentskydd
- Referensmaterial
- Skapa en webbplats med alla funktioner (Classic UI)
- Designer och Designer (Classic UI)
- Plattform
- Fusklapp för Sling
- Använda Sling-adaptrar
- Taggbibliotek
- Mallar
- Använda Sling Resource Merger i AEM
- Övertäckningar
- Namnkonventioner
- Skapa en ny GRE-fältkomponent
- Query Builder
- Taggar
- Anpassa sidor som visas av felhanteraren
- Anpassade nodtyper
- Lägga till teckensnitt för grafikåtergivning
- Ansluta till SQL-databaser
- Extern URL
- Skapa och använda jobb för avlastning
- Konfigurerar cookie-användning
- Så här programmässigt kommer du åt AEM JCR
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utveckla rapporter
- eCommerce
- Komponenter
- Kärnkomponenter
- Formatsystem
- Komponenter - översikt
- AEM - Grunderna
- Utveckla AEM
- Utveckla AEM - kodexempel
- JSON-exporterare för innehållstjänster
- Aktivera JSON-export för en komponent
- Bildredigeraren
- Dekoration-tagg
- Använda Dölj villkor
- Konfigurera flera redigerare på plats
- Utvecklarläge
- Testa användargränssnittet
- Komponenter för innehållsfragment
- Hämta sidinformation i JSON-format
- Internationalisering
- Klassiska gränssnittskomponenter
- Headless Experience Management
- Headless och Hybrid with AEM
- Aktivera JSON-export för en komponent
- Enkelsidiga program
- SPA introduktion och genomgång
- SPA WKND - självstudiekurs
- Getting Started with SPA in AEM - React
- Komma igång med SPA i AEM - Angular
- Implementera en React Component for SPA
- SPA djupdykning
- SPA
- Utveckla SPA för AEM
- SPA Blueprint
- SPA
- Dynamisk mappning av modell till komponent för SPA
- SPA
- SPA och Adobe Experience Platform Launch Integration
- SPA- och serveråtergivning
- SPA referensmaterial
- HTTP-API
- Innehållsfragment
- Experience Fragments
- Utvecklingsverktyg
- Utvecklingsverktyg
- AEM Modernization Tools
- Dialogruteredigeraren
- Verktyget Dialogkonvertering
- Utveckla med CRXDE Lite
- Hantera paket med Maven
- Utveckla AEM projekt med Eclipse
- Skapa AEM projekt med Apache Maven
- Utveckla AEM projekt med IntelliJ IDEA
- Så här använder du VLT-verktyget
- Så här använder du proxyserververktyget
- AEM Brackets Extension
- AEM Developer Tools for Eclipse
- AEM
- Personanpassning
- Utöka AEM
- Anpassa sidredigering
- Anpassa konsolerna
- Anpassa vyer av Sidegenskaper
- Konfigurera din sida för gruppredigering av sidegenskaper
- Anpassa och utöka Content Fragments
- Utöka arbetsflöden
- Utöka Multi Site Manager
- Spårning och analys
- Cloud Services
- Skapa anpassade tillägg
- Forms
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utöka Classic UI
- Testning
- Bästa praxis
- Mobil webb