更新时间:2024年7月7号
认识ACDL
ACDL全称是Adobe Client Data Layer,叫Adobe客户端数据层,是官方推出的实现事件驱动数据层的方式之一,它可以在页面主动发送数据。
这是Adobe在2020推出,它的目标是通过提供一种标准化方法来公开和访问任何脚本的任何类型数据,从而减少对网站进行测试的工作量。
Adobe数据层和ACDL的对比
左边的是Adobe数据层,它是页面上静态的数据,所以是“=”。
右边的是ACDL,它是主动主动推送数据,可以看到它有个push的字段,这个是ACDL函数,ACDL一共有4个函数,如”push() getState() addEventListener() removeEventListener()。
ACDL和GTM的数据层对比
ACDL与GTM的DataLayer非常类似,如发送的调用的函数,里面的数据结构都高度相似,但ACDL的会更强,它支持数据嵌套、json格式的数据,其实adobeDataLayer和dataLayer都可以修改的,可以就GTM可以ACDL数据层数据,ACDL可以获取GTM里的数据层数据。
ACDL的一般用法
ACDL目前是一个Extensions,你先需要在Extension安装它,一般的ACDL的用法如下:
adobeDataLayer.push({"event":"myEvent", "data":{"foo":"bar", "key":"value"}})
event是触发条件,data里面就是发送的数据。
先来看一下如何在data element里拿到data里的数据,也就是foo和key。
创建一个数据元素,命名为AB,然后做如下设置:
这个是ACDL内置的传入数据的方法,data.foo就拿到bar,如果是data.key,就拿到的value。(这种方式有时候会拿不到数据)然后这个data element就可以被Rules或Extensions引用。
接下来看一下怎么发送数据,新建一个Rules,命名为ACDL。
在Rules新建event,做如下设置:
这个设置的意思是,当myEvent触发的的时候才执行,也就是接收到ACDL的数据。
接下来就是配置Action,可以将data element拿到的数据设置成eVars或props发送给Adobe analytics。
如果要检查ACDL是否已经将数据发送出去,可以在浏览器的控制台里用adobeDataLayer去查询。
ACDL与AEM的用法
AEM里面已经集成有ACDL的,可以开启使用。
以https://wknd.site/content/wknd/us/en.html为例,这个站点是AEM建立的,且开启了ACDL,可以在代码查看中通过关键字“ adobeDataLayer.push”找到ACDL的数据:
它发送的数据就有json数据,而且格式还比较特别,可以在浏览器控制台下看看它具体的数据结构:
发送的数据page里面签到一个page-2eee4f8914,这个动态的页面id,而且里面还有一个特别的数据结构,里面有很多的数据。
像这种情况就不能像一般的ACDL那么处理的,这类情况需要用自定义js去监听event,然后重构数据层里面的信息,提取page-2eee4f8914里面的数据从重新发送,使得能够被Adobe Launch获取和使用。
新建一个Rules,命名为Page Load。
Event选择Custom Code,然后将下面的代码监听event的代码黏贴进入:
ar pageShownEventHandler = function(evt) { // defensive coding to avoid a null pointer exception if(evt.hasOwnProperty("eventInfo") && evt.eventInfo.hasOwnProperty("path")) { //trigger Launch Rule and pass event console.debug("cmp:show event: " + evt.eventInfo.path); var event = { //include the path of the component that triggered the event path: evt.eventInfo.path, //get the state of the component that triggered the event component: window.adobeDataLayer.getState(evt.eventInfo.path) }; //Trigger the Launch Rule, passing in the new `event` object // the `event` obj can now be referenced by the reserved name `event` by other Launch data elements // i.e `event.component['someKey']` trigger(event); } } //set the namespace to avoid a potential race condition window.adobeDataLayer = window.adobeDataLayer || []; //push the event listener for cmp:show into the data layer window.adobeDataLayer.push(function (dl) { //add event listener for `cmp:show` and callback to the `pageShownEventHandler` function dl.addEventListener("cmp:show", pageShownEventHandler); });
效果如下:
在配置发送数据之前,我们还可以通过data element去获取page-2eee4f8914里面的具体的数据,假设现在想获取@type这个信息:
那么可以新建一个data element,命名为AA,选择Custom Code,然后将以下代码黏贴进去:
if(event && event.component && event.component.hasOwnProperty('@type')) { return event.component['@type']; }
这段代码的作用就是监听Rule里面的自定义代码触发的事件,然后返回具体的值。
设置后可以在浏览器控制台测试,看是否拿到信息:
已经拿到@type的值,同理可以拿到其他的值到data element。
然后将这些值设置成eVars或props发送给Adobe Analytics。
注意点:push覆盖的问题
ACDL连续push,会导致后面一个值覆盖掉前面的,如:
adobeDataLayer.push({ event: 'first push', foo: { bar: 'stamp' } }); adobeDataLayer.push({ event: 'second push', foo: { bar: 'baz' } });
这个是有两个push,但实际上后面的值会覆盖前面的,实际两个事件获取到都是baz,这个是Launch的bug,目前官方在处理它。
目前有两种处理方式:
- 一种是采用延迟发送的方式
- 一种是action里采用event的方式,如直接用%event.fullState.foo.bar%
ACDL的优点
ACDL是主动发送数据,可以有效避免原有的Adobe数据层,由于页面刷新导致的数据重发,数据更准确。
另外ACDL是建议和XDM的一些结合使用,实施AEP会更方便,但实际上不需要也可以的。
谷歌和Adobe的数据层差异请看:Google Analytics和Adobe Analytics中的数据层dataLayer