Проблема обновления предопределенного элемента данных DTM при анонимной функции

Если у меня есть предопределенный элемент данных под названием «CS Test», то:

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

Я хочу обновить значение элемента данных «CS Test» новым значением (например, «Обновленное значение») на основе правила, основанного на событии. Я не могу заставить это работать? Из предыдущего поста я понял, что при явном вызове _satellite.getVar('Example') порядок операций следующий:

  1. Найдите указанную цель для типа (например, путь (js var) для типа объекта JS) и верните это значение.
  2. Найдите файл cookie спутника и верните это значение.
  3. Вернуть значение по умолчанию

Так что не знаете, как обойти это, поскольку код элемента данных всегда выполняется и возвращает значение?


person Michael Johns    schedule 27.01.2015    source источник
comment
Итак, я рассмотрел этот сценарий в своем ответе на ваш последний вопрос ... вам нужно какое-то разъяснение? Вы можете либо переписать свою анонимную функцию, чтобы искать js var/object или cookie, которые вы можете переопределить (и затем следовать основным инструкциям по обновлению), либо вы можете напрямую обновить спутниковый cookie с новым значением, чтобы обойти полностью анонимная функция   -  person Crayon Violent    schedule 27.01.2015
comment
возможная копия обновления элемента данных Adobe DTM   -  person Crayon Violent    schedule 27.01.2015
comment
Привет, Crayon Violent, я попытался обновить файл cookie спутника, но код элемента данных все еще возвращает значение, поэтому он не возвращает значение файла cookie. Я что-то упускаю?   -  person Michael Johns    schedule 27.01.2015
comment
Вот в чем проблема: если я добавлю следующий код в раздел стороннего Javascript моего правила, основанного на событиях, я всегда получаю значение из исходного кода элемента данных: var _currCScriptDEValue = _satellite.getVar("CS Test"); console.log("Custom Script before update is : " + _currCScriptDEValue); _satellite.setCookie("_sdsat_CS Test","updated value from Event Rule",2); var _updatedCScriptDEValue = _satellite.getVar("CS Test"); console.log("Custom Script after update is : " + _updatedCScriptDEValue);   -  person Michael Johns    schedule 27.01.2015
comment
Моя точка зрения выше заключается в том, что обновление файла cookie спутника работает, но только до тех пор, пока я не вызову последний _satellite.getVar(CS Test), потому что он перезаписывает файл cookie спутника значением кода элемента данных и возвращает значение элемента данных.   -  person Michael Johns    schedule 27.01.2015


Ответы (1)


Моя точка зрения выше заключается в том, что обновление файла cookie спутника работает, но только до тех пор, пока я не вызову последний _satellite.getVar("CS Test"), потому что он перезаписывает файл cookie спутника значением кода элемента данных и возвращает значение элемента данных.

Итак, я собираюсь изложить здесь несколько разных мыслей, потому что вы не совсем поняли, что на самом деле делает ваша функция элемента данных, чего вы пытаетесь достичь в целом и т. д., так что, возможно, что-то из этого будет оба объясняют, как работает DTM, и помогают вам добраться туда, где вы должны быть.

Установка файла cookie элемента данных напрямую «работает» только для его обновления, когда DTM внутренне ссылается на него, например. (как уже упоминалось) последующие загрузки страницы. Кроме того, я думаю (но не проверял), что это будет работать при использовании синтаксиса %data_element% в полях правил.

Но, как упоминалось здесь (та же ссылка, которую я разместил в комментарии OP), когда вы явно вызываете _satellite.getVar(), это принудительно оценивает ваше правило элемента данных. Это означает, что код, который у вас есть (ваша анонимная функция), будет выполняться и делать то, что он делает.

И это звучит так, как будто вы хотите, чтобы DTM каким-то образом выполнил его, но выборочно игнорирует некоторые из них. Ну, это невозможно для DTM. Если вы хотите, чтобы произошло что-то подобное, вы должны переписать свою анонимную функцию, чтобы она позволяла делать что-то подобное. Но я вернусь к этому через мгновение, потому что сначала я хочу сделать шаг назад и спросить..

