<?php␊ |
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ |
/*␊ |
# ***** BEGIN LICENSE BLOCK *****␊ |
# This file is part of Plume Framework, a simple PHP Application Framework.␊ |
# Copyright (C) 2001-2010 Loic d'Anterroches and contributors.␊ |
#␊ |
# Plume Framework is free software; you can redistribute it and/or modify␊ |
# it under the terms of the GNU Lesser General Public License as published by␊ |
# the Free Software Foundation; either version 2.1 of the License, or␊ |
# (at your option) any later version.␊ |
#␊ |
# Plume Framework is distributed in the hope that it will be useful,␊ |
# but WITHOUT ANY WARRANTY; without even the implied warranty of␊ |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the␊ |
# GNU Lesser General Public License for more details.␊ |
#␊ |
# You should have received a copy of the GNU Lesser General Public License␊ |
# along with this program; if not, write to the Free Software␊ |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA␊ |
#␊ |
# ***** END LICENSE BLOCK ***** */␊ |
␊ |
/**␊ |
* Funnel statistics.␊ |
*␊ |
* Funnels are easy to track but not that easy to generate statistics␊ |
* out of them.␊ |
*␊ |
* Stats are compiled "by GMT day", so you can track your funnel per␊ |
* day, week or more. Stats are put in cache in the "funnels" collection.␊ |
*␊ |
*/␊ |
class Pluf_AB_Funnel␊ |
{␊ |
/**␊ |
* Returns the list of funnels.␊ |
*␊ |
* @return array Funnels␊ |
*/␊ |
public static function getFunnels()␊ |
{␊ |
$db = Pluf_AB::getDb();␊ |
foreach (array('f', 't') as $k) {␊ |
// Once created, it will return immediately in the future␊ |
// calls so the overhead is negligeable.␊ |
$db->funnellogs->ensureIndex(array($k => 1), ␊ |
array('background' => true));␊ |
}␊ |
$nf = $db->command(array('distinct' => 'funnellogs', 'key' => 'f'));␊ |
if ((int) $nf['ok'] == 1) {␊ |
sort($nf['values']);␊ |
return $nf['values'];␊ |
}␊ |
return array();␊ |
}␊ |
␊ |
/**␊ |
* Get stats for a given funnel.␊ |
*␊ |
* @param $funnel string Funnel␊ |
* @param $period string Time period 'yesterday', ('today'), '7days', 'all'␊ |
* @param $prop string Property to filter (null)␊ |
*/␊ |
public static function getStats($funnel, $period='today', $prop=null)␊ |
{␊ |
$db = Pluf_AB::getDb();␊ |
$steps = array();␊ |
for ($i=1;$i<=20;$i++) {␊ |
$steps[$i] = array();␊ |
}␊ |
switch ($period) {␊ |
case 'yesterday':␊ |
$q = array('t' => array('$eq' => (int) gmdate('Ymd', time()-86400)));␊ |
break;␊ |
case 'today':␊ |
$q = array('t' => (int) gmdate('Ymd'));␊ |
break;␊ |
case '7days':␊ |
$q = array('t' => array('$gte' => (int) gmdate('Ymd', time()-604800)));␊ |
break;␊ |
case 'all':␊ |
default:␊ |
$q = array();␊ |
break;␊ |
}␊ |
$q['f'] = $funnel;␊ |
$uids = array();␊ |
// With very big logs, we will need to find by schunks, this␊ |
// will be very easy to adapt.␊ |
foreach ($db->funnellogs->find($q) as $log) {␊ |
if (!isset($uids[$log['u'].'##'.$log['s']])) {␊ |
$uids[$log['u'].'##'.$log['s']] = true;␊ |
$step = $log['s'];␊ |
$steps[$step]['name'] = $log['sn'];␊ |
if ($prop and !isset($steps[$step]['props'])) {␊ |
$steps[$step]['props'] = array();␊ |
}␊ |
$steps[$step]['total'] = (isset($steps[$step]['total'])) ?␊ |
$steps[$step]['total'] + 1 : 1;␊ |
if ($prop) {␊ |
$steps[$step]['props'][$log['p'][$prop]] = (isset($steps[$step]['props'][$log['p'][$prop]])) ?␊ |
$steps[$step]['props'][$log['p'][$prop]] + 1 : 1;␊ |
}␊ |
}␊ |
}␊ |
// Now, compile the stats for steps 2 to n␊ |
for ($i=2;$i<=20;$i++) {␊ |
if ($steps[$i] and $steps[$i-1]) {␊ |
//$steps[$i]['conv'] = sprintf('%d', (float)$steps[$i-1]['total']/$steps[$i]['total']*100.0);␊ |
$steps[$i]['conv'] = sprintf('%01.2f%%', (float)$steps[$i-1]['total']/$steps[$i]['total']*100.0);␊ |
$steps[$i]['conv1'] = sprintf('%01.2f%%', (float)$steps[$i-1]['total']/$steps[1]['total']*100.0);␊ |
}␊ |
}␊ |
␊ |
return $steps;␊ |
}␊ |
}␊ |