Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sitecore Analytics: Trigger profiles and events from webservice

Tags:

sitecore

I have a problem with Sitecore.Analytics

From my xslt, I do an ajax call to a webservice using jQuery.

In my webservice I need to register/save some Sitecore.Analytics data. The problem is that I can't use Sitecore.Analytics.AnalyticsTracker.Current.

So how do I do TriggerProfile and TriggerEvent? I wonder if Sitecore.Analytics.AnalyticsManager could be to any help.

like image 398
gorhal Avatar asked Feb 25 '11 13:02

gorhal


1 Answers

I recently encountered a similar scenario in having to track an analytics event within a webservice. As you noted, the problem is that AnalyticsTracker.Current is null within the context of a webservice.

The reason for this is that AnalytisTracker.Current is populated during the trackAnalytics pipeline, which in turn is invoked during the renderLayout pipeline, which is only invoked if the context item is not null and the context item has presentation settings defined.

With that said, there is a workaround :)

You can start the AnalyticsTracker manually like so:

if (!AnalyticsTracker.IsActive)
{
    AnalyticsTracker.StartTracking();
}

You can then retrieve an AnalyticsTracker instance like so:

AnalyticsTracker tracker = AnalyticsTracker.Current;
if (tracker == null)
    return;

And finally, you can create and trigger your event, profile, etc... The example below triggers a PageEvent. Note: there is a special consideration to be made for a PageEvent (and most likely other events) in order to get the Timestamp property populated. See the comments in the code below.

if (!AnalyticsTracker.IsActive)
{
    AnalyticsTracker.StartTracking();
}

AnalyticsTracker tracker = AnalyticsTracker.Current;
if (tracker == null)
    return;

string data = HttpContext.Current.Request.UrlReferrer != null
                        ? HttpContext.Current.Request.UrlReferrer.PathAndQuery
                        : string.Empty;

//Need to set a context item in order for the AnalyticsPageEvent.Timestamp property to 
//be set. As a hack, just set the context item to a known item before declaring the event, 
//then set the context item to null afterwards.
Sitecore.Context.Item = Sitecore.Context.Database.GetItem("/sitecore");

AnalyticsPageEvent pageEvent = new AnalyticsPageEvent();
pageEvent.Name = "Download Registration Form Submitted";
pageEvent.Key = HttpContext.Current.Request.RawUrl;
pageEvent.Text = HttpContext.Current.Request.RawUrl;
pageEvent.Data = data;

//Set the AnalyticsPageEvent.Item property to null and the context item to null.
//This way the PageEvent isn't tied to the item you specified as the context item.
pageEvent.Item = null; 
Sitecore.Context.Item = null;

tracker.CurrentPage.TriggerEvent(pageEvent);
tracker.Submit();

Hope this helps!

like image 94
Adam Weber Avatar answered Nov 11 '22 15:11

Adam Weber