前回の記事(ga.js: 新規セッション管理部分)で、initData内の3つの処理
- 新規セッションなのかどうか(utma, utmb, utmc)
- utmvの処理(setVar, setCustomVar)に関する所
- utmzの処理(referrerを、どうutmzに組み込むか)
の1のセッションの新規・既存管理部分をみました。(b.pc())
今回は、2のutmv処理部分。
そのまえに、utmv部分についての話を少し。
これは、analyticsユーザが自由にデータにラベル付けをできる部分です。
ユーザ定義という表現でレポート画面に出ています。
(カスタム変数が使えるようになっているとのアナウンスがありますが、まだ私の所には導入されてないようです)
ユーザ定義は、apiを使って、利用者が自由にユーザをラベル付けできる部分なので、能動的?な解析が可能になります。
(カスタム変数では、ユーザ、セッション、ページの各レベルでラベリングが可能になってます。ラベリングというより、タグ付けという感じですが)
今回は、utmvmanager.tc()という処理。b.pcの後の処理です。(変数名は、前回同様、私が勝手に付けたものです)
- cookieからutmvに関する部分を読み出して、setVarの部分を除けておく。
- 読み出したものを、utmvmanager.data変数にsetする。
- cvmanager(送信時のutmv部分の文字列作成用オブジェ)に値をsetする
- scopeが1 ユーザレベルでのカスタム変数部分を取り出して、setVar部分の文字列に足す。
- 文字列があれば、cookieにutmvとして保存する。
- なければ、cookieに、utmvは ”” 空文字、セッション限りのものとする。
こんな流れになってるようです。cookieから値を読んで、送信用に値を設定してるだけでした。
ちょっと長いですが、今回の流れで登場するオブジェクトのUtmvManager, CvManager(私がつけた変数名)に関するコードのコメントを貼り付けて起きます。いろいろ勘違いはあると思います。
//utmv管理オブジェクト initDataから呼ばれる
Z.UtmvManager = function (f, i, b, j) {
//qは初期化オブジェクト, pはドメインハッシュ, c.Oはcookiemanager, eは$.CvManager
var utmvmanager = this,
domainhash = i,
m = "=",
dfvls = f,
cvmanager = j; //cvmanager
utmvmanager.cookiemanager = b; //cookiemanager O
utmvmanager.oldsetvar = ""; //sa
utmvmanager.data = {}; //値がstoreされる
//initDataから呼ばれる
utmvmanager.tc = function () {
var h;
//cookieの値を読んで、domain-hashを見て、utmv値を取り出す("."以降)
h = GaSplit(Q(utmvmanager.cookiemanager.getCookieStr(), "__utmv=" + domainhash + ".", ";"), domainhash + ".")[1];
if (!NoVl(h)) {
h = h.split("|");
//1, {}, "|" ?? utmvmanager.dataに値がsetされる gの定義は下
// {index: [key,value,scope]}の形
setting(1, utmvmanager.data, h[1]);
//旧式のsetvarの値
utmvmanager.oldsetvar = h[0];
//cvmanagerオブジェにset
utmvmanager.setInKvoperator();
}
};
//実際にcookieにutmvの値を書き込みする
//utmvmanager.dataオブジェクトが書き込みされる
utmvmanager.setInKvoperator = function () {
utmvmanager.clearAndSet(); //値を設定し直す、内部でkvopertorにデータをset
var h = utmvmanager.oldsetvar, //setvarの代入
k, n, r = "";
//scope-level=>1 "user-level" rに代入
for (k in utmvmanager.data){
if ((n = utmvmanager.data[k]) && 1 === n[2]){
r += k + m + n[0] + m + n[1] + m + 1 + ",";
}
}
//rに値があれば(user-levelがあれば)
NoVl(r) || (h += "|" + r);
//setvar, user-levelに値がなければ
if (NoVl(h)){
//utmvに、値なし期限無しのcookie書き込み,
utmvmanager.cookiemanager.Vb();
//あれば
}else {
//utmvに値をset
utmvmanager.cookiemanager.Aa(domainhash + "." + h);
//utmvに、実際に、cookie書き込み
utmvmanager.cookiemanager.Fa();
}
};
//setVar用の設定
utmvmanager.setSetVar = function (h) {
utmvmanager.oldsetvar = h;
utmvmanager.setInKvoperator();
};
//setCustomVarの設定用
//b._setCustomVarをcallした時は、initData()のあとに、これが呼ばれる
//pageTracker内で作られたutmv
utmvmanager.setSetCustomVar = function (h, k, n, r) { //[index, name, value, scope]
if (1 != r && 2 != r && 3 != r) r = 3; //指定がない場合は3(page-level)
var a = false;
if (k && n && h > 0 && h <= dfvls.maxSlot) { // dfvls.obは indexの最大値制限 5
k = GaEncode(k);
n = GaEncode(n);
if (k["length"] + n["length"] <= 64) {
utmvmanager.data[h] = [k, n, r]; //{index, [name, value, scope]}というデータ構造
utmvmanager.setInKvoperator();
a = true;
}
}
return a;
};
//getVisitorCustomVar用
utmvmanager.mc = function (h) {
if ((h = utmvmanager.data[h]) && 1 === h[2]) return h[1];
};
utmvmanager.Ub = function (h) {
var k = utmvmanager.data;
if (k[h]) {
delete k[h];
utmvmanager.setInKvoperator();
}
};
//utmvの値をclearして、setし直す
utmvmanager.clearAndSet = function () {
cvmanager._clearKey(8); //"k"が8のvalueをclear
cvmanager._clearKey(9); //"k"が9のvalueをclear
cvmanager._clearKey(11); //"k"が11のvalueをclear
var h = utmvmanager.data,
k, n;
//転置のイメージ、utmvmanager.dataの長さと同じ長さの配列を作る
//cvmanagerにデータをsetしていく
for (n in h){
if (k = h[n]) { //=に注意、==でない
//cvmanager._setKey(8or9or11, index, value)という形
cvmanager._setKey(8, n, k[0]); //nameは8
cvmanager._setKey(9, n, k[1]); //valueは9
//3 != k => user, sessionなら書き込み scopeをset
(k = k[2]) && 3 != k && cvmanager._setKey(11, n, "" + k); //scopeは11
}
}
};
//値のset
function setting(h, data, n) {
var r;
if (!NoVl(n)) {
n = n.split(",");
for (var a = 0; a < n["length"]; a++) {
r = n[a];
if (!NoVl(r)) {
r = r.split(m); //m=>"="
if (r["length"] == 4) data[r[0]] = [r[1], r[2], h]; //kに値が入る
}
}
}
}
};
//key-value操作用 utmv用オジェ、 メインオブジェから呼ばれる
//3階層オブジェクトを作り、読む keyは文字列、valueは数字
//Mainオブジェクトのプロパティとして入る
Z.CvManager = function () {
var cvmanager = this, //f = this
i = {}, //メインーインスタンスーオブジェクト
//b = "k",
//j = "v",
c = ["k", "j"]; //"k", "v"
//p = "(",
//m = ")",
/*
q = "*",
e = "!",
g = "'",
h = {};
h[g] = "'0";
h[m] = "'1";
h[q] = "'2";
h[e] = "'3";
*/
var k = 1,
h = {"'":"'0", ")":"'1", "*":"'2", "!":"'3"};
//Setter
function setter(o, u, y, B) {
if (undefined == i[o]) i[o] = {};
if (undefined == i[o][u]) i[o][u] = [];
i[o][u][y] = B;
debugger;
}
//Getter
function getter(o, u, y) {
return undefined != i[o] && undefined != i[o][u] ? i[o][u][y] : undefined;
}
//Deleter
function deleter(o, u) {
if (undefined != i[o] && undefined != i[o][u]) {
i[o][u] = undefined;
u = true;
var y;
for (y = 0; y < ["k","v"]["length"]; y++) {
if (undefined != i[o][["k","v"][y]]) {
u = false;
break
}
}
if (u) i[o] = undefined;
}
}
function buildStrByNum(o) { //d
var u = "",
y = false,
B, O; //c => ["k", "v"]
for (B = 0; B < c["length"]; B++) {
O = o[c[B]];
if (undefined != O) {
if (y) u += c[B];
u += l(O);
y = false;
}else{
y = true;
}
}
return u;
}
function l(o) {
var u = [],
y, B;
for (B = 0; B < o["length"]; B++) if (undefined != o[B]) {
y = "";
if (B != k && undefined == o[B - 1]) y += B.toString() + "!";
y += t(o[B]);
GaPush(u, y);
}
return "(" + u.join("*") + ")";
}
function t(o) {
var u = "",
y, B, O;
for (y = 0; y < o["length"]; y++) {
B = o.charAt(y);
O = h[B];
u += undefined != O ? O : B;
}
return u;
}
cvmanager.qc = function (o) {
return undefined != i[o];
};
//b.Lc(trackPageview)から呼ばれる,送信用文字列を作成
cvmanager.getCustomVarStr = function () {
var o = "",
u;
for (u in i){
if (undefined != i[u]){
o += u.toString() + buildStrByNum(i[u]);
}
}
return o;
};
//b._sendXEventからcallされる,送信文字列作成用
cvmanager.Ac = function (cvmanager_local) {
if (cvmanager_local == x) return cvmanager.getCustomVarStr();
//uの例 : "5(category*action)"
var u = cvmanager_local.getCustomVarStr(),
y;
for (y in i){
if (undefined != i[y] && !cvmanager_local.qc(y)){
u += y.toString() + buildStrByNum(i[y]);
}
}
return u;
};
//clearAndSetから呼ばれる
cvmanager._setKey = function (either_8_9_11, i, name) {
if (typeof name != "string") return false;
//elementOfUtmvDataは順番i["8"]["k"] = x xが配列でnがインデクサで、nameがvalue
setter(either_8_9_11, "k", i, name);
return true;
};
//真っ当な数字であること
cvmanager._setValue = function (o, u, y) {
if (typeof y != "number" && (undefined == Number || !(y instanceof Number)) || Math.round(y) != y || y == NaN || y == Infinity) return false;
//uは順番
setter(o, "v", u, y.toString());
return true;
};
cvmanager._getKey = function (o, u) {
return getter(o, "k", u);
};
cvmanager._getValue = function (o, u) {
return getter(o, "v", u);
};
cvmanager._clearKey = function (o) {
deleter(o, "k"); //o は 8 or 9 0r 11
};
cvmanager._clearValue = function (o) {
deleter(o, "v");
};
};
//End of CvManager
こちらもあわせてどうぞ