Vous consultez actuellement l'aide de la version:

Adobe Analytics utilise la propriété s.pageName pour identifier les pages de façon unique et pour associer les données qui sont collectées pour les pages. En règle générale, vous effectuez les tâches suivantes dans AEM afin d’attribuer à cette propriété une valeur qu’AEM envoie à Analytics :

Pour afficher les données de rapport Analytics dans la console Sites et dans Content Insight, AEM nécessite la valeur de la propriété s.pageName pour chaque page. L’API Java AEM Analytics définit l’interface AnalyticsPageNameProvider que vous mettez en œuvre pour fournir la valeur de la propriété s.pageName à la console Sites et à Content Insight. Votre service AnalyticsPageNameProvider résout la propriété pageName sur le serveur à des fins de création de rapports, dans la mesure où elle peut être définie de façon dynamique à l’aide de JavaScript sur le client en vue du suivi.

Service Fournisseur de noms de page Analytics par défaut

Le Feature Pack d’intégration Analytics installe le service DefaultPageNameProvider. Il s’agit du service par défaut qui détermine la valeur de la propriété s.pageName à utiliser pour récupérer des données Analytics pour une page. Ce service fonctionne de concert avec le composant de page de base AEM (/libs/foundation/components/page). Ce composant de page définit les variables CQ suivantes qui sont censées être mappées sur la propriété s.pageName :

  • pagedata.path : la valeur est définie sur le chemin d’accès de la page.
  • pagedata.title : la valeur est définie sur le titre de la page.
  • pagedata.navTitle : la valeur est définie sur le titre de navigation de la page.

Le service DefaultPageNameProvider détermine la variable CQ qui est mappée sur la propriété s.pageName dans la structure de service cloud Analytics. Il détermine ensuite la propriété de page appropriée à utiliser pour récupérer les données de rapport Analytics :

  • pagedata.path : le service utilise page.getPath().
  • pagedata.title : le service utilise page.getTitle().
  • pagedata.navTitle : le service utilise page.getNavigationTitle().

L’objet page est l’objet Java com.day.cq.wcm.api.Page de la page.

Si vous ne mappez pas de variable CQ sur la propriété s.pageName dans la structure, la valeur de s.pageName est générée à partir du chemin d’accès de la page. Par exemple, la page dont le chemin d’accès est /content/geometrixx/en utilise la valeur content:geometrixx:en pour la propriété s.pageName.

Remarque :

La variable DefaultPageNameProvider utilise un classement de service de 100.

Maintien de la continuité dans les rapports Analytics

Pour conserver un historique complet des données analytiques d’une page, il faut que la valeur de la propriété s.pageName qui est utilisée pour la page soit invariable. Cependant, les propriétés Analytics définies par le composant de page de base peuvent être facilement modifiées. Ainsi, le fait de déplacer une page change la valeur de pagedata.path et interrompt la continuité de l’historique des rapports :

  • Les données qui avaient été collectées pour le chemin précédent ne sont alors plus associées à la page.
  • Si une page distincte utilise le chemin d’accès qui était utilisé auparavant par une autre page, elle hérite des données relatives à ce chemin.

Pour garantir la continuité des rapports, la valeur de la propriété s.pageName doit présenter les caractéristiques suivantes :

  • Unique.
  • Stable.
  • Lisible par un humain.
Par exemple, un composant de page personnalisé peut inclure une propriété de page que les auteurs utilisent pour spécifier un identifiant unique pour la page utilisée comme valeur pour la propriété s.pageProperties :
  • La page inclut une variable Analytics qui est définie sur la valeur de l’identifiant unique stockée dans la propriété de page.
  • La variable Analytics est mappée sur la propriété s.pageProperties dans la structure Analytics. 
  • Votre implémentation de l’interface AnalyticsPageNameProvider récupère la valeur de la propriété de page à utiliser pour interroger les données Analytics de la page. 

Remarque :

Demandez l’aide de votre conseiller Analytics pour développer une stratégie efficace pour votre valeur s.pageName.

Mise en œuvre d’un service Fournisseur de noms de page Analytics

Implémentez l’interface com.day.cq.analytics.sitecatalyst.AnalyticsPageNameProvider en tant que service OSGi pour personnaliser la logique qui récupère la valeur de la propriété s.pageName. L’analyse des pages Sites et Content Insight utilisent le service pour récupérer des données de rapport d’Analytics.

L’interface AnalyticsPageNameProvider définit deux méthodes que vous devez mettre en œuvre :

  • getPageName : renvoie une valeur String qui représente la valeur à utiliser comme propriété s.pageName.
  • getResource : renvoie un objet org.apache.sling.api.resource.Resource qui représente la page associée à la propriété s.pageName.
Les deux méthodes utilisent un objet com.day.cq.analytics.sitecatalyst.AnalyticsPageNameContext comme paramètre. La classe AnalyticsPageNameContext fournit des informations sur le contexte des appels Analytics :
  • Chemin de base de la ressource de page.
  • Objet Framework pour la configuration du service cloud Analytics.
  • Objet Resource pour la page.
  • Objet ResourceResolver pour la page.
 
La classe fournit également un setter pour le nom de la page.

Exemple d’implémentation de l’interface AnalyticsPageNameProvider

L’exemple d’implémentation AnalyticsPageNameProvider suivant prend en charge un composant de page personnalisé :

  • Le composant étend le composant de page de base.
  • La boîte de dialogue contient un champ que les auteurs utilisent pour spécifier la valeur de la propriété s.pageName.
  • La valeur de la propriété est stockée dans la propriété pageName du nœud jcr:content des instances de la page.
  • La propriété Analytics qui stocke la propriété s.pageName est appelée pagedata.pagename. Elle est mappée sur la propriété s.pageName dans la structure Analytics. 
L’implémentation suivante de la méthode getPageName renvoie la valeur de la propriété du nœud pageName si le mappage de structure est correctement configuré :
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;
    }

L’implémentation suivante de la méthode getResource renvoie l’objet Resource de la page :

     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 + "\"";
    }

Le code ci-dessous représente l’ensemble de la classe, y compris les annotations SCR qui configurent le service. Notez que le classement de service est de 200, ce qui remplace le service par défaut.

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 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.impl;

import java.util.Iterator;

import javax.jcr.query.Query;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.framework.Constants;

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.wcm.api.NameConstants.PN_TITLE;
import static com.day.cq.wcm.api.NameConstants.PN_NAV_TITLE;
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}.
 */
@Service
@Component(metatype = false)
@Properties({
        @Property(name = Constants.SERVICE_DESCRIPTION, value = "Example Page Name Resolver implementation"),
        @Property(name = Constants.SERVICE_RANKING, intValue = 200, propertyPrivate = false) })
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 + "\"";
    }
}

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne