299 lines
12 KiB
Smarty
299 lines
12 KiB
Smarty
<!-- SET title -->Статистика<!-- END -->
|
||
<!-- SET headscripts -->
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jquery.min.js"></script>
|
||
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/excanvas.min.js"></script><![endif]-->
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.all.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.canvasTextRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.canvasAxisLabelRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.canvasAxisTickRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.categoryAxisRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.dateAxisRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.enhancedLegendRenderer.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.highlighter.min.js"></script>
|
||
<script language="javascript" type="text/javascript" src="{DOMAIN}/tpldata/jqplot.logAxisRenderer.min.js"></script>
|
||
<link rel="stylesheet" type="text/css" href="{DOMAIN}/tpldata/jquery.jqplot.css" />
|
||
<!-- END -->
|
||
<!-- INCLUDE "admin_header.tpl" -->
|
||
<!-- IF NOT srcid -->
|
||
<p>Добро пожаловать в простую OLAPообразную статистику. Выберите источник данных:</p>
|
||
<form action="?" method="GET">
|
||
<select style="width:100px" name="datasource">
|
||
<!-- FOR s = sources -->
|
||
<option value="{s s.id}">{s s.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
<input type="submit" value=" Продолжить " />
|
||
</form>
|
||
<!-- ELSE -->
|
||
<p>Выбранный источник данных: <b>{s src.name}</b>. <a href="?">Выбрать другой источник данных</a>.</p>
|
||
<p>Настройте желаемый отчёт:</p>
|
||
<form action="?" method="GET">
|
||
<input type="hidden" name="datasource" value="{s src.id}" />
|
||
<input type="hidden" name="build" value="1" />
|
||
<p style="margin-top: 16px">Показатель:</p>
|
||
<p style="margin-left: 20px">
|
||
<select style="width:100px" name="cell_aggr">
|
||
<!-- FOR f = aggregates -->
|
||
<option value="{s f.id}"<!-- IF eq(cell.aggr, f.id) --> selected="selected"<!-- END -->>{s f.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
<select style="width:100px" name="cell_field">
|
||
<option value="">---</option>
|
||
<!-- FOR f = fielddescs -->
|
||
<option value="{s f.id}"<!-- IF eq(cell.field, f.id) --> selected="selected"<!-- END -->>{s f.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
<select style="width:100px" name="cell_func">
|
||
<option value="">без преобразования</option>
|
||
<!-- FOR f = functions -->
|
||
<option value="{s f.id}"<!-- IF eq(cell.func, f.id) --> selected="selected"<!-- END -->><!-- IF f.time -->(время) <!-- END -->{s f.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
</p>
|
||
<p style="margin-top: 16px">Группировка: количество полей: <input type="text" name="field_count" value="{field_count}" /></p>
|
||
<ol>
|
||
<!-- FOR fld = range(0,sub(field_count,1)) -->
|
||
<li>
|
||
<!-- SET gf = get(group_fields,fld) -->
|
||
<p><select name="group-type-{fld}">
|
||
<option value="">---</option>
|
||
<!-- FOR g = group_types -->
|
||
<option value="{g.id}"<!-- IF eq(gf.type,g.id) --> selected="selected" <!-- END -->>{s g.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
<!-- INCLUDE "admin_olap_field.tpl" -->
|
||
</p>
|
||
<p><select style="width:100px" name="group-sort_dir-{fld}">
|
||
<option value="asc">По возрастанию</option>
|
||
<option value="desc"<!-- IF eq(gf.sort_dir, 'desc') --> selected="selected"<!-- END -->>По убыванию</option>
|
||
</select>
|
||
<select style="width:100px" name="group-sort_aggr-{fld}">
|
||
<option value="">по значениям поля</option>
|
||
<!-- FOR f = aggregates -->
|
||
<!-- IF NOT f.cell_only -->
|
||
<option value="{s f.id}"<!-- IF eq(gf.sort_aggr, f.id) --> selected="selected"<!-- END -->>{s f.name} другого поля:</option>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
</select>
|
||
<!-- SET ft = 'sort_' --><!-- INCLUDE "admin_olap_field.tpl" --><!-- SET ft = '' -->
|
||
</p>
|
||
</li>
|
||
<!-- END -->
|
||
</ol>
|
||
<p style="margin-top: 16px">Условия выборки данных:</p>
|
||
<table style="margin-left: 20px">
|
||
<!-- FOR f = fielddescs -->
|
||
<tr><th style="text-align: left; vertical-align: top">{s f.name}</th>
|
||
<td style="text-align: left; vertical-align: top">
|
||
=
|
||
<!-- IF f.options -->
|
||
<select style="width: 100px" name="where-eq-{f.id}">
|
||
<option value="">любой</option>
|
||
<!-- FOR o = f.options -->
|
||
<option value="{s o.id}"<!-- IF o.selected --> selected="selected"<!-- END -->>{s o.name}</option>
|
||
<!-- END -->
|
||
</select>
|
||
<!-- ELSE -->
|
||
<input style="width: 100px" type="text" name="where-eq-{f.id}" value="{s get(request,concat('where-eq-',f.id))}" />
|
||
<!-- END -->
|
||
<!-- IF f.le_ge -->
|
||
или ≥ <input style="width: 100px" type="text" name="where-ge-{f.id}" value="{s get(request,concat('where-ge-',f.id))}" />
|
||
и ≤ <input style="width: 100px" type="text" name="where-le-{f.id}" value="{s get(request,concat('where-le-',f.id))}" />
|
||
<!-- END -->
|
||
<!-- IF f.is_time --> (YYYY-MM-DD HH:MM:SS)<!-- END -->
|
||
{f.comment}
|
||
</td></tr>
|
||
<!-- END -->
|
||
</table>
|
||
<p style="margin-top: 16px"><input type="submit" style="width: 200px" value=" Построить отчёт " /></p>
|
||
</form>
|
||
<!-- IF build -->
|
||
<h1>Отчёт</h1>
|
||
<p><a href="{s rpt_link}">Ссылка на данный отчёт</a> | <a href="{s csv_link}">В формате CSV</a></p>
|
||
<!-- IF and(not tables, not graphs) -->
|
||
<p>Нет данных для показа.</p>
|
||
<!-- ELSIF groups -->
|
||
<!-- EXEC('block_groups') -->
|
||
<!-- ELSIF graphs -->
|
||
<!-- EXEC('block_graphs') -->
|
||
<!-- ELSE -->
|
||
<!-- EXEC('block_tables') -->
|
||
<!-- END -->
|
||
<p>Отчёт занял {time_elapsed} сек. Использовано {memory} памяти для работы.</p>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
<!-- INCLUDE "admin_footer.tpl" -->
|
||
|
||
<!-- FUNCTION block_groups -->
|
||
<!-- FOR group = groups -->
|
||
<div style="width: 900px; height: 400px; margin-top: 20px" id="group{group_index}"></div>
|
||
<!-- END -->
|
||
<p>
|
||
<input type="checkbox" name="graph_log" id="graph_log" value="1"
|
||
onclick="doPlot(this.checked)" />
|
||
<label for="graph_log">Логарифмическая шкала графиков</label>
|
||
</p>
|
||
<script language="javascript" type="text/javascript">
|
||
var g = [
|
||
<!-- FOR group = groups -->{yesno(group_index,',','')}
|
||
{
|
||
id: "group{group_index}",
|
||
desc: "{q join(', ',group.full_desc)}",
|
||
numeric: {yesno(group.numeric,'true','false')},
|
||
data: [
|
||
<!-- FOR graph = group.graphs -->{yesno(graph_index,',','')}
|
||
[
|
||
<!-- FOR g = graph.data -->
|
||
[ {yesno(group.numeric,g[0],concat("'",q(g[0]),"'"))}, {g[1]} ],
|
||
<!-- END -->
|
||
]
|
||
<!-- END -->
|
||
],
|
||
x: "{q group.graphs[0].field}<!-- IF group.graphs[0].func --> ({q group.graphs[0].func})<!-- END -->",
|
||
dateAxis: '{group.date_axis}',
|
||
titles: [
|
||
<!-- FOR graph = group.graphs -->{yesno(graph_index,',','')}
|
||
'{q graph.last_desc}'
|
||
<!-- END -->
|
||
]
|
||
}
|
||
<!-- END -->
|
||
];
|
||
var yLabel = '{cell.value_desc}';
|
||
var yLabelBr = '{cell.value_desc_brace}';
|
||
var plots = [];
|
||
$.jqplot.config.enablePlugins = true;
|
||
$(document).ready(function(){
|
||
doPlot($('#graph_log').attr('checked'));
|
||
});
|
||
function doPlot(logarithmic)
|
||
{
|
||
for (var i = 0; i < g.length; i++)
|
||
{
|
||
var ik = i;
|
||
if (plots[i])
|
||
plots[i].destroy();
|
||
plots[i] = $.jqplot(g[i].id, g[i].data, {
|
||
seriesDefaults: {
|
||
rendererOptions: { smooth: true }
|
||
},
|
||
title: g[i].desc,
|
||
highlighter: {
|
||
showTooltip: true,
|
||
bringSeriesToFront: true,
|
||
tooltipAxes: 'x',
|
||
tooltipContentEditor: function(str, series, point, plot) {
|
||
var p = g[ik].data[series][point];
|
||
return g[ik].x+' = '+p[0]+'<br />'+yLabelBr+' = '+p[1];
|
||
},
|
||
},
|
||
cursor: {
|
||
show: false,
|
||
},
|
||
legend: {
|
||
show: true,
|
||
renderer: $.jqplot.EnhancedLegendRenderer,
|
||
location: 'ne',
|
||
placement: 'outsideGrid',
|
||
labels: g[i].titles
|
||
},
|
||
axesDefaults: {
|
||
tickRenderer: $.jqplot.CanvasAxisTickRenderer,
|
||
tickOptions: {
|
||
fontSize: '10pt'
|
||
}
|
||
},
|
||
axes: {
|
||
xaxis: {
|
||
label: g[i].x,
|
||
labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
|
||
renderer: g[i].dateAxis ? $.jqplot.DateAxisRenderer : (g[i].numeric ? $.jqplot.LinearAxisRenderer : $.jqplot.CategoryAxisRenderer),
|
||
sortMergedLabels: true,
|
||
useStringSort: true,
|
||
tickOptions: {
|
||
angle: -30,
|
||
formatString: g[i].dateAxis
|
||
}
|
||
},
|
||
yaxis: {
|
||
label: yLabel,
|
||
renderer: logarithmic ? $.jqplot.LogAxisRenderer : $.jqplot.LinearAxisRenderer,
|
||
labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
|
||
tickOptions: {
|
||
labelPosition: 'end'
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
</script>
|
||
<!-- END -->
|
||
|
||
<!-- FUNCTION block_graphs -->
|
||
<!-- FOR graph = graphs -->
|
||
<!-- IF graph.desc -->
|
||
<!-- SET o = 0 -->
|
||
<!-- FOR d = graph.desc -->
|
||
<!--# Описание графика (поле: значение, ..., только значения, не равные значениям предыдущего графика) -->
|
||
<!-- SET o = o || !graph_index || graphs[graph_index-1].desc[d_index].value != d.value -->
|
||
<!-- IF o -->
|
||
<p style="margin-left: {mul(d_index,20)}px">{d.field}<!-- IF d.func --> ({lc d.func})<!-- END -->: {d.value}</p>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
<div style="margin-left: {mul(count(graph.desc),20)}px">
|
||
<!-- END -->
|
||
<table>
|
||
<!-- IF graph.bi_sign -->
|
||
<tr><th colspan="4">- {graph.field}<!-- IF graph.func --> ({lc graph.func})<!-- END --> +</th></tr>
|
||
<!-- FOR g = graph.data -->
|
||
<tr>
|
||
<td><div style="float: right; background: red; height: 7px; width: {g[3]}px"></div></td>
|
||
<td>{s g[0]}: </td><td>{s g[1]}</td>
|
||
<td><div style="background: blue; height: 7px; width: {g[2]}px"></div></td>
|
||
</tr>
|
||
<!-- END -->
|
||
<!-- ELSE -->
|
||
<tr><th style="text-align: left" colspan="2">{graph.field}<!-- IF graph.func --> ({lc graph.func})<!-- END --></th></tr>
|
||
<!-- FOR g = graph.data -->
|
||
<tr><td>{s g[0]}: </td><td>{s g[1]}</td><td><div style="background: blue; height: 7px; width: {g[2]}px"></div></td></tr>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
</table>
|
||
<!-- IF graph.desc -->
|
||
</div>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
<!-- END -->
|
||
|
||
<!-- FUNCTION block_tables -->
|
||
<!-- FOR table = tables -->
|
||
<!-- IF table.desc -->
|
||
<!-- SET o = 0 -->
|
||
<!-- FOR d = table.desc -->
|
||
<!-- SET o = o || !table_index || tables[table_index-1].desc[d_index].value != d.value -->
|
||
<!-- IF o -->
|
||
<p style="margin-left: {mul(d_index,20)}px">{d.field}<!-- IF d.func --> ({lc d.func})<!-- END -->: {d.value}</p>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
<div style="margin-left: {mul(count(table.desc),20)}px">
|
||
<!-- END -->
|
||
<table class="simpletable center">
|
||
<!-- FOR row = table.rows -->
|
||
<tr>
|
||
<!-- FOR c = row -->
|
||
<!-- IF is_array(c) -->
|
||
<th<!-- IF c.colspan --> colspan="{c.colspan}"<!-- END --><!-- IF c.rowspan --> rowspan="{c.rowspan}"<!-- END --><!-- IF c.class --> class="{c.class}"<!-- END -->>{c.text}</th>
|
||
<!-- ELSE -->
|
||
<td>{c}</td>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
</tr>
|
||
<!-- END -->
|
||
</table>
|
||
<!-- IF table.desc -->
|
||
</div>
|
||
<!-- END -->
|
||
<!-- END -->
|
||
<!-- END -->
|