summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--css/stats.css4
-rw-r--r--includes/bit_setup_inc.php4
-rw-r--r--referrers.php98
-rw-r--r--templates/referrer_stats.tpl50
-rw-r--r--templates/referrer_stats_ctm_inc.tpl28
5 files changed, 109 insertions, 75 deletions
diff --git a/css/stats.css b/css/stats.css
new file mode 100644
index 0000000..6fdbd5e
--- /dev/null
+++ b/css/stats.css
@@ -0,0 +1,4 @@
+.referrer-stats .depth-1 { background-color:#fff; }
+.referrer-stats .depth-2 { background-color:#eee; }
+.referrer-stats .depth-3 { background-color:#ddd; }
+.referrer-stats .depth-4 { background-color:#ccc; }
diff --git a/includes/bit_setup_inc.php b/includes/bit_setup_inc.php
index 2ccdf02..0ceff6a 100644
--- a/includes/bit_setup_inc.php
+++ b/includes/bit_setup_inc.php
@@ -68,7 +68,7 @@ if( $gBitSystem->isPackageActive( 'stats' )) {
function stats_referer_display_short( $pRefererUrl ) {
$ret = '';
- if( $urlHash = parse_url( $pRefererUrl ) ) {
+ if( ($urlHash = parse_url( $pRefererUrl )) && !empty( $urlHash['host'] ) ) {
$ret = $urlHash['host'];
// q= google and bing search param, p= yahoo search param
$searchStrings = array( 'q', 'p' );
@@ -82,7 +82,7 @@ if( $gBitSystem->isPackageActive( 'stats' )) {
}
}
} else {
- $ret = tra( 'Unknown URL' );
+// $ret = tra( 'Unknown URL' );
}
return $ret;
}
diff --git a/referrers.php b/referrers.php
index 0897f8d..7936b03 100644
--- a/referrers.php
+++ b/referrers.php
@@ -10,7 +10,7 @@
* required setup
*/
require_once( '../kernel/includes/setup_inc.php' );
-include_once ( STATS_PKG_PATH.'Statistics.php');
+include_once ( STATS_PKG_CLASS_PATH.'Statistics.php');
$gBitSystem->verifyPackage( 'stats' );
$gBitSystem->verifyFeature( 'stats_referers' );
@@ -46,52 +46,82 @@ foreach( array_keys( $referers ) as $k ) {
require_once( BITCOMMERCE_PKG_CLASS_PATH.'CommerceStatistics.php' );
$revenue = $gCommerceStatistics->getCustomerRevenue( array( 'customers_id' => $referers[$k][$r]['user_id'] ) );
$referers[$k][$r]['revenue'] = $revenue;
- }
- if( !empty( $url['query'] ) ) {
- $urlParams = array();
- parse_str( $url['query'], $urlParams );
- if( !empty( $urlParams['adurl'] ) ) {
- $adUrl = parse_url( $urlParams['adurl'] );
- if( !empty( $adUrl['query'] ) ) {
- $adParams = array();
- parse_str( $adUrl['query'], $adParams );
- foreach( $adParams as $key => $value ) {
+ if( !empty( $url['query'] ) ) {
+ $urlParams = array();
+ parse_str( $url['query'], $urlParams );
+ if( !empty( $urlParams['adurl'] ) ) {
+ $adUrl = parse_url( $urlParams['adurl'] );
+ if( !empty( $adUrl['query'] ) ) {
+ $adParams = array();
+ computeStatsTree( $aggregateStats, $k, $adUrl['query'], $revenue, $referers[$k][$r] );
+ } else {
+ $key = 'Paid';
+ $value = $adUrl['path'];
computeStats( $aggregateStats, $k, $key, $value, $revenue, $referers[$k][$r] );
}
} else {
- $key = 'Paid';
- $value = $adUrl['path'];
- computeStats( $aggregateStats, $k, $key, $value, $revenue, $referers[$k][$r] );
- }
- } else {
- // bing paid query
- foreach( array( 'pq' => 'Paid', 'q' => 'Organic', 'p' => 'Organic', 'unknown' => 'Unknown' ) as $key=>$title ) {
- if( $key == 'unknown' || isset( $urlParams[$key] ) ) {
- $value = BitBase::getParameter( $urlParams, $key, 'unknown' );
- computeStats( $aggregateStats, $k, $title, $value, $revenue, $referers[$k][$r] );
- break;
+ // bing paid query
+ foreach( array( 'pq' => 'Paid', 'q' => 'Organic', 'p' => 'Organic', 'unknown' => 'Unknown' ) as $key=>$title ) {
+ if( $key == 'unknown' || isset( $urlParams[$key] ) ) {
+ $value = BitBase::getParameter( $urlParams, $key, 'unknown' );
+ computeStats( $aggregateStats, $k, $title, $value, $revenue, $referers[$k][$r], BitBase::getParameter( $urlParams, $key, $key ) );
+ break;
+ }
}
}
}
+ @$aggregateStats[$k]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['info']['orders'] += $revenue['total_orders'];
}
- if( !empty( $revenue['total_orders'] ) ) {
- @$aggregateStats[$k]['revenue'] += $revenue['total_revenue'];
- @$aggregateStats[$k]['orders'] += $revenue['total_orders'];
+ }
+}
+
+function computeStatsTree( &$aggregateStats, $k, $queryUrl, $revenue, &$userHash ) {
+ parse_str( $queryUrl, $adParams );
+ if( isset( $adParams['ctm_campaign'] ) && isset( $adParams['ctm_adgroup'] ) && isset( $adParams['ctm_term'] ) ) {
+ $key = 'PPC';
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['values'][$adParams['ctm_term']]['info']['title'] = $adParams['ctm_term'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['values'][$adParams['ctm_term']]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['values'][$adParams['ctm_term']]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['values'][$adParams['ctm_term']]['info']['users'][] = $userHash;
+
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['info']['title'] = $adParams['ctm_adgroup'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['values'][$adParams['ctm_adgroup']]['info']['users'][] = $userHash;
+
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['info']['title'] = $adParams['ctm_campaign'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['values'][$adParams['ctm_campaign']]['info']['users'][] = $userHash;
+
+ @$aggregateStats[$k]['values'][$key]['info']['title'] = $key;
+ @$aggregateStats[$k]['values'][$key]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['info']['users'][] = $userHash;
+ } else {
+ foreach( $adParams as $key => $value ) {
+ computeStats( $aggregateStats, $k, $key, $value, $revenue, $userHash );
}
}
}
-function computeStats( &$aggregateStats, $k, $key, $value, $revenue, $userHash ) {
- if( !empty( $revenue['total_orders'] ) ) {
- @$aggregateStats[$k]['values'][$key]['values'][$value]['revenue'] += $revenue['total_revenue'];
- @$aggregateStats[$k]['values'][$key]['values'][$value]['orders'] += $revenue['total_orders'];
- @$aggregateStats[$k]['values'][$key]['revenue'] += $revenue['total_revenue'];
- @$aggregateStats[$k]['values'][$key]['orders'] += $revenue['total_orders'];
+function computeStats( &$aggregateStats, $k, $key, $value, $revenue, &$userHash, $subKey = NULL ) {
+ @$aggregateStats[$k]['values'][$key]['info']['title'] = $key;
+ @$aggregateStats[$k]['values'][$key]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['info']['users'][] = $userHash;
+
+ if( $subKey ) {
+ @$aggregateStats[$k]['values'][$key]['values'][$subKey]['info']['title'] = $subKey;
+ @$aggregateStats[$k]['values'][$key]['values'][$subKey]['info']['revenue'] += $revenue['total_revenue'];
+ @$aggregateStats[$k]['values'][$key]['values'][$subKey]['info']['orders'] += $revenue['total_orders'];
+ @$aggregateStats[$k]['values'][$key]['values'][$subKey]['info']['users'][] = $userHash;
}
- $aggregateStats[$k]['values'][$key]['values'][$value]['users'][] = $userHash;
- @$aggregateStats[$k]['values'][$key]['registrations']++;
+
}
+$gBitThemes->loadCss( STATS_PKG_PATH.'css/stats.css');
$gBitThemes->loadCss( CONFIG_PKG_PATH.'themes/bootstrap/bootstrap-table/bootstrap-table.css');
$gBitThemes->loadJavascript( CONFIG_PKG_PATH.'themes/bootstrap/bootstrap-table/bootstrap-table.js');
@@ -101,4 +131,4 @@ $gBitSmarty->assign( 'totalRegistrations', $totalRegistrations );
$gBitSmarty->assign( 'maxRegistrations', $maxRegistrations );
$gBitSmarty->assign( 'listInfo', $_REQUEST['listInfo'] );
$gBitSystem->display( 'bitpackage:stats/referrer_stats.tpl', tra( 'Referer Statistics' ), array( 'display_mode' => 'display' ));
-?>
+
diff --git a/templates/referrer_stats.tpl b/templates/referrer_stats.tpl
index fd513bc..1067f98 100644
--- a/templates/referrer_stats.tpl
+++ b/templates/referrer_stats.tpl
@@ -24,7 +24,7 @@
<div class="body">
- <table class="table data">
+ <table class="table data referrer-stats">
{assign var=refCount value=0}
{foreach from=$referers key=host item=reg}
{assign var=hostKey value=$host|strip:'.':''}
@@ -37,8 +37,8 @@
<th class="text-right"><div class="floaticon"> [{math equation="round((x / y) * 100)" x=$reg|@count y=$totalRegistrations}% ] <a href="{$smarty.server.SCRIPT_NAME}?period={$smarty.request.period}&amp;find={$host|escape}">{booticon iname='icon-clock'}</a></div></th>
{if $aggregateStats.$host}
<th class="text-right">{$reg|@count} {booticon iname="icon-user"}</th>
- <th class="text-right">{$aggregateStats.$host.orders|default:"0"} {booticon iname="icon-shopping-cart"}</th>
- <th class="text-right">{$gCommerceCurrencies->format($aggregateStats.$host.revenue|default:"0.00")}</th>
+ <th class="text-right">{$aggregateStats.$host.info.orders|default:"0"} {booticon iname="icon-shopping-cart"}</th>
+ <th class="text-right">{$gCommerceCurrencies->format($aggregateStats.$host.info.revenue|default:"0.00")}</th>
{/if}
</tr>
@@ -48,47 +48,19 @@
{foreach from=$aggregateStats.$host.values item=paramValues key=paramKey}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="accordion-{$paramKey}">
- <div class="pull-right">{$paramValues.registrations} {booticon iname="icon-user"} {$paramValues.orders} {booticon iname="icon-shopping-cart"} {$gCommerceCurrencies->format($paramValues.revenue)}</div>
+ <div class="pull-right">{$paramValues.info.registrations} {booticon iname="icon-user"} {$paramValues.info.orders} {booticon iname="icon-shopping-cart"} {$gCommerceCurrencies->format($paramValues.info.revenue)}</div>
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion-{$hostHash}" href="#collapse-{$hostHash}-{$paramKey}" aria-expanded="false" aria-controls="collapse-{$hostHash}-{$paramKey}">{$paramKey}</a>
</h4>
</div>
{if $paramValues.values}
<div id="collapse-{$hostHash}-{$paramKey}" class="panel-collapse collapse" role="tabpanel">
- <div class="panel-body">
- <div class="panel-group" id="accordion-{$hostHash}-{$paramKey}" role="tablist" aria-multiselectable="true">
-<table data-toggle="table">
-<thead>
-<tr>
- <th>{$paramKey}</th>
- <th class="text-center" data-field="registrations" data-sortable="true">{booticon iname="icon-user"}</th>
- <th class="text-center" data-field="order_count" data-sortable="true">{booticon iname="icon-shopping-cart"}</th>
- <th class="text-center" data-field="revenue" data-sortable="true" data-sorter="priceSorter">Revenue</th>
-</tr>
-</thead>
-<tbody>
- {foreach from=$paramValues.values item=valueHash key=valueKey name=paramval}
-<tr>
- <td><a href="#" onclick="BitBase.toggleElementDisplay('order-list-{$hostHash}-{$paramKey}-{$valueKey}','block');return false;">{$valueKey|default:"unknown"}</a>
- <ol class="data" id="order-list-{$hostHash}-{$paramKey}-{$valueKey}" style="display:none">
- {foreach from=$valueHash.users item=userHash}
- <li class="item width100p" style="border-bottom:1px solid #cccccc;">
- <div class="inline-block width10p date">{$userHash.registration_date|bit_date_format}</div>
- <div class="inline-block width65p">{if $userHash.referer_url}<a href="{$userHash.referer_url|escape}">{$userHash.referer_url|stats_referer_display_short}</a><br/>{/if}{BitUser::getDisplayLinkFromHash($userHash,1)} - {$userHash.email}</div>
- <div class="inline-block text-right width10p">{if $userHash.revenue.total_orders}<a target="_new" href="{$smarty.const.BITCOMMERCE_PKG_URL}admin/list_orders.php?user_id={$userHash.user_id}">{$userHash.revenue.total_orders} {tr}orders{/tr}</a>{/if}</div>
- <div class="inline-block text-right width10p">{if $userHash.revenue.total_revenue}{$gCommerceCurrencies->format($userHash.revenue.total_revenue)}{/if}</div>
- </li>
- {/foreach}
- </ol>
- </td>
- <td class="text-right">{if $valueHash.users}{$valueHash.users|count}{/if}</td>
- <td class="text-right">{if $valueHash.orders}{$valueHash.orders}{/if}</td>
- <td class="text-right">{if $valueHash.revenue}{$gCommerceCurrencies->format($valueHash.revenue)}{/if}</td>
-</tr>
- {/foreach}
-</tbody>
+ <div class="panel-body" style="padding:0">
+<table class="table">
+ {foreach from=$paramValues.values item=subHash}
+ {include file="bitpackage:stats/referrer_stats_ctm_inc.tpl" tableHash=$subHash depth=1}
+ {/foreach}
</table>
- </div>
</div>
</div>
{/if}
@@ -108,7 +80,7 @@
</div>
{if $reg}
<div id="collapse-{$hostHash}-{$paramKey}" class="panel-collapse collapse" role="tabpanel">
- <div class="panel-body">
+ <div class="panel-body" style="padding:0">
<div class="panel-group" id="accordion-{$hostHash}-{$paramKey}" role="tablist" aria-multiselectable="true">
<table data-toggle="table">
<thead>
@@ -124,7 +96,7 @@
<tr class="{cycle values='odd,even'}">
<td class="date">{$user.registration_date|bit_date_format}</td>
<td><strong style="font-size:larger">{displayname hash=$user}</strong>{if $user.referer_url}<br/><a href="{$user.referer_url|escape}">{$user.referer_url|stats_referer_display_short}</a>{/if}</td>
- <td class="text-right">{if $user.revenue.total_orders}{$user.revenue.total_orders}{/if}</td>
+ <td class="text-right">{if $user.revenue.total_orders}<a target="_new" href="{$smarty.const.BITCOMMERCE_PKG_URL}admin/list_orders.php?user_id={$user.user_id}">{$user.revenue.total_orders}</a>{/if}</td>
<td class="text-right">{if $user.revenue.total_revenue}{$gCommerceCurrencies->format($user.revenue.total_revenue)}{/if}</td>
</tr>
{/foreach}
diff --git a/templates/referrer_stats_ctm_inc.tpl b/templates/referrer_stats_ctm_inc.tpl
new file mode 100644
index 0000000..bb30742
--- /dev/null
+++ b/templates/referrer_stats_ctm_inc.tpl
@@ -0,0 +1,28 @@
+{assign var="titleHash" value="`$parentHash``$tableHash.info.title`"|md5}
+<tbody style="{if $depth>1}display:none;{/if}" class="group-body-{$parentHash} depth-{$depth}">
+<tr>
+ <th style="padding-left:{$depth|default:1}em;"><a href="#" onclick="$('.group-body-{$titleHash}.depth-{$depth+1}').toggle();return false;">{$tableHash.info.title|default:"unknown"}</a></th>
+ <th class="text-right width10p"><a href="#" onclick="BitBase.toggleElementDisplay('user-list-{$titleHash}','block');return false;">{$tableHash.info.users|count|default:"0"} {booticon iname="icon-user"}</a></th>
+ <th class="text-right width10p">{$tableHash.info.orders|default:"0"} {booticon iname="icon-shopping-cart"}</th>
+ <th class="text-right width10p">{$gCommerceCurrencies->format($tableHash.info.revenue)}</th>
+</tr>
+<tr>
+ <td colspan="4" id="user-list-{$titleHash}" style="display:none">
+ <ol class="data" id="user-list-{$hostHash}-{$paramKey}-{$valueKey}">
+ {foreach from=$tableHash.info.users item=userHash}
+ <li class="item width100p" style="border-bottom:1px solid #cccccc;">
+ <div class="inline-block width10p date">{$userHash.registration_date|bit_date_format}</div>
+ <div class="inline-block width65p">{if $userHash.referer_url}<a href="{$userHash.referer_url|escape}">{$userHash.referer_url|stats_referer_display_short}</a><br/>{/if}{BitUser::getDisplayLinkFromHash($userHash,1)} - {$userHash.email}</div>
+ <div class="inline-block text-right width10p">{if $userHash.revenue.total_orders}<a target="_new" href="{$smarty.const.BITCOMMERCE_PKG_URL}admin/list_orders.php?user_id={$userHash.user_id}">{$userHash.revenue.total_orders} {tr}orders{/tr}</a>{/if}</div>
+ <div class="inline-block text-right width10p">{if $userHash.revenue.total_revenue}{$gCommerceCurrencies->format($userHash.revenue.total_revenue)}{/if}</div>
+ </li>
+ {/foreach}
+ </ol>
+ </td>
+</tr>
+</tbody>
+{if $tableHash.values}
+ {foreach from=$tableHash.values item=subHash}
+ {include file="bitpackage:stats/referrer_stats_ctm_inc.tpl" tableHash=$subHash depth=$depth+1 parentHash=$titleHash}
+ {/foreach}
+{/if}