From 141962167f74b52a101ff0a781ff855e1a09d163 Mon Sep 17 00:00:00 2001 From: diosmosis Date: Sat, 26 Jan 2019 19:23:03 -0800 Subject: [PATCH] Add method to get ecommerce items to tracker (#14028) * Add getEcommerceItems() method to tracker so users can see what was added/removed. * doc twea * Update minified JS. * Fix test. --- js/piwik.js | 15 +++++++++++- js/piwik.min.js | 10 ++++---- matomo.js | 10 ++++---- piwik.js | 10 ++++---- tests/javascript/index.php | 48 ++++++++++++++++++++++++++++++++++++-- 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/js/piwik.js b/js/piwik.js index 6ef22d2c4c3..44b42124ac2 100644 --- a/js/piwik.js +++ b/js/piwik.js @@ -999,7 +999,7 @@ if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window. enableHeartBeatTimer, disableHeartBeatTimer, killFrame, redirectFile, setCountPreRendered, trackGoal, trackLink, trackPageView, getNumTrackedPageViews, trackRequest, queueRequest, trackSiteSearch, trackEvent, requests, timeout, sendRequests, queueRequest, - setEcommerceView, addEcommerceItem, removeEcommerceItem, clearEcommerceCart, trackEcommerceOrder, trackEcommerceCartUpdate, + setEcommerceView, getEcommerceItems, addEcommerceItem, removeEcommerceItem, clearEcommerceCart, trackEcommerceOrder, trackEcommerceCartUpdate, deleteCookie, deleteCookies, offsetTop, offsetLeft, offsetHeight, offsetWidth, nodeType, defaultView, innerHTML, scrollLeft, scrollTop, currentStyle, getComputedStyle, querySelectorAll, splice, getAttribute, hasAttribute, attributes, nodeName, findContentNodes, findContentNodes, findContentNodesWithinNode, @@ -7245,6 +7245,19 @@ if (typeof window.Piwik !== 'object') { customVariablesPage[4] = ['_pkn', name]; }; + /** + * Returns the list of ecommerce items that will be sent when a cart update or order is tracked. + * The returned value is read-only, modifications will not change what will be tracked. Use + * addEcommerceItem/removeEcommerceItem/clearEcommerceCart to modify what items will be tracked. + * + * Note: the cart will be cleared after an order. + * + * @returns array + */ + this.getEcommerceItems = function () { + return JSON.parse(JSON.stringify(ecommerceItems)); + }; + /** * Adds an item (product) that is in the current Cart or in the Ecommerce order. * This function is called for every item (product) in the Cart or the Order. diff --git a/js/piwik.min.js b/js/piwik.min.js index 9127aaad545..a189bdac778 100644 --- a/js/piwik.min.js +++ b/js/piwik.min.js @@ -67,11 +67,11 @@ var dd,dc;function da(){dg=true}n(function(){function dh(dj){setTimeout(function }};this.deleteCookies=function(){aB()};this.setDoNotTrack=function(db){var da=h.doNotTrack||h.msDoNotTrack;cJ=db&&(da==="yes"||da==="1");if(cJ){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cP=true};this.addListener=function(db,da){an(db,da)};this.enableLinkTracking=function(db){c1=true;var da=this;cb(function(){q(function(){bx(db,da)})})};this.enableJSErrorTracking=function(){if(cL){return}cL=true;var da=T.onerror;T.onerror=function(df,dd,dc,de,db){cb(function(){var dg="JavaScript Errors";var dh=dd+":"+dc;if(de){dh+=":"+de}ap(dg,dh,df)});if(da){return da(df,dd,dc,de,db)}return false}};this.disablePerformanceTracking=function(){aY=false};this.setGenerationTimeMs=function(da){ch=parseInt(da,10)};this.enableHeartBeatTimer=function(da){da=Math.max(da,1);a1=(da||15)*1000;if(cR!==null){c7()}};this.disableHeartBeatTimer=function(){bE();if(a1||aK){if(T.removeEventListener){T.removeEventListener("focus",a6,true);T.removeEventListener("blur",av,true)}else{if(T.detachEvent){T.detachEvent("onfocus",a6); T.detachEvent("onblur",av)}}}a1=null;aK=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(da){if(T.location.protocol==="file:"){T.location=da}};this.setCountPreRendered=function(da){ba=da};this.trackGoal=function(da,dd,dc,db){cb(function(){cM(da,dd,dc,db)})};this.trackLink=function(db,da,dd,dc){cb(function(){cU(db,da,dd,dc)})};this.getNumTrackedPageViews=function(){return cm};this.trackPageView=function(da,dc,db){b4=[];cD=[];if(N(b0)){cb(function(){Y(aA,bB,b0)})}else{cb(function(){cm++;bU(da,dc,db)})}};this.trackAllContentImpressions=function(){if(N(b0)){return}cb(function(){q(function(){var da=v.findContentNodes();var db=ct(da);c6(db,bD)})})};this.trackVisibleContentImpressions=function(da,db){if(N(b0)){return}if(!J(da)){da=true}if(!J(db)){db=750}aO(da,db,this);cb(function(){n(function(){var dc=v.findContentNodes();var dd=a5(dc);c6(dd,bD)})})};this.trackContentImpression=function(dc,da,db){if(N(b0)){return}dc=a(dc);da=a(da); db=a(db);if(!dc){return}da=da||"Unknown";cb(function(){var dd=aC(dc,da,db);bz(dd,bD)})};this.trackContentImpressionsWithinNode=function(da){if(N(b0)||!da){return}cb(function(){if(b9){n(function(){var db=v.findContentNodesWithinNode(da);var dc=a5(db);c6(dc,bD)})}else{q(function(){var db=v.findContentNodesWithinNode(da);var dc=ct(db);c6(dc,bD)})}})};this.trackContentInteraction=function(dc,dd,da,db){if(N(b0)){return}dc=a(dc);dd=a(dd);da=a(da);db=a(db);if(!dc||!dd){return}da=da||"Unknown";cb(function(){var de=aL(dc,dd,da,db);bz(de,bD)})};this.trackContentInteractionNode=function(db,da){if(N(b0)||!db){return}cb(function(){var dc=c3(db,da);bz(dc,bD)})};this.logAllContentBlocksOnPage=function(){var dc=v.findContentNodes();var da=v.collectContent(dc);var db=typeof console;if(db!=="undefined"&&console&&console.log){console.log(da)}};this.trackEvent=function(db,dd,da,dc,df,de){cb(function(){ap(db,dd,da,dc,df,de)})};this.trackSiteSearch=function(da,dc,db,dd){cb(function(){b2(da,dc,db,dd)})};this.setEcommerceView=function(dd,da,dc,db){if(!J(dc)||!dc.length){dc="" -}else{if(dc instanceof Array){dc=JSON_PIWIK.stringify(dc)}}bQ[5]=["_pkc",dc];if(J(db)&&String(db).length){bQ[2]=["_pkp",db]}if((!J(dd)||!dd.length)&&(!J(da)||!da.length)){return}if(J(dd)&&dd.length){bQ[3]=["_pks",dd]}if(!J(da)||!da.length){da=""}bQ[4]=["_pkn",da]};this.addEcommerceItem=function(de,da,dc,db,dd){if(de.length){cT[de]=[de,da,dc,db,dd]}};this.removeEcommerceItem=function(da){if(da.length){delete cT[da]}};this.clearEcommerceCart=function(){cT={}};this.trackEcommerceOrder=function(da,de,dd,dc,db,df){bT(da,de,dd,dc,db,df)};this.trackEcommerceCartUpdate=function(da){bn(da)};this.trackRequest=function(db,dd,dc,da){cb(function(){var de=cn(db,dd,da);bz(de,bD,dc)})};this.queueRequest=function(da){cb(function(){var db=cn(da);requestQueue.push(db)})};this.getRememberedConsent=function(){var da=az(a9);if(az(cF)){if(da){bS(a9,bk,cQ)}return null}if(!da||da===0){return null}return da};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cu=true; -bw=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bw){aB()}}}};this.setConsentGiven=function(){bw=true;bS(cF,bk,cQ);var db,da;for(db=0;db1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al; -if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime; +e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al;if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al; -if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime; +e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al;if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al; -if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al1&&am!=="addTracker"){ah("The method "+am+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}ar[am]++}}}}return aq}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ab(al,an){var am=new Q(al,an);I.push(am);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){ad(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[am]);return am}ak(T,"beforeunload",af,false);Date.prototype.getTimeAlias=Date.prototype.getTime; +e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ao,an,am,al){var ap=typeof al;if(ap==="undefined"){al=false}ak(ao,an,am,al)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(am,al){if(!y[am]){y[am]=[]}y[am].push(al)},off:function(an,am){if(!y[an]){return}var al=0;for(al;al