在匿名功能时更新DTM预定义数据元素的问题

时间:2015-01-27 00:13:54

标签: adobe adobe-analytics

如果我有一个预定义的数据元素叫做" CS Test"如此:

return (function() { 
  var rvalue = "default custom script value from some data layer";
  return rvalue;
})();

我想更新" CS Test"具有新值的数据元素(例如"更新值")基于基于事件的规则。我无法让它发挥作用?我从上一篇文章中了解到,当您明确调用_satellite.getVar('示例')时,操作顺序是:

  1. 查找类型的指定目标(例如JS对象的路径(js var))并返回该值
  2. 查找卫星cookie并返回该值
  3. 返回默认值
  4. 所以不确定如何解决这个问题,因为数据元素代码总是被执行并返回一个值?

1 个答案:

答案 0 :(得分:2)

  

我的观点是更新卫星cookie有效,但直到我调用最后一个_satellite.getVar(" CS Test"),因为它用数据元素代码的值覆盖卫星cookie并返回数据元素的值。

好的,我将在这里列出几个不同的想法,因为你已经清楚你的数据元素功能真正做了什么,你想要实现什么,等等。所以,其中一些可能会澄清DTM的工作原理,并帮助您达到您需要的位置。

仅直接设置数据元素的cookie"工作"用于在DTM内部引用它时更新它,例如(如上所述)后续页面加载。此外,我认为(但尚未测试)在规则字段中使用%data_element%语法时它将起作用。

但是,as mentioned here我在OP评论中发布的相同链接),当您明确地调用_satellite.getVar()时,它会强制评估您的数据元素规则。这意味着你在那里的代码(你的匿名函数)将被执行,并做它做的任何事情。

听起来就好像你想让DTM以某种方式执行它,但有选择地忽略其中一些。嗯,DTM无法做到这一点。如果你想要这样的事情发生,那么你必须重写你的匿名函数以适应这样的事情。但是我会马上回到这一点,因为首先我想退一步问......

为什么你甚至在写完cookie后立即使用_satellite.getVar()?直接写入cookie的关键是你绕过数据元素。更重要的是,你已经拥有了这个价值,因为你只需要用它设置cookie

因此,为了示例,您可能只是整合了代码,并且后续.getVar()调用位于单独的代码框中,或者在您设置cookie的范围之外。

如上所述,当您明确调用.getVar()时,DTM返回值的操作顺序为

  1. 评估数据元素。这意味着你的匿名函数会 执行。如果这返回真值,那就是你得到的。如果它 不会返回真正的价值..

  2. 如果它是持久性数据元素,DTM将查找_sdsat_[data element name] cookie。如果它存在(并具有真实价值),那就是 你得到什么。如果没有,那么......

  3. 返回您指定的值作为数据中的默认值 element config(如果你没有指定任何内容,则为undefined)

  4. 所以再一次,我在黑暗中有点射击,因为我不知道你的数据元素和最终目标的细节,但它听起来像你希望能够调用.getVar()但操作顺序与DTM在页面加载时的操作方式相同(1和2相反)。嗯,DTM没有内置的方法来做到这一点。如果Adobe在数据元素配置中添加选项以指定操作顺序,那将是很好的,因为显然它的行为有所不同,具体取决于数据元素的引用方式(无论是DTM本身还是由您引用)。但他们此时并没有这样做。

    因此,如果这是您想要的,那么您需要重构您的匿名函数,使其更像DTM与持久数据层的行为。基本上,添加代码来查找cookie的默认值为rvalue然后会回到现在的状态。这应该允许您对.getVar()进行显式调用,因为现在首先执行的匿名函数将首先查找cookie值。

    另一种选择可能是......假设所有这些代码(即麻烦的后续.getVar()调用)都在同一规则内,但无论出于什么原因超出了你在第一个范围内设置cookie的范围在(例如,在单独的代码框中),您可以将值设置为不同的,即时创建的数据元素,然后引用它。以这种方式执行此操作而不仅仅是读取cookie的好处是,它将它暴露给数据元素,以便您还可以使用%data_element%语法(从您设置它的位置,向前移动),如果您需要。

    <强>更新

    好的,根据后续评论,我正在玩DTM,看起来你可以做以下事情,这可能就是你要找的东西。

    页面范围持久性

    例如,在预定义的数据元素中,您可以使用以下内容:

    return function(rvalue) { 
      _satellite.data.customVars._defaultRvalue = 
        rvalue
        ||
        _satellite.data.customVars._defaultRvalue
        ||
        "default custom script value from some data layer"
      ;
      return _satellite.data.customVars._defaultRvalue;
    }
    

    然后,要获得当前值,您可以这样做:

    _satellite.getVar('data_element')();
    

    这将返回当前值或&#34;默认[..]&#34;如果没有。

    然后,如果要设置新值,可以执行以下操作:

    _satellite.getVar('data_element')('new value');
    

    这将返回&#34;新值&#34;,如果您进行后续调用(页面范围):

    _satellite.getVar('data_element')();
    

    它将继续返回&#34;新价值&#34;。

    示例场景:

    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // returns 'foo'
    _satellite.getVar('data_element')(); // returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    _satellite.getVar('data_element')(); // returns 'bar'
    

    注意:这仅适用于页面的持续时间。如果您需要它在页面之间保持不变,则需要设置并从cookie中绘制。不要使用_sdsat_[data_element] cookie,因为函数本身存储在cookie中。

    会话+持久性(从页面加载持续到页面加载)

    因此,为了在整个会话期间保持它,从一个页面到另一个页面,您可以执行此操作,例如:

    return function(rvalue) { 
      var rvalue=
        rvalue
        ||
        _satellite.readCookie('rvalue')
        ||  
        "default custom script value from some data layer"
      ;
      _satellite.setCookie('rvalue',rvalue);
      return _satellite.readCookie('rvalue');
    }
    

    示例场景:

    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // still on same page, returns 'foo'
    _satellite.getVar('data_element')(); // still on same page, returns 'foo'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'bar'
    

    注意:关于这样做的一个主要警告是,因为您实际上使.setVar方法成为函数的包装器,所以您将无法在表单字段中引用它具有%data_element%语法的规则。好吧,你可以,但它不会给你你想要的东西。在我的测试中,它返回函数本身的字符串化版本,但是谁知道它可能会如何反应,具体取决于浏览器/版本。不要这样做。