es hora de Campamento de medidas ¡de nuevo! Como antesquiero escribir una publicación adjunta a mi sesión, ya que siempre hay mucho más que decir de lo que permite el horario. Entonces, el tema de este artículo es el modelo de datos utilizado por Administrador de etiquetas de Google para procesar datos digitales en su capa de datos.
Esta publicación también continúa donde lo dejé en mi incursión anterior en el capa de datos. Sin embargo, mientras que el primer artículo pretendía ser genérico (ya que la capa de datos debería ser genérica), esta publicación analizará cómo GTM usa la información en la capa de datos genérica y cómo procesa esta información para trabajar con las características patentadas del herramienta.
El diagrama anterior debería aclarar mi punto (teme mis habilidades de conversión de PowerPoint a imagen).
Tenemos datos que pasan a través de sus sistemas backend hasta su sitio internet. Algunos de estos datos se utilizan para crear el sitio internet con sus imágenes y funcionalidades, y algunos de estos datos se almacenan en la capa de datos para ser utilizados por otras herramientas y aplicaciones conectadas al sitio internet.
Google Tag Supervisor no accede directamente a la estructura de la capa de datos, ya que eso comprometería el propósito genérico e independiente de las herramientas de la capa de datos. Más bien, extrae datos de la capa de datos, los almacena en su modelo de datos abstracto interno y los utiliza. eso para procesar los datos digitales.
Dado que vivimos en un mundo de múltiples proveedores, donde las herramientas y aplicaciones internet aparecen como hongos después de la lluvia, es importante respetar la capa de datos genérica. Depende de la sofisticación de la propia herramienta utilizar estos datos, pero debe hacerse de una manera no invasiva, utilizando métodos de extracción en lugar de empuje.
capa de datos | Modelo de datos |
---|---|
Independiente de las herramientas | Específico de la herramienta |
Genérico | Único |
Accedido directamente | Accedido a través del ayudante |
Estructurado | Abstracto |
Existe una diferencia entre capa de datos y modelo de datos. Para algunos puede parecer muy sutil, pero en realidad es lo que garantiza que la capa de datos siga siendo un contenedor de datos estandarizado y gratuito. El modelo de datos, por otro lado, se construye según las especificaciones propias de cada plataforma, pero la forma en que se comunica con la capa de datos debe ser limpia y tal vez incluso estandarizada, ya que sólo así podremos asegurar que una sola herramienta no arruine. la capa de datos para todos.
incógnita
El boletín a fuego lento
Suscríbete al Boletín a fuego lento para recibir las últimas noticias y contenido de Simo Ahava en su bandeja de entrada de correo electrónico.
Configurando la prueba
La forma más acquainted de acceder al modelo de datos de GTM es a través de la macro variable de capa de datos. Cuando llamas a este tipo de macro, sucede lo siguiente:
-
La macro sondea el modelo de datos a través de un método de interfaz.
-
Si se encuentra una clave con el nombre de variable dado, se devuelve su valor
-
Si no se encuentra ninguna clave,
undefined
se devuelve en su lugar
Para los fines de este artículo, ahora crearé un probador que le mostrará cómo funciona el modelo de datos. El probador es una etiqueta HTML personalizada que se activa ante un determinado evento (‘dlTest’). Cuando se activa, imprime el contenido de la macro variable de capa de datos en la consola de JavaScript.
La macro en sí es solo una macro de capa de datos que hace referencia al nombre de la variable. clave de prueba:
Así que ahora, cada vez que quiero ver cuál es la clave clave de prueba contiene en el modelo de datos, solo tengo que escribir lo siguiente en la consola:
dataLayer.push({'occasion' : 'dlTest'});
A continuación, publicaré mi contenedor y probaré esto. Así es como se ve la consola ahora si ejecuto el evento:
El undefined
es lo que realmente devuelve la macro. FALSO se devuelve porque la inserción del evento activó una etiqueta.
Agregar y modificar la clave
Empecemos de forma sencilla. Agregaré algunos valores a la clave y veré cómo reacciona la macro:
Aquí están los empujones en orden:
-
'string'
– cadena -
1
– número -
(1, 2, 3
) – Formación -
{'key' : 'worth'}
– objeto -
true
– booleano -
perform() { return undefined; }
– función
Como puedes ver, la interfaz get()
La función solo devuelve el último valor. dataLayer
sin embargo, tiene todos los valores:
Estas son las conclusiones clave:
-
El modelo de datos no es lo mismo que la capa de datos. Todos los valores que introduje anteriormente se pueden encontrar en la capa de datos, pero solo el valor más reciente se almacena en el modelo de datos.
-
Al enviar un valor de diferente tipo, el valor anterior se sobrescribe completamente en el modelo de datos.
Eso es bastante easy, ¿verdad? Bueno, intentemos actualizar el valor con otro valor del mismo tipo próximo.
Aquí están los empujones en orden:
-
'string'
+'newString'
=>'newString'
-
1
+5
=>5
-
(1, 2, 3)
+(4, 5)
=>(4, 5, 3)
*¿EH? -
{'key' : 'worth'}
+{'newKey' : 'worth'}
=>{'key' : 'worth', 'newKey' : 'worth'}
*¿Qué carajo?
Los valores primitivos funcionan como se esperaba. Insertar otro valor del mismo tipo simplemente sobrescribe el valor anterior. Sin embargo, el Array y el objeto easy se comportan de manera muy extraña.
Esto se debe a que cuando empujas un Array encima de un Array o un objeto easy encima de un objeto easy, la interfaz realiza una fusión recursiva. Es decir, verifica si las claves dentro del objeto o matriz que se están enviando ya existen. Si lo hacen, sus valores se actualizan, pero todas las demás claves se dejan en paz.
Es fácil de entender si observas cómo se comporta el objeto easy.
Primero, empujas un objeto con la llave. ‘llave’ con el valor ‘valor’. A continuación, empujas un objeto con la llave. ‘nueva clave’ con el valor ‘valor’. Ahora, ‘llave’ no es lo mismo que ‘nueva clave’entonces el objeto easy es actualizadono reemplazado.
Pero ¿qué pasa con la matriz? estoy empujando (4, 5)
que no tienen nada en común con (1, 2, 3)
. ¿No debería ser el resultado remaining
(4, 5)
o
(1, 2, 3, 4, 5)
o incluso
((1, 2, 3), (4, 5))
?
Seguramente (4, 5, 3)
es un error?
No, si conoces tu JavaScript. Una matriz es un tipo de objeto. También tiene claves con las que puede acceder a los valores que contiene. Las claves comienzan desde 0 y van subiendo hasta que no haya más miembros en el Array. Entonces, la primera matriz se parece a esto:
(1, 2, 3)
Tecla 0: Valor 1 Tecla 1: Valor 2 Tecla 2: Valor 3
La segunda matriz se ve así:
(4, 5)
Tecla 0: Valor 4 Tecla 1: Valor 5
Ahora, la combinación recursiva detecta estas claves compartidas (0 y 1) y actualiza sus valores en consecuencia. La tercera tecla (2) no se toca, ya que el Array que se presionó en segundo lugar no tenía valor para ella.
Pronto exploraremos cómo agregar datos a matrices existentes.
Eliminar una clave del modelo de datos
Si tiene una aplicación de una sola página y la capa de datos persiste durante toda la sesión, es posible que desee eliminar algunas variables del modelo de datos de vez en cuando. Simplemente quitando la llave de dataLayer
no será suficiente:
Esto es lo que sucede:
-
Presiono ‘simoahava’ como valor de ‘testKey’, esto lo registra la macro
-
Elimino todo este objeto de
dataLayer
-
Verifico esto mirando el contenido de
dataLayer
-
Sin embargo, el modelo de datos aún mantiene el valor más reciente.
En realidad, esta es una característica importante del modelo de datos. El modelo de datos trata dataLayer
como un cola o un bus de mensajes, por así decirlo. Funciona según el principio de primero en entrar, primero en salir, lo que significa que tan pronto como algo se introduce dataLayer
se procesa y sus valores se almacenan en el modelo de datos.
No funcionaría si el modelo de datos eliminara una clave si se elimina de dataLayer
. Es posible que tenga varias pulsaciones de la misma tecla con diferentes valores (por ejemplo, “evento”). ¿Cómo sabría el modelo de datos si simplemente está limpiando objetos de la estructura de matriz international en lugar de pedir que se eliminen del modelo de datos?
Un método de eliminación en la interfaz podría ser una buena concept, pero es igual de fácil adoptar el enfoque genérico y presionar undefined
como el valor de la clave. Esto almacenará undefined
en el modelo de datos también, lo que significa que será, para todos los efectos, como si la clave ya no existiera.
Así de easy es.
La matriz de comandos
Aquí es donde te dejé colgado antes. Supongamos que desea actualizar una matriz agregando miembros al remaining o en el medio. Es muy difícil hacerlo de forma genérica, ya que primero es necesario recuperar el Array del modelo de datos, agregar miembros al remaining o al medio y luego empujarlo hacia atrás. Y todo tiene que suceder dentro de la capa de datos, porque no queremos que todas las demás herramientas y plataformas que utilizan la capa de datos queden afuera.
La forma de hacerlo es utilizar un especial. matriz de comando. Le permite acceder a métodos del tipo de valor que ha almacenado en el modelo de datos.
Así es como funciona. Voy a actualizar un Array (1, 3)
primero con dos nuevos miembros usando push()
para que se convierta (1, 3, 4, 5)
. A continuación haré un splice()
donde agrego el número 2 en el lugar que le corresponde. Observe de cerca.
Como puede ver, la matriz de comandos tiene su sintaxis especial. En primer lugar, debe insertar una matriz en la capa de datos, no un objeto como lo harías normalmente.
A continuación, el primer miembro de la matriz debe ser una cadena que contenga el comando actual. El resto de los miembros de la matriz de comandos son argumentos para este comando.
De este modo, testKey.push(4,5)
se convierte ('testKey.push', 4, 5)
y testKey.splice(1,0,2)
se convierte ('testKey.splice', 1, 0, 2)
.
De esta manera puedes hacer algunas cosas interesantes con los valores almacenados en el modelo de datos sin tener que acceder a ellos directamente. El uso de la capa de datos garantiza que otras herramientas y aplicaciones también puedan beneficiarse de sus modificaciones.
Métodos personalizados
Lo último que les mostraré es cómo realizar algunas transformaciones personalizadas en los valores almacenados en el modelo de datos.
Digamos que estoy almacenando un montón de productos y tiendas en la capa de datos. Estos datos son proporcionados por el sistema backend. Resulta que uno de los nombres de la tienda está mal escrito y esto debe corregirse en el modelo de datos. Realizar una serie de tomas y sequence sería engorroso y muy ineficaz. En cambio, puedo simplemente presionar una función que haga todo esto en un bucle for easy.
Cuando insertas una función en la capa de datos, this
será la interfaz del modelo de datos en la página. Expone dos métodos: get(key)
y set(key, worth)
.
Primero, uso get()
para recuperar el valor de 'testKey'
. Luego, hago un bucle for que recorre cada miembro en el 'testKey'
Array, buscando el error tipográfico. Si se encuentra un error tipográfico, se corrige en el momento. Debido a que estoy tratando con objetos, no tienes que volver a insertar nada en el modelo de datos, ya que en realidad has copiado una referencia de objeto, no el objeto en sí.
No te preocupes por esa palabrería sobre objetos. La clave aquí es que realicé una transformación de los datos en el modelo de datos utilizando la capa de datos. De esta manera, otros proveedores y herramientas también pueden beneficiarse del cambio. También podría haber accedido directamente al método público de la interfaz, pero esa no sería la forma genérica de hacer las cosas.
Resumen
Esta ha sido una publicación complicada, lo sé, pero aquí están las cosas que deberías haber aprendido.
-
La capa de datos de la página y el modelo de datos utilizado por el administrador de etiquetas no son lo mismo
-
La capa de datos es genérica, independiente de las herramientas y todas las aplicaciones que pueden acceder al espacio de nombres international pueden acceder a ella.
-
El modelo de datos es interno del administrador de etiquetas, es abstracto (aquí no hay matrices) y tiene una interfaz pública con solo dos métodos.
-
Ciertos valores (matrices, objetos planos) se comportan de forma errática cuando intentas actualizarlos con una pulsación common.
-
Siempre debe realizar todas las adiciones, eliminaciones y transformaciones utilizando la capa de datos y no accediendo directamente a la interfaz del modelo de datos.
Si quieres darle un toque más geek, echa un vistazo a Ayudante de capa de datos especificación en GitHub, escrita por el propio Brian Kuhn de GTM. Ahí es donde se aprendieron la mayoría de las lecciones aquí.
Es muy importante comprender las sutilezas de la capa de datos y el modelo de datos. Uno es (o debería ser) independiente de la herramienta, el otro es una característica patentada de la herramienta. Uno puede estandarizarse para servir a múltiples proveedores y plataformas, el otro debe atender las idiosincrasias de cada herramienta por separado.
Mi presentación “Google Tag Supervisor para nerds” de MeasureCamp V