mirror of
https://github.com/e107inc/e107.git
synced 2025-01-17 20:58:30 +01:00
508 lines
12 KiB
PHP
508 lines
12 KiB
PHP
<?php
|
|
/*
|
|
* e107 Bootstrap CMS
|
|
*
|
|
* Copyright (C) 2008-2014 e107 Inc (e107.org)
|
|
* Released under the terms and conditions of the
|
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
|
|
|
*/
|
|
|
|
if (!defined('e107_INIT')) { exit; }
|
|
|
|
// v2.x Standard - Simple Dashboard module.
|
|
|
|
class user_dashboard // plugin-folder + '_url'
|
|
{
|
|
private $title;
|
|
|
|
public $chartCaption = LAN_WEBSITE_STATUS;
|
|
|
|
function chart()
|
|
{
|
|
$config = array();
|
|
$tp = e107::getParser();
|
|
|
|
$config[] = array(
|
|
// 0 => array( 'text' => $this->renderChart(), 'caption' => $tp->toGlyph('fa-signal').' '.LAN_STATS),
|
|
1 => array('caption' =>$tp->toGlyph('fa-user').' '.LAN_ONLINE.' ('.$this->renderOnlineUsers('count').')', 'text'=>$this->renderOnlineUsers()),
|
|
|
|
2 => array( 'text' => $this->registered('newUsersThisMonth'), 'caption' => $this->title),
|
|
);
|
|
|
|
return $config;
|
|
}
|
|
|
|
|
|
private function renderChart()
|
|
{
|
|
if (e107::isInstalled('log'))
|
|
{
|
|
return $this->renderStats('log');
|
|
}
|
|
else
|
|
{
|
|
// return $this->renderStats('demo');
|
|
}
|
|
|
|
}
|
|
|
|
|
|
private function getStats($type)
|
|
{
|
|
|
|
if($type == 'demo')
|
|
{
|
|
$data = array();
|
|
|
|
$months = e107::getDate()->terms('month');
|
|
|
|
foreach($months as $month)
|
|
{
|
|
// We need only the first 6 months for demo.
|
|
if (!empty($data['labels']) && count($data['labels']) >= 6)
|
|
{
|
|
continue;
|
|
}
|
|
$data['labels'][] = $month;
|
|
}
|
|
|
|
$data['datasets'][] = array(
|
|
'fillColor' => "rgba(220,220,220,0.5)",
|
|
'strokeColor' => "rgba(220,220,220,1)",
|
|
'pointColor ' => "rgba(220,220,220,1)",
|
|
'pointStrokeColor' => "#fff",
|
|
'data' => array(65,59,90,81,56,55,40),
|
|
'title' => ADLAN_168// "Visits"
|
|
);
|
|
|
|
$data['datasets'][] = array(
|
|
'fillColor' => "rgba(151,187,205,0.5)",
|
|
'strokeColor' => "rgba(151,187,205,1)",
|
|
'pointColor ' => "rgba(151,187,205,1)",
|
|
'pointStrokeColor' => "#fff",
|
|
'data' => array(28,48,40,19,96,27,100),
|
|
'title' => ADLAN_169 //"Unique Visits"
|
|
);
|
|
|
|
return $data;
|
|
}
|
|
|
|
|
|
|
|
$sql = e107::getDB();
|
|
|
|
$td = date("Y-m-j", time());
|
|
$dayarray[$td] = array();
|
|
$pagearray = array();
|
|
|
|
$qry = "
|
|
SELECT * from #logstats WHERE log_id REGEXP('[[:digit:]]+\-[[:digit:]]+\-[[:digit:]]+')
|
|
ORDER BY CONCAT(LEFT(log_id,4), SUBSTRING(log_id, 6, 2), LPAD(SUBSTRING(log_id, 9), 2, '0'))
|
|
DESC LIMIT 0,9
|
|
";
|
|
|
|
if($amount = $sql->gen($qry))
|
|
{
|
|
$array = $sql->db_getList();
|
|
|
|
$ttotal = 0;
|
|
$utotal = 0;
|
|
|
|
foreach($array as $key => $value)
|
|
{
|
|
|
|
$log_id = $value['log_id'];
|
|
$log_data = $value['log_data'];
|
|
// extract($value);
|
|
|
|
$log_id = substr($log_id, 0, 4).'-'.substr($log_id, 5, 2).'-'.str_pad(substr($log_id, 8), 2, '0', STR_PAD_LEFT);
|
|
if(is_array($log_data)) {
|
|
$entries[0] = $log_data['host'];
|
|
$entries[1] = $log_data['date'];
|
|
$entries[2] = $log_data['os'];
|
|
$entries[3] = $log_data['browser'];
|
|
$entries[4] = $log_data['screen'];
|
|
$entries[5] = $log_data['referer'];
|
|
}
|
|
else
|
|
{
|
|
$entries = explode(chr(1), $log_data);
|
|
}
|
|
|
|
$dayarray[$log_id]['daytotal'] = $entries[0];
|
|
$dayarray[$log_id]['dayunique'] = $entries[1];
|
|
|
|
unset($entries[0]);
|
|
unset($entries[1]);
|
|
|
|
foreach($entries as $entry)
|
|
{
|
|
if($entry)
|
|
{
|
|
list($url, $total, $unique) = explode("|", $entry);
|
|
if(strpos($url, "/") !== false)
|
|
{
|
|
$urlname = preg_replace("/\.php|\?.*/", "", substr($url, (strrpos($url, "/")+1)));
|
|
}
|
|
else
|
|
{
|
|
$urlname = preg_replace("/\.php|\?.*/", "", $url);
|
|
}
|
|
$dayarray[$log_id][$urlname] = array('url' => $url, 'total' => $total, 'unique' => $unique);
|
|
if (!isset($pagearray[$urlname]['total'])) $pagearray[$urlname]['total'] = 0;
|
|
if (!isset($pagearray[$urlname]['unique'])) $pagearray[$urlname]['unique'] = 0;
|
|
$pagearray[$urlname]['total'] += $total;
|
|
$pagearray[$urlname]['unique'] += $unique;
|
|
$ttotal += $total;
|
|
$utotal += $unique;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$logfile = e_LOG.'logp_'.date('z.Y', time()).'.php'; // was logi_ ??
|
|
if(is_readable($logfile))
|
|
{
|
|
require($logfile);
|
|
}
|
|
|
|
|
|
|
|
if(vartrue($pageInfo))
|
|
{
|
|
foreach($pageInfo as $fkey => $fvalue)
|
|
{
|
|
$dayarray[$td][$fkey]['total'] += $fvalue['ttl'];
|
|
$dayarray[$td][$fkey]['unique'] += $fvalue['unq'];
|
|
$dayarray[$td]['daytotal'] += $fvalue['ttl'];
|
|
$dayarray[$td]['dayunique'] += $fvalue['unq'];
|
|
$pagearray[$fkey]['total'] += $fvalue['ttl'];
|
|
$pagearray[$fkey]['unique'] += $fvalue['unq'];
|
|
$ttotal += $fvalue['ttl'];
|
|
$utotal += $fvalue['unq'];
|
|
}
|
|
}
|
|
|
|
|
|
$visitors = array();
|
|
$unique = array();
|
|
|
|
|
|
ksort($dayarray);
|
|
foreach($dayarray as $k=>$v)
|
|
{
|
|
$unix = strtotime($k);
|
|
|
|
$visitors[] = intval(vartrue($v['daytotal']));
|
|
$unique[] = intval(vartrue($v['dayunique']));
|
|
$label[] = "'".date("D",$unix)."'";
|
|
}
|
|
|
|
$data = array();
|
|
|
|
$data['labels'] = $label;
|
|
|
|
//visitors
|
|
$data['datasets'][] = array(
|
|
'fillColor' => "rgba(220,220,220,0.5)",
|
|
'strokeColor' => "rgba(220,220,220,1)",
|
|
'pointColor ' => "rgba(220,220,220,1)",
|
|
'pointStrokeColor' => "#fff",
|
|
'data' => $visitors
|
|
|
|
);
|
|
|
|
|
|
//Unique Visitors
|
|
$data['datasets'][] = array(
|
|
'fillColor' => "rgba(151,187,205,0.5)",
|
|
'strokeColor' => "rgba(151,187,205,1)",
|
|
'pointColor ' => "rgba(151,187,205,1)",
|
|
'pointStrokeColor' => "#fff",
|
|
'data' => $unique
|
|
);
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
|
|
}
|
|
|
|
|
|
private function renderStats($type)
|
|
{
|
|
|
|
$data = $this->getStats($type);
|
|
|
|
|
|
$cht = e107::getChart();
|
|
$cht->setType('line');
|
|
$cht->setOptions(array(
|
|
'annotateDisplay' => true,
|
|
'annotateFontSize' => 8
|
|
));
|
|
$cht->setData($data,'canvas');
|
|
$text = $cht->render('canvas');
|
|
|
|
|
|
if($type == 'demo')
|
|
{
|
|
$text .= "<div class='center'><small>".ADLAN_170."<a class='btn btn-xs btn-mini' href='".e_ADMIN."plugin.php?mode=avail&action=list'>".ADLAN_171."</a></small></div>";
|
|
}
|
|
else
|
|
{
|
|
$text .= "<div class='center'><small>
|
|
<span style='color:rgba(220,220,220,0.5)'>♦</span>".ADLAN_168."
|
|
<span style='color:rgba(151,187,205,1)'>♦</span>".ADLAN_169."
|
|
</small></div>";
|
|
}
|
|
|
|
|
|
return $text;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* TODO Switch to line-filled graph and add unactivated users also.
|
|
* @param string $when
|
|
* @param string $id
|
|
* @return string
|
|
*/
|
|
function registered($id=null)
|
|
{
|
|
$cht = e107::getChart();
|
|
$sql = e107::getDb();
|
|
|
|
|
|
$cht->setProvider('google');
|
|
|
|
$width='100%'; $height = 380;
|
|
|
|
$data[] = array('Day', "Registered" );
|
|
|
|
$amt = array();
|
|
|
|
// if($when == 'this')
|
|
{
|
|
$month_start = strtotime('first day of this month', mktime(0,0,0));
|
|
$month_end = strtotime('last day of this month', mktime(23,59,59));
|
|
}
|
|
|
|
/* if($when == 'last')
|
|
{
|
|
$month_start = strtotime('first day of last month', mktime(0,0,0));
|
|
$month_end = strtotime('last day of last month', mktime(23,59,59));
|
|
}*/
|
|
|
|
if(!$sql->gen("SELECT user_id,user_ban,user_join FROM `#user` WHERE user_join BETWEEN ".$month_start." AND ".$month_end." AND user_ban = 0"))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
while($row = $sql->fetch())
|
|
{
|
|
|
|
$diz = date('j', $row['user_join']);
|
|
|
|
if(!isset($amt[$diz]))
|
|
{
|
|
$amt[$diz] = 0;
|
|
}
|
|
|
|
$amt[$diz] += 1;
|
|
$dateName[$diz] = date('jS', $row['user_join']);
|
|
}
|
|
|
|
$monthNumber = date('n',$month_start);
|
|
$yearNumber = date('Y', $month_start);
|
|
// print_a($monthNumber);
|
|
|
|
$sum = array_sum($amt);
|
|
|
|
// $this->title = 'Registered '.date('M Y',$month_start).' ('.$sum.')';
|
|
|
|
$this->title = UC_LAN_9.' ('.$sum.')';
|
|
|
|
$totalDays = date('t', $month_start);
|
|
|
|
for ($i=1; $i < ($totalDays +1); $i++)
|
|
{
|
|
$diz = date('D jS', mktime(1,1,1,$monthNumber,$i, $yearNumber));
|
|
$val = !empty($amt[$i]) ? $amt[$i] : 0;
|
|
$data[] = array($diz, $val); // $dateName[$i]
|
|
$ticks[] = $i;
|
|
}
|
|
|
|
// print_a($data);
|
|
|
|
$options = array(
|
|
'chartArea' =>array('left'=>'60', 'width'=>'100%', 'top'=>'25'),
|
|
'legend' => array('position'=> 'none', 'alignment'=>'center', 'textStyle' => array('fontSize' => 14, 'color' => '#ccc')),
|
|
'vAxis' => array('title'=> UC_LAN_9, 'minValue'=>0, 'maxValue'=>10, 'titleFontSize'=>16, 'titleTextStyle'=>array('color' => '#ccc'), 'gridlines'=>array('color'=>'#696969', 'count'=>5), 'format'=>'', 'textStyle'=>array('color' => '#ccc') ),
|
|
'hAxis' => array('title'=>date('M Y', $month_start), 'slantedText'=>true, 'slantedTextAngle'=>60, 'ticks'=>$ticks, 'titleFontSize'=>14, 'titleTextStyle'=>array('color' => '#ccc'), 'gridlines' => array('color'=>'transparent'), 'textStyle'=>array('color' => '#ccc') ),
|
|
'colors' => array('#77acd9','#EDA0B6', '#EE8D21', '#5CB85C'),
|
|
'animation' => array('duration'=>1000, 'easing' => 'out'),
|
|
'areaOpacity' => 0.8,
|
|
|
|
'backgroundColor' => array('fill' => 'transparent' )
|
|
);
|
|
//
|
|
$cht->setType('column');
|
|
$cht->setOptions($options);
|
|
$cht->setData($data);
|
|
|
|
// redraw to fix sizing issue.
|
|
/* e107::js('footer-inline', "
|
|
|
|
|
|
$('a[data-toggle=\"tab\"]').on('shown.bs.tab', function (e) {
|
|
// drawLast();
|
|
drawThismonth();
|
|
})
|
|
|
|
|
|
");*/
|
|
|
|
|
|
return "<div class='height:50%'>".$cht->render($id, $width, $height)."</div>";
|
|
|
|
// return "<div class='height:50%'>".$cht->render('projection', 320, 380)."</div>";
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderOnlineUsers($data=false)
|
|
{
|
|
|
|
$ol = e107::getOnline();
|
|
$tp = e107::getParser();
|
|
$multilan = e107::getPref('multilanguage');
|
|
|
|
$panelOnline = "
|
|
|
|
<table class='table table-condensed table-striped' >
|
|
<colgroup>
|
|
<col style='width: 10%' />
|
|
<col style='width: 25%' />
|
|
<col style='width: 10%' />
|
|
<col style='width: 40%' />
|
|
<col style='width: auto' />";
|
|
|
|
|
|
$panelOnline .= (!empty($multilan)) ? "<col style='width: auto' />" : "";
|
|
|
|
|
|
$panelOnline .= "
|
|
|
|
</colgroup>
|
|
<thead>
|
|
<tr class='first'>
|
|
<th>".LAN_TIMESTAMP."</th>
|
|
<th>".LAN_USER."</th>
|
|
<th>".LAN_IP."</th>
|
|
<th>".LAN_PAGE."</th>
|
|
<th class='center'>".LAN_AGENT."</th>";
|
|
|
|
$panelOnline .= (!empty($multilan)) ? "<th class='center'>".LAN_LANG."</th>" : "";
|
|
|
|
$panelOnline .= "
|
|
</tr>
|
|
</thead>
|
|
<tbody>";
|
|
|
|
|
|
// Fixes #3239: The array merge didn't work correctly by using the + operator
|
|
$online = $ol->userList();
|
|
$online = array_merge($online, $ol->guestList());
|
|
|
|
if($data == 'count')
|
|
{
|
|
return count($online);
|
|
}
|
|
|
|
// echo "Users: ".print_a($online);
|
|
|
|
$lng = e107::getLanguage();
|
|
|
|
foreach ($online as $val)
|
|
{
|
|
$panelOnline .= "
|
|
<tr>
|
|
<td class='nowrap'>".e107::getDateConvert()->convert_date($val['user_currentvisit'],'%H:%M:%S')."</td>
|
|
<td>".$this->renderOnlineName($val['online_user_id'])."</td>
|
|
<td>".e107::getIPHandler()->ipDecode($val['user_ip'])."</td>
|
|
<td><a class='e-tip' href='".$val['user_location']."' title='".$val['user_location']."'>".$tp->html_truncate(basename($val['user_location']),50,"...")."</a></td>
|
|
<td class='center'><a class='e-tip' href='#' title='".$val['user_agent']."'>".$this->browserIcon($val)."</a></td>";
|
|
|
|
$panelOnline .= (!empty($multilan)) ? "<td class='center'><a class='e-tip' href='#' title=\"".$lng->convert($val['user_language'])."\">".$val['user_language']."</a></td>" : "";
|
|
|
|
|
|
$panelOnline .= "
|
|
</tr>
|
|
";
|
|
}
|
|
|
|
|
|
$panelOnline .= "</tbody></table>";
|
|
|
|
return $panelOnline;
|
|
}
|
|
|
|
|
|
function browserIcon($row)
|
|
{
|
|
|
|
$types = array(
|
|
"ie" => "MSIE",
|
|
'chrome' => 'Chrome',
|
|
'firefox' => 'Firefox',
|
|
'seamonkey' => 'Seamonkey',
|
|
// 'Chromium/xyz
|
|
'safari' => "Safari",
|
|
'opera' => "Opera"
|
|
);
|
|
|
|
|
|
if($row['user_bot'] === true)
|
|
{
|
|
return "<i class='browsers e-bot-16'></i>";
|
|
}
|
|
|
|
foreach($types as $icon=>$b)
|
|
{
|
|
if(strpos($row['user_agent'], $b)!==false)
|
|
{
|
|
return "<i class='browsers e-".$icon."-16' ></i>";
|
|
}
|
|
}
|
|
|
|
return "<i class='browsers e-firefox-16'></i>"; // FIXME find a default icon.
|
|
}
|
|
|
|
|
|
private function renderOnlineName($val)
|
|
{
|
|
if($val==0)
|
|
{
|
|
return LAN_GUEST;
|
|
}
|
|
return $val;
|
|
}
|
|
|
|
|
|
} |