Почему вы вообще используете _satellite.getVar() сразу после записи файла cookie? Смысл записи непосредственно в файл cookie заключается в том, что вы обходите элемент данных. Что еще более важно, у вас уже есть значение, потому что вы только что установили с ним файл cookie.

Итак, возможно, вы только что объединили свой код для примера, и этот последующий вызов .getVar() находится в отдельном кодовом поле или иным образом выходит за рамки того, где вы установили файл cookie.

Как уже упоминалось, когда вы делаете явный вызов .getVar(), порядок операций DTM для возврата значения следующий:

  1. Оцените элемент данных. Это означает, что ваша анонимная функция будет выполнена. Если это возвращает истинное значение, это то, что вы получаете. Если он не возвращает истинное значение..

  2. Если это постоянный элемент данных, DTM ищет файл cookie _sdsat_[data element name]. Если он существует (и имеет истинное значение), это то, что вы получаете. Если нет, то..

  3. Вернуть значение, которое вы указали в качестве значения по умолчанию в конфигурации элемента данных (или undefined, если вы ничего не указали)

Итак, еще раз, я здесь как бы стреляю в темноту, потому что я не знаю деталей вашего элемента данных и конечной цели с ним, но мне кажется, что вы хотите иметь возможность вызывать .getVar(), но иметь порядок операции похожи на то, как это делает DTM при загрузке страницы (1 и 2 меняются местами). Ну, DTM не имеет встроенного способа сделать это. Было бы неплохо, если бы Adobe добавила параметры в конфигурацию элемента данных, чтобы указать порядок операций, поскольку очевидно, что он ведет себя по-разному, в зависимости от того, как ссылается на элемент данных (будь то сам DTM или вы). Но на данный момент у них этого нет.

Итак, если это то, что вы хотите, вам нужно реструктурировать свою анонимную функцию, чтобы она вел себя как DTM с постоянными слоями данных. По сути, добавьте к нему код, который ищет в файле cookie значение по умолчанию rvalue, затем возвращается к тому, что у вас есть сейчас. Затем это должно позволить вам делать явные вызовы .getVar(), потому что теперь ваша анонимная функция, которая выполняется первой, сначала будет искать значение cookie.

Другим вариантом может быть... предполагая, что весь этот код (а именно, неприятный последующий вызов .getVar()) находится в пределах одного и того же правила, но по какой-то причине выходит за рамки того, где вы устанавливаете файл cookie в первую очередь (например, в отдельном codebox), вы можете установить значение для другого элемента данных, созданного на лету, а затем ссылаться на него. Преимущество этого способа вместо простого чтения файла 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')();

Это вернет текущее значение или «по умолчанию [..]», если его нет.

Затем, если вы хотите установить новое значение, вы можете сделать это:

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

Это вернет «новое значение», и если вы сделаете последующие вызовы (область страницы):

_satellite.getVar('data_element')();

Он будет продолжать возвращать «новое значение».

Пример сценария:

_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. НЕ используйте файл cookie _sdsat_[data_element], поскольку сама функция хранится в файле cookie.

Session+ Persistence (сохранение от загрузки страницы до загрузки страницы)

Итак, для сохранения его в течение сеанса, от страницы к странице, вы можете сделать это, например:

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%. Ну, вы можете, но это не даст вам того, что вы хотите. В моем тестировании он возвращает строковую версию самой функции, но кто знает, как еще она может реагировать, в зависимости от браузера/версии. Просто не делай этого.

person Crayon Violent    schedule 29.01.2015
comment
Извините, я сам запутался. Я хотел бы динамически обновлять элемент данных с помощью анонимной функции, потому что я буду работать с инфраструктурой MVC, поэтому загружается только одна начальная страница. Я просто привел общий пример, потому что пытаюсь понять это теоретически. Итак, теоретически, да, я хотел бы каким-то образом обновить предопределенный элемент данных с помощью анонимной функции со значением, которое я передаю ему после его загрузки, но, похоже, нет способа обновить элемент данных, структурированный таким образом, без наличия код элемента данных срабатывает снова или обходится? - person Michael Johns; 30.01.2015
comment
@MichaelJohns на самом деле еще немного подумал об этом и поковырялся, и я думаю (надеюсь), что нашел то, что вы ищете. См. мое обновление в ответе выше - person Crayon Violent; 30.01.2015