Browse Source

debut de reecriture de l'affichage des stats en squelette :

on utilise une boucle (DATA){source stats,jour|mois,duree,id_article}
pour recuperer le tableau de donnees qu'on met en forme dans le squelette
la page offre deja le zom on/off en ajax
spip-3.0
cedric@yterium.com 12 years ago
parent
commit
f0144b75ae
  1. 4
      .gitattributes
  2. 58
      inc/statistiques.php
  3. 97
      inc/stats_to_array.php
  4. 4
      prive/squelettes/contenu/stats_visites.html
  5. 49
      prive/squelettes/inclure/stats-visites-data.html
  6. 23
      prive/squelettes/inclure/stats-visites-data_fonctions.php
  7. 134
      prive/stats/visites.html

4
.gitattributes vendored

@ -14,13 +14,17 @@ genie/popularites.php -text
genie/visites.php -text
inc/referenceurs.php -text
inc/statistiques.php -text
inc/stats_to_array.php -text
javascript/excanvas.js -text
javascript/jquery.flot.js -text
javascript/jquery.tflot.js -text
/plugin.xml -text
prive/bouton/statistiques.html -text
prive/images/statistiques-48.png -text
prive/squelettes/contenu/stats_visites.html -text
prive/squelettes/inclure/admin_effacer_stats.html -text
prive/squelettes/inclure/stats-visites-data.html -text
prive/squelettes/inclure/stats-visites-data_fonctions.php -text
prive/stats/visites.html -text
prive/style_prive_plugin_stats.html -text
prive/themes/spip/images/statistique-16.png -text

58
inc/statistiques.php

@ -119,9 +119,19 @@ function cadre_stat($stats, $table, $id_article)
. statistiques_mode($table, $id_article);
}
// http://doc.spip.org/@statistiques_collecte_date
function statistiques_collecte_date($count, $date, $table, $where, $serveur)
{
/**
*
* // http://doc.spip.org/@statistiques_collecte_date
*
* @param string $count
* @param string $date
* @param string $table
* @param string $where
* @param string $serveur
* @return array
*/
function statistiques_collecte_date($count, $date, $table, $where, $serveur){
$result = sql_select("$count AS n, $date AS d", $table, $where, 'd', 'd', '','', $serveur);
$log = array();
@ -140,7 +150,7 @@ function statistiques_tous($log, $id_article, $table, $where, $order, $serveur,
$max = max($log);
list($moyenne,$prec, $res) = stat_log1($log, $date_fin, $interval, $script);
$res_mois = statistiques_mensuelles($order, $table, $where, $serveur, $script);
$res_mois = statistiques_mensuelles($order, $table, $where, $serveur);
$stats =
"<table class='visites' id='visites_quotidiennes'>"
. "<caption>"._T('visites_journalieres')."</caption>"
@ -387,7 +397,7 @@ function statistiques_jour($key, $value, $moyenne, $script)
return $res;
}
function statistiques_mois($key, $value, $moyenne, $script) {
function statistiques_mois($key, $value, $moyenne) {
$key = substr($key,0,4).'-'.substr($key,4,2);
$res = "<tr>"
. "<th title='$key-01'>" . affdate_mois_annee($key) . "</th>"
@ -399,22 +409,50 @@ function statistiques_mois($key, $value, $moyenne, $script) {
}
// http://doc.spip.org/@statistiques_mensuelles
function statistiques_mensuelles($order, $table, $where, $serveur, $script) {
function statistiques_mensuelles($order, $table, $where, $serveur) {
$result = sql_select("SUM(visites) AS v, DATE_FORMAT($order,'%Y%m') AS d", "$table", "$where", "d", "d", "",'',$serveur);
$res_mois = '';
while ($r = sql_fetch($result,$serveur)) {
moyenne_glissante_mois($r['v']);
$res_mois .= statistiques_mois($r['d'], $r['v'], moyenne_glissante_mois() , $script);
$res_mois .= statistiques_mois($r['d'], $r['v'], moyenne_glissante_mois());
}
return $res_mois;
}
/**
* Calculer la moyenne glissante sur un nombre d'echantillons donnes
* @param int|bool $valeur
* @param int $glisse
* @return float
*/
function moyenne_glissante($valeur = false, $glisse=0) {
static $v = array();
// pas d'argument, raz de la moyenne
if ($valeur === false) {
$v = array();
return 0;
}
// http://doc.spip.org/@statistiques_moyenne
function statistiques_moyenne($tab)
{
// argument, on l'ajoute au tableau...
// surplus, on enleve...
$v[] = $valeur;
if (count($v) > $glisse)
array_shift($v);
return round(statistiques_moyenne($v),2);
}
/**
* Calculer la moyenne d'un tableau de valeurs
*
* http://doc.spip.org/@statistiques_moyenne
*
* @param array $tab
* @return float
*/
function statistiques_moyenne($tab){
if (!$tab) return 0;
$moyenne = 0;
foreach($tab as $v) $moyenne += $v;

97
inc/stats_to_array.php

@ -0,0 +1,97 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2011 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/statistiques');
// moyenne glissante sur 30 jours
define('MOYENNE_GLISSANTE_JOUR', 30);
// moyenne glissante sur 12 mois
define('MOYENNE_GLISSANTE_MOIS', 12);
function inc_stats_to_array_dist($unite, $duree, $id_article, $options = array()) {
$args = func_get_args();
$now = time();
if (!in_array($unite,array('jour','mois')))
$unite = 'jour';
$serveur = '';
$table = "spip_visites";
$order = "date";
$where = array();
if ($duree)
$where[] = sql_date_proche($order,-$duree,'day',$serveur);
if ($id_article) {
$table = "spip_visites_articles";
$where[] = "id_article=".intval($id_article);
}
$where = implode(" AND ",$where);
$format = ($unite=='jour'?'%Y-%m-%d':'%Y-%m-01');
$res = sql_select("SUM(visites) AS v, DATE_FORMAT($order,'$format') AS d", $table, $where, "d", "d", "",'',$serveur);
$format = str_replace('%','',$format);
$periode = ($unite=='jour'?24*3600:365*24*3600/12);
$step = intval(round($periode*1.1,0));
$glisse = constant('MOYENNE_GLISSANTE_'.strtoupper($unite));
moyenne_glissante();
$data = array();
$r = sql_fetch($res,$serveur);
do {
$data[$r['d']] = array('visites'=>$r['v'],'moyenne'=>moyenne_glissante($r['v'], $glisse));
$last = $r['d'];
// donnee suivante
$r = sql_fetch($res,$serveur);
// si la derniere n'est pas la date courante, l'ajouter
if (!$r AND $last!=date($format,$now))
$r = array('d'=>date($format,$now),'v'=>0);
// completer les trous manquants si besoin
if ($r){
$next = strtotime($last);
$current = strtotime($r['d']);
while (($next+=$step)<$current AND $d=date($format,$next)){
if (!isset($data[$d]))
$data[$d] = array('visites'=>0,'moyenne'=>moyenne_glissante(0, $glisse));
$last = $d;
$next = strtotime($last);
}
}
}
while ($r);
// projection pour la derniere barre :
// mesure courante
// + moyenne au pro rata du temps qui reste
$moyenne = end($data);
$moyenne = prev($data);
$moyenne = ($moyenne AND isset($moyenne['moyenne']))?$moyenne['moyenne']:0;
$data[$last]['moyenne'] = $moyenne;
// temps restant
$remaining = strtotime(date($format,strtotime(date($format,$now))+$step))-$now;
$prorata = $remaining/$periode;
// projection
$data[$last]['prevision'] = $data[$last]['visites'] + intval(round($moyenne*$prorata));
return $data;
}
?>

4
prive/squelettes/contenu/stats_visites.html

@ -0,0 +1,4 @@
#BOITE_OUVRIR{#CHEMIN_IMAGE{statistique-24.png}|balise_img{'',cadre-icone},'simple stats'}
<INCLURE{fond=prive/squelettes/inclure/stats-visites-data,ajax,env} />
#BOITE_FERMER
<INCLURE{fond=prive/stats/visites} />

49
prive/squelettes/inclure/stats-visites-data.html

@ -0,0 +1,49 @@
<p class="pagination">
<a href="[(#SELF|parametre_url{duree,#ENV{duree,90}|duree_zoom{moins}})]"
class="ajax">[(#CHEMIN_IMAGE{loupe-moins.gif}|balise_img{<:info_zoom:> -})]</a>
<a href="[(#SELF|parametre_url{duree,#ENV{duree,90}|duree_zoom{plus}})]"
class="ajax">[(#CHEMIN_IMAGE{loupe-plus.gif}|balise_img{<:info_zoom:> +})]</a>
</p>
<B_statsj>
<table class='visites' id='visites_quotidiennes'>
<caption><:visites_journalieres:></caption>
<thead>
<tr class='row_first'>
<th><:date|trim{':'}|trim:></th>
<th class='valeur'><:info_visites|trim{':'}|trim:></th>
<th class='moyenne'><:info_moyenne|trim{':'}|trim:></th>
</tr>
</thead>
<tbody>
<BOUCLE_statsj(DATA){source stats,jour,#ENV{duree,90},#ENV{id_article}}>
<tr class="c_[(#CLE|affdate{l}|substr{0,3})][(#COMPTEUR_BOUCLE|=={#TOTAL_BOUCLE}|oui)c_today]">
<th title="[(#CLE|affdate{'Y-m-d'})]">[(#COMPTEUR_BOUCLE|=={#TOTAL_BOUCLE}|?{<:info_aujourdhui:>,#CLE|affdate_jourcourt})]</th>
<td class="val">#VALEUR{visites}[<em>(<span>(#VALEUR{prevision})</span>)</em>]</td>
<td class="mean">#VALEUR{moyenne}</td>
</tr>
</BOUCLE_statsj>
</tbody>
</table>
</B_statsj>
<B_statsm>
<table class='visites' id='visites_mensuelles'>
<caption><:visites_mensuelles:></caption>
<thead>
<tr class='row_first'>
<th><:date|trim{':'}|trim:></th>
<th class='valeur'><:info_visites|trim{':'}|trim:></th>
<th class='moyenne'><:info_moyenne|trim{':'}|trim:></th>
</tr>
</thead>
<tbody>
<BOUCLE_statsm(DATA){source stats,mois,#ENV{duree,90},#ENV{id_article}}>
<tr class="c_[(#CLE|affdate{l}|substr{0,3})][(#COMPTEUR_BOUCLE|=={#TOTAL_BOUCLE}|oui)c_today]">
<th title="[(#CLE|affdate{'Y-m-01'})]">[(#CLE|affdate_mois_annee)]</th>
<td class="val">#VALEUR{visites}[<em>(<span>(#VALEUR{prevision})</span>)</em>]</td>
<td class="mean">[(#VALEUR{moyenne}|round)]</td>
</tr>
</BOUCLE_statsm>
</tbody>
</table>
</B_statsm>

23
prive/squelettes/inclure/stats-visites-data_fonctions.php

@ -0,0 +1,23 @@
<?php
function duree_zoom($duree,$sens='plus'){
$largeur_abs = 420/$duree;
if ($largeur_abs > 1) {
$inc = ceil($largeur_abs / 5);
$duree_plus = round(420 / ($largeur_abs - $inc));
$duree_moins = round(420 / ($largeur_abs + $inc));
}
if ($largeur_abs == 1) {
$duree_plus = 840;
$duree_moins = 210;
}
if ($largeur_abs < 1) {
$duree_plus = round(420 * ((1/$largeur_abs) + 1));
$duree_moins = round(420 * ((1/$largeur_abs) - 1));
}
return ($sens=='plus'?$duree_moins:$duree_plus);
}

134
prive/stats/visites.html

@ -3,76 +3,78 @@
[<script type="text/javascript" src="(#CHEMIN{javascript/jquery.tflot.js})"></script>]
<script type="text/javascript">
(function($){
$(document).ready(function(){
function trace_stats(){
// copier le titre des tableaux
titre = $("#visites_quotidiennes caption").text();
$("#visites_quotidiennes")
.before("<h3 class='caption'>" + titre + "</h3>")
.wrap("<div class='statistiques_visites_quotidiennes statistiques_visites'></div>");
// copier le titre des tableaux
titre = $("#visites_quotidiennes caption").text();
$("#visites_quotidiennes")
.before("<h3 class='caption'>" + titre + "</h3>")
.wrap("<div class='statistiques_visites_quotidiennes statistiques_visites'></div>");
titre = $("#visites_mensuelles caption").text();
$("#visites_mensuelles")
.before("<h3 class='caption'>" + titre + "</h3>")
.wrap("<div class='statistiques_visites_mensuelles statistiques_visites'></div>");;
// mettre les visites avec un fond colore pour le graphique
$("#visites_mensuelles thead th:eq(1), #visites_quotidiennes thead th:eq(1)").addClass('flotFill');
params = {
legendeExterne:true,
legendeActions:true,
width:'480px',
height:'200px',
modeDate:true,
zoom:true,
parse:{
axeOnTitle:true,
defaultSerie:{
bars:{show:false},
lines:{show:true}
}
},
titre = $("#visites_mensuelles caption").text();
$("#visites_mensuelles")
.before("<h3 class='caption'>" + titre + "</h3>")
.wrap("<div class='statistiques_visites_mensuelles statistiques_visites'></div>");;
// mettre les visites avec un fond colore pour le graphique
$("#visites_mensuelles thead th:eq(1), #visites_quotidiennes thead th:eq(1)").addClass('flotFill');
params = {
legendeExterne:true,
legendeActions:true,
width:'480px',
height:'200px',
modeDate:true,
zoom:true,
parse:{
axeOnTitle:true,
defaultSerie:{
bars:{show:false},
lines:{show:true}
}
},
flot:{
xaxis:{
labelWidth:30,
monthNames: [
'[(#VAL{2000-01-01}|nom_mois)]',
'[(#VAL{2000-02-01}|nom_mois)]',
'[(#VAL{2000-03-01}|nom_mois)]',
'[(#VAL{2000-04-01}|nom_mois)]',
'[(#VAL{2000-05-01}|nom_mois)]',
'[(#VAL{2000-06-01}|nom_mois)]',
'[(#VAL{2000-07-01}|nom_mois)]',
'[(#VAL{2000-08-01}|nom_mois)]',
'[(#VAL{2000-09-01}|nom_mois)]',
'[(#VAL{2000-10-01}|nom_mois)]',
'[(#VAL{2000-11-01}|nom_mois)]',
'[(#VAL{2000-12-01}|nom_mois)]'
]
}
},
infobulle:{show:true}
}
$("#visites_quotidiennes").tFlot(
$.extend(true, {}, params, {
grille:{weekend:true}
})
);
$("#visites_mensuelles").tFlot(
$.extend(true, {}, params, {
grille:{years:true},
flot:{
xaxis:{
labelWidth:30,
monthNames: [
'[(#VAL{2000-01-01}|nom_mois)]',
'[(#VAL{2000-02-01}|nom_mois)]',
'[(#VAL{2000-03-01}|nom_mois)]',
'[(#VAL{2000-04-01}|nom_mois)]',
'[(#VAL{2000-05-01}|nom_mois)]',
'[(#VAL{2000-06-01}|nom_mois)]',
'[(#VAL{2000-07-01}|nom_mois)]',
'[(#VAL{2000-08-01}|nom_mois)]',
'[(#VAL{2000-09-01}|nom_mois)]',
'[(#VAL{2000-10-01}|nom_mois)]',
'[(#VAL{2000-11-01}|nom_mois)]',
'[(#VAL{2000-12-01}|nom_mois)]'
]
}
},
infobulle:{show:true}
}
$("#visites_quotidiennes").tFlot(
$.extend(true, {}, params, {
grille:{weekend:true}
})
);
$("#visites_mensuelles").tFlot(
$.extend(true, {}, params, {
grille:{years:true},
flot:{
xaxis:{
timeformat:"%b %y"
}
timeformat:"%b %y"
}
})
);
}
})
);
}
(function($){
$(document).ready(function(){
trace_stats();
onAjaxLoad(trace_stats);
});
})(jQuery);
</script>

Loading…
Cancel
Save