From 0d46ac67ef14bcea76d9a6029a66dcd900d5f98b Mon Sep 17 00:00:00 2001 From: "ben.spip@gmail.com" <> Date: Sat, 30 May 2009 14:38:35 +0000 Subject: [PATCH] _plugins_/_core_ vers _core_/plugins --- .gitattributes | 28 + base/delete_statistiques.php | 34 + base/stats.php | 65 + base/stats_upgrade.php | 33 + engines-list.txt | 274 ++++ exec/statistiques_lang.php | 123 ++ exec/statistiques_referers.php | 77 + exec/statistiques_repartition.php | 180 +++ exec/statistiques_visites.php | 179 +++ formulaires/configurer_compteur.html | 42 + formulaires/configurer_compteur.php | 44 + genie/popularites.php | 83 + genie/visites.php | 224 +++ inc/referenceurs.php | 241 +++ inc/statistiques.php | 502 ++++++ javascript/excanvas.js | 785 ++++++++++ javascript/jquery.flot.js | 2136 ++++++++++++++++++++++++++ javascript/jquery.tflot.js | 714 +++++++++ plugin.xml | 87 ++ prive/bouton/statistiques.html | 3 + prive/configurer/compteur.html | 3 + prive/images/statistiques-48.png | Bin 0 -> 2795 bytes prive/stats/visites.html | 78 + prive/style_prive_plugin_stats.html | 76 + public/stats.php | 92 ++ stats_autoriser.php | 34 + stats_options.php | 5 + stats_pipelines.php | 127 ++ 28 files changed, 6269 insertions(+) create mode 100644 .gitattributes create mode 100644 base/delete_statistiques.php create mode 100644 base/stats.php create mode 100644 base/stats_upgrade.php create mode 100644 engines-list.txt create mode 100644 exec/statistiques_lang.php create mode 100644 exec/statistiques_referers.php create mode 100644 exec/statistiques_repartition.php create mode 100644 exec/statistiques_visites.php create mode 100644 formulaires/configurer_compteur.html create mode 100644 formulaires/configurer_compteur.php create mode 100644 genie/popularites.php create mode 100644 genie/visites.php create mode 100644 inc/referenceurs.php create mode 100644 inc/statistiques.php create mode 100644 javascript/excanvas.js create mode 100644 javascript/jquery.flot.js create mode 100644 javascript/jquery.tflot.js create mode 100644 plugin.xml create mode 100644 prive/bouton/statistiques.html create mode 100644 prive/configurer/compteur.html create mode 100644 prive/images/statistiques-48.png create mode 100644 prive/stats/visites.html create mode 100644 prive/style_prive_plugin_stats.html create mode 100644 public/stats.php create mode 100644 stats_autoriser.php create mode 100644 stats_options.php create mode 100644 stats_pipelines.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d94f874 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,28 @@ +* text=auto !eol +base/delete_statistiques.php -text +base/stats.php -text +base/stats_upgrade.php -text +/engines-list.txt -text +exec/statistiques_lang.php -text +exec/statistiques_referers.php -text +exec/statistiques_repartition.php -text +exec/statistiques_visites.php -text +formulaires/configurer_compteur.html -text +formulaires/configurer_compteur.php -text +genie/popularites.php -text +genie/visites.php -text +inc/referenceurs.php -text +inc/statistiques.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/configurer/compteur.html -text +prive/images/statistiques-48.png -text +prive/stats/visites.html -text +prive/style_prive_plugin_stats.html -text +public/stats.php -text +/stats_autoriser.php -text +/stats_options.php -text +/stats_pipelines.php -text diff --git a/base/delete_statistiques.php b/base/delete_statistiques.php new file mode 100644 index 0000000..0277411 --- /dev/null +++ b/base/delete_statistiques.php @@ -0,0 +1,34 @@ +0, 'referers'=>0, 'popularite'=>0)); + + // un pipeline pour detruire les tables de stats installees par les plugins + pipeline('delete_statistiques', ''); + spip_log("raz des stats operee redirige vers " . _request('redirect')); +} +?> diff --git a/base/stats.php b/base/stats.php new file mode 100644 index 0000000..37579d5 --- /dev/null +++ b/base/stats.php @@ -0,0 +1,65 @@ + "DATE NOT NULL", + "visites" => "int UNSIGNED DEFAULT '0' NOT NULL", + "maj" => "TIMESTAMP"); + + $spip_visites_key = array( + "PRIMARY KEY" => "date"); + + $spip_visites_articles = array( + "date" => "DATE NOT NULL", + "id_article" => "int UNSIGNED NOT NULL", + "visites" => "int UNSIGNED DEFAULT '0' NOT NULL", + "maj" => "TIMESTAMP"); + + $spip_visites_articles_key = array( + "PRIMARY KEY" => "date, id_article"); + + + + $spip_referers = array( + "referer_md5" => "bigint UNSIGNED NOT NULL", + "date" => "DATE NOT NULL", + "referer" => "VARCHAR (255)", + "visites" => "int UNSIGNED NOT NULL", + "visites_jour" => "int UNSIGNED NOT NULL", + "visites_veille"=> "int UNSIGNED NOT NULL", + "maj" => "TIMESTAMP"); + + $spip_referers_key = array( + "PRIMARY KEY" => "referer_md5"); + + $spip_referers_articles = array( + "id_article" => "int UNSIGNED NOT NULL", + "referer_md5" => "bigint UNSIGNED NOT NULL", + "referer" => "VARCHAR (255) DEFAULT '' NOT NULL", + "visites" => "int UNSIGNED NOT NULL", + "maj" => "TIMESTAMP"); + + $spip_referers_articles_key = array( + "PRIMARY KEY" => "id_article, referer_md5", + "KEY referer_md5" => "referer_md5"); + + $tables_auxiliaires['spip_visites'] = array( + 'field' => &$spip_visites, + 'key' => &$spip_visites_key); + $tables_auxiliaires['spip_visites_articles'] = array( + 'field' => &$spip_visites_articles, + 'key' => &$spip_visites_articles_key); + $tables_auxiliaires['spip_referers'] = array( + 'field' => &$spip_referers, + 'key' => &$spip_referers_key); + $tables_auxiliaires['spip_referers_articles'] = array( + 'field' => &$spip_referers_articles, + 'key' => &$spip_referers_articles_key); + + return $tables_auxiliaires; +} + +?> diff --git a/base/stats_upgrade.php b/base/stats_upgrade.php new file mode 100644 index 0000000..d8b3fff --- /dev/null +++ b/base/stats_upgrade.php @@ -0,0 +1,33 @@ + diff --git a/engines-list.txt b/engines-list.txt new file mode 100644 index 0000000..62ccc1a --- /dev/null +++ b/engines-list.txt @@ -0,0 +1,274 @@ +# ----------------------------------------------------------------------------- +# Les Visiteurs - Engines List +# ----------------------------------------------------------------------------- +# [Engine Name] +# word= | word => query | directory +# host 1 +# host 2 +# hots ... +# ----------------------------------------------------------------------------- +# sort the list according your visits (see your referrers). +# ----------------------------------------------------------------------------- + +[IP] +rien= +[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ + +[Google] +(^q|\&q|as_q)= +(www\.|ww\.|maps\.)?(google|gogole)\.(.*) +(web|www).toile.com +www\.cegetel\.net +search\.conduit\.com +search\.sweetim\.com +chello\.fr + +[Voila] +(kw|rdata)= +(search|moteur)(.*)\.voila\.(fr|com) + +[Yahoo!] +p= +(.*)(search|ink|dir|google)\.yahoo\.([a-z]+)$ + +[AltaVista] +q= +(.*)altavista\.com + +[Ask] +q= +(.*)\.ask\.com + +[HotBot] +query= +www\.hotbot\.com + +[Freeserve] +q= +search\.freeserve\.com + +[Skeech] +query= +skeech\.com + +[Dogpile] +query= +(.*)dogpile\.com + +[Metacrawler] +query= +metacrawler\.com + +[Mirago] +qry= +www.mirago\.([a-z]+)$ + +[Nomade] +s= +(.*)\.nomade\.fr +(.*)\.nomade\.tiscali\.fr +(.*)\.nomade\.aliceadsl\.fr + +[Alice] +qs= +\.aliceadsl\. + +[Lycos] +query= +search\.lycos\.com +vachercher\.lycos\.fr + +[Francite] +name= +recherche\.francite\.com + +[MSN] +(q|s)= +search(.*)\.msn\.([a-z.]+)$ +leguide(.*)\.msn\.([a-z]+)$ +search\.ninemsn\.com\.au + +[Live] +q= +search\.live\.com + +[Excite] +search= +www\.excite\.fr +(.*)\.excite\.co\.jp + +[AOL France] +(query|q|r)= +(.*)recherchet?\.aol\.fr + +[AOLsearch] +query= +(.*)search\.aol\.(.*) + +[AllTheWeb] +q= +www\.alltheweb\.com + +[ixquick] +query= +ixquick\.com + +[Netscape] +search= +search-intl\.netscape\.com +search\.netscape\.com +www\.netscape\.fr + +[Free] +q= +search(.*)\.free\.fr + +[9online] +query= +www\.9online\.fr + +[Naver] +query= +search\.naver\.com + +[Club Internet] +q= +recherche\.club-internet\.fr + +[Sympatico] +query= +search\.sli\.sympatico\.ca + +[Overture] +Keywords= +www\.overture\.com + +[moteur-recherche.net] +keyword= +www\.moteur-recherche\.net + +[Reacteur.com] +kw= +www\.reacteur\.com + +[francesurf] +q= +www\.francesurf\.net + +[n9uf] +((K|k)eywords|query)= +(www\.)?neuf\.fr + +[MozBot] +q= +www\.mozbot\.([a-z]+)$ + +[Cegetel] +q= +(www\.)?cegetel\.([a-z]+)$ + +[MyWay] +searchfor= +kf\.mysearch\.myway\.com +www\.mywebsearch\.com +(.*)\.mysearch\.com + +[MonGenie] +Keywords= +www\.mongenie\.com + +[Need2Find] +searchfor= +kx\.search\.need2find\.com + +[Exalead] +q= +www\.exalead\.fr +www\.exalead\.com + +[Virgilio.it] +qs= +search\.virgilio\.it + +[Libero.it] +query= +arianna\.libero\.it + +[LemmeFind] +t= +www\.lemmefind\.fr + +[NovoNeo] +q= +www\.novoneo\.com + +[MyWebSearch] +searchfor= +search\.mywebsearch\.com + +[Copernic] +query= +find\.copernic\.com + +[Seek] +qry_str= +\.seek\.fr + +[Orange, le moteur] +rdata= +www\.lemoteur\.fr + +[alOt] +q= +search\.alot\.com + +# +# Dmoz +# +[dmoz.org] +rien= +(.*\.)?dmoz\.org + +[FoxRef] +key= +www\.foxref\.org + +[OneBigWorld] +Keywords= +fr\.onebigworld\.com + +[BlueWin] +query= +search\.bluewin\.ch + +[EO] +q= +www\.eo\.st + +[HooSeek] +recherche= +(www\.)?hooseek\.com + +[Lost] +x_query= +(www\.)?lo\.st + +[Babylon] +q= +search\.babylon\.com + +# +# Services de mail +# + +[(email)] +rien= +imp(.*)\.free\.fr +fc\.kayenta\.com +courrielweb\.cmaisonneuve\.qc\.ca +(.*)mail\.(.*)\.([a-z]+)$ +webmail([0-9]*)\.wanadoo\.fr +www\.laposte\.net +mail([0-9]*)\.voila\.fr +\/(web)?mail\/ + diff --git a/exec/statistiques_lang.php b/exec/statistiques_lang.php new file mode 100644 index 0000000..c3376fb --- /dev/null +++ b/exec/statistiques_lang.php @@ -0,0 +1,123 @@ +"; + + echo gros_titre(_T('onglet_repartition_lang'),'', false); + + echo barre_onglets("statistiques", "statistiques_lang"); + + if ($critere == "debut") { + $critere = "visites"; + echo ""._T('icone_repartition_actuelle').''; + echo " | "._T('onglet_repartition_debut').''; + } + else { + $critere = "popularite"; + echo ""._T('icone_repartition_actuelle').''; + echo " | "._T('onglet_repartition_debut').''; + } + + +// +// Statistiques par langue +// + + + echo debut_cadre_enfonce("langues-24.gif", true); + + $r = sql_fetsel("SUM($critere) AS total_visites", "spip_articles"); + + $visites = 1; + if ($r) + $total_visites = $r['total_visites']; + else + $total_visites = 1; + + $result = sql_select("lang, SUM(".$critere.") AS cnt", "spip_articles", "statut='publie' ", "lang"); + + echo "\n"; + $ifond = 1; + + $visites_abs = 0; + while ($row = sql_fetch($result)) { + + $lang = $row['lang']; + if ($row['cnt']) { + $visites = round($row['cnt'] / $total_visites * $taille); + $pourcent = round($row['cnt'] / $total_visites * 100); + } + + if ($visites > 0) { + + if ($ifond==0){ + $ifond=1; + $couleur="white"; + }else{ + $ifond=0; + $couleur="eeeeee"; + } + + echo "\n"; + $dir=lang_dir($lang,'',' dir="rtl"'); + echo ""; + + echo ""; + echo ""; + $visites_abs += $visites; + } + } + echo "
$pourcent%".traduire_nom_langue($lang).""; + echo "\n"; + echo "\n
"; + if ($visites_abs > 0) echo " "; + if ($visites>0) echo " "; + echo "
\n"; + + echo "
\n"; + + +//echo "

"._T('texte_signification').""; + + echo fin_cadre_enfonce(true); + + echo ""; + echo fin_page(); +} +?> diff --git a/exec/statistiques_referers.php b/exec/statistiques_referers.php new file mode 100644 index 0000000..9e65ecd --- /dev/null +++ b/exec/statistiques_referers.php @@ -0,0 +1,77 @@ +'veille') $jour='jour'; + + $referenceurs = charger_fonction('referenceurs', 'inc'); + $res = $referenceurs (0, "SUM(visites_$jour)", 'spip_referers', "visites_$jour>0", "referer", $limit); + + $n = count($res); + $args = "jour=$jour@limit=" . strval($limit+200); + $plus = generer_url_ecrire('statistiques_visites', $args); + + if ($plus) { + $plus = ($limit == $n) + ? "

+++
" + : ''; + } + + $titre = _T('titre_liens_entrants') + . " ($n " + . ($n <= 1 ? _T('info_site') : _T('info_sites')) + . ")"; + + $commencer_page = charger_fonction('commencer_page', 'inc'); + + echo $commencer_page(_T('titre_page_statistiques_referers'), "statistiques_visites", "referers"); + + echo gros_titre($titre,'', false); + echo debut_gauche('', true); + echo debut_boite_info(true); + echo "

"; + echo _T('info_gauche_statistiques_referers'); + echo "

"; + echo fin_boite_info(true); + echo debut_droite('', true); + echo barre_onglets("stat_referers", $jour . '_referers'); // attention a pas avoir le meme id d'onglet... + + if ($res) { + echo "
"; + echo ""; + echo $plus; + } + echo "

"; + + echo fin_gauche(), fin_page(); + } +} + +?> diff --git a/exec/statistiques_repartition.php b/exec/statistiques_repartition.php new file mode 100644 index 0000000..347abb2 --- /dev/null +++ b/exec/statistiques_repartition.php @@ -0,0 +1,180 @@ +0 OR $nombre_abs[$id_rubrique]>0){ + $largeur_rouge = floor(($nombre_vis[$id_rubrique] - $nombre_abs[$id_rubrique]) * $taille / $abs_total); + $largeur_vert = floor($nombre_abs[$id_rubrique] * $taille / $abs_total); + + if ($largeur_rouge+$largeur_vert>0){ + + if ($niveau == 0) { + $couleur="#cccccc"; + } + + else if ($niveau == 1) { + $couleur="#eeeeee"; + } + else { + $couleur="white"; + } + echo ""; + echo "\n"; + echo "\n"; + + + if ($niveau==0 OR 1==1){ + $pourcent = round($nombre_vis[$id_rubrique]/$abs_total*1000)/10; + echo "\n"; + } + else { echo ""; } + + + echo "\n
"; + + + if ( $largeur_rouge > 2) + echo bouton_block_depliable("$titre","incertain", "stats$id_rubrique"); + else + echo "
", + "$titre", + "
"; + echo "
$pourcent%"; + + + echo "\n"; + echo "\n"; + if ($gauche > 0) echo ""; + echo "\n
"; + echo "
"; + if ($visites_abs > 0) echo " "; + if ($largeur_rouge>0) echo " "; + if ($largeur_vert>0) echo " "; + echo "
"; + echo "
\n"; + echo "
"; + } + } + + if (isset($largeur_rouge) && ($largeur_rouge > 0)) { + $niveau++; + echo debut_block_depliable(false,"stats$id_rubrique"); + enfants_aff($id_rubrique,$largeur_rouge, $critere, $visites_abs+$gauche); + echo fin_block(); + $niveau--; + } + $visites_abs = $visites_abs + round($nombre_vis[$id_rubrique]/$abs_total*$taille); + } +} + +// http://doc.spip.org/@exec_statistiques_repartition_dist +function exec_statistiques_repartition_dist() +{ + + global $abs_total, $nombre_vis, $taille, $spip_ecran; + + if (!autoriser('voirstats')) { + include_spip('inc/minipres'); + echo minipres(); + } else { + + $taille = _request('taille'); + $commencer_page = charger_fonction('commencer_page', 'inc'); + echo $commencer_page(_T('titre_page_statistiques'), "statistiques_visites", "repartition"); + + echo debut_grand_cadre(true); + echo gros_titre(_T('titre_page_statistiques'),'',false); + + echo barre_onglets("statistiques", "statistiques_repartition"); + + if ($spip_ecran == "large") { + $largeur_table = 974; + $taille = 550; + } else { + $largeur_table = 750; + $taille = 400; + } + + echo "\n

"; + $critere = _request('critere'); + + if ($critere == "debut") { + $critere = "visites"; + echo ""._T('icone_repartition_actuelle').''; + echo " | "._T('onglet_repartition_debut').''; + } + else { + $critere = "popularite"; + echo ""._T('icone_repartition_actuelle').''; + echo " | "._T('onglet_repartition_debut').''; + } + + $abs_total=enfants(0, $critere); + if ($abs_total<1) $abs_total=1; + $nombre_vis[0] = 0; + + echo debut_cadre_relief("statistiques-24.gif",true); + echo "
"; + enfants_aff(0,$taille, $critere); + echo "

", + "
", + _T('texte_signification'), + "
"; + echo fin_cadre_relief(true); + echo "
"; + echo fin_grand_cadre(true),fin_page(); + } +} +?> diff --git a/exec/statistiques_visites.php b/exec/statistiques_visites.php new file mode 100644 index 0000000..9228bc6 --- /dev/null +++ b/exec/statistiques_visites.php @@ -0,0 +1,179 @@ +".aide("confstat")."",'', false); +// barre_onglets("statistiques", "evolution"); + if ($titre) echo gros_titre($titre,'', false); + + echo barre_onglets("statistiques", "statistiques_visites"); + + echo debut_gauche('', true); + echo "
"; + echo "
"; + echo "
"; + echo typo(_T('info_afficher_visites')); + echo ""; + echo "
"; + echo "
"; + + $classement = array(); + $liste = 0; + echo aff_statistique_visites_popularite($serveur, $id_article, $classement, $liste); + + // Par visites depuis le debut + $result = aff_statistique_visites_par_visites($serveur, $id_article, $classement); + + if ($result OR $id_article) + echo creer_colonne_droite('', true); + + if ($id_article) { + echo bloc_des_raccourcis(icone_horizontale(_T('icone_retour_article'), generer_url_ecrire("articles","id_article=$id_article"), "article-24.gif","rien.gif", false)); + } + echo $result; + + echo debut_droite('', true); + + if ($id_article) { + $table = "spip_visites_articles"; + $table_ref = "spip_referers_articles"; + $where = "id_article=$id_article"; + + } else { + $table = "spip_visites"; + $table_ref = "spip_referers"; + $where = ""; + } + + $order = "date"; + + $where2 = $duree ? "$order > DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).",INTERVAL $duree $type)": ''; + if ($where) $where2 = $where2 ? "$where2 AND $where" : $where; + $log = statistiques_collecte_date('visites', "(CEIL(UNIX_TIMESTAMP($order) / $interval) * $interval)", $table, $where2, $serveur); + + + if ($log) + $res = statistiques_tous($log, $id_article, $table, $where, $order, $serveur, $duree, $interval, $total_absolu, $val_popularite, $liste, $classement); + + // installer les js + echo recuperer_fond('prive/stats/visites'); + echo cadre_stat($res, $table, $id_article); + + if ($id_article) { + $signatures = charger_fonction('signatures', 'statistiques'); + echo $signatures($duree, $interval, $type, $id_article, $serveur); + /* + Il faudra optimiser les requetes de ces stats c'est vraiment trop horrible : + plusieurs secondes d'attente sur un site comme contrib. + par ailleurs, l'affichage presente des defauts : + cf http://trac.rezo.net/trac/spip/ticket/1598 + $forums = charger_fonction('forums', 'statistiques'); + echo $forums($duree, $interval, $type, $id_article, $serveur); + */ + } + + + $referenceurs = charger_fonction('referenceurs', 'inc'); + $res = $referenceurs($id_article, "visites", $table_ref, $where, '', $limit); + + if ($res) { + + // Le lien pour en afficher "plus" + $args = ($id_article?"id_article=$id_article&" : '') . "limit=" . strval($limit+200); + $n = count($res); + $plus = generer_url_ecrire('statistiques_visites', $args); + if ($plus) { + $plus = ($limit == $n) + ? "
+++
" + : ''; + } + $titre = _T("onglet_origine_visites") + . " ($n " + . ($n == 1 ? _T('info_site') : _T('info_sites')) + . ")"; + echo gros_titre($titre,'', false); + echo "

"; + echo ""; + echo $plus; + echo "
"; + } + echo fin_gauche(), fin_page(); +} +?> diff --git a/formulaires/configurer_compteur.html b/formulaires/configurer_compteur.html new file mode 100644 index 0000000..4b3ee67 --- /dev/null +++ b/formulaires/configurer_compteur.html @@ -0,0 +1,42 @@ +
+

[(#CHEMIN{images/statistiques-24.gif}|balise_img{'',cadre-icone})]<:info_forum_statistiques:> #AIDER{confstat}

+ + [

(#ENV*{message_ok})

] + [

(#ENV*{message_erreur})

] +
+ [(#ACTION_FORMULAIRE{#ENV{action}})] +
    +
  • + + [(#ENV**{erreurs}|table_valeur{activer_statistiques})] +
    + + +
    +
  • +
  • +
    <:info_question_vignettes_referer:>
    + [(#ENV**{erreurs}|table_valeur{activer_captures_referers})] +
    + + +
    +
  • + +
+

+
+ +
+ \ No newline at end of file diff --git a/formulaires/configurer_compteur.php b/formulaires/configurer_compteur.php new file mode 100644 index 0000000..70a241f --- /dev/null +++ b/formulaires/configurer_compteur.php @@ -0,0 +1,44 @@ +_T('config_info_enregistree')); +} + +?> \ No newline at end of file diff --git a/genie/popularites.php b/genie/popularites.php new file mode 100644 index 0000000..281a440 --- /dev/null +++ b/genie/popularites.php @@ -0,0 +1,83 @@ +'maj', 'popularite' => "popularite * $a")); + + // enregistrer les metas... + $row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles"); + ecrire_meta("popularite_max", $row['max']); + ecrire_meta("popularite_total", $row['tot']); + + + // Une fois par jour purger les referers du jour ; qui deviennent + // donc ceux de la veille ; au passage on stocke une date_statistiques + // dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron + // peut etre appele par deux bases SPIP ne partageant pas le meme + // _DIR_TMP, sans tout casser... + + $aujourdhui = date("Y-m-d"); + if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) { + spip_log("Popularite: purger referer depuis $d"); + ecrire_meta('date_statistiques', $aujourdhui); + #spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0"); + // version 3 fois plus rapide, mais en 2 requetes + #spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'"); + #spip_query("UPDATE spip_referers SET visites_jour=0"); + // version 4 fois plus rapide que la premiere, en une seule requete + sql_alter("TABLE spip_referers DROP visites_veille, + CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0', + ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'"); + } + + // et c'est fini pour cette fois-ci + return 1; + +} + +?> + diff --git a/genie/visites.php b/genie/visites.php new file mode 100644 index 0000000..8aea713 --- /dev/null +++ b/genie/visites.php @@ -0,0 +1,224 @@ + $num) { + list($log_type, $log_id_num, $log_referer) + = preg_split(",\t,", $source, 3); + + // Noter le referer + if ($log_referer) + $referers[$log_referer]++; + + // S'il s'agit d'un article, noter ses visites + if ($log_type == 'article' + AND $id_article = intval($log_id_num)) { + $visites_a[$id_article] ++; + if ($log_referer) + $referers_a[$id_article][$log_referer]++; + } + } +} + + +// http://doc.spip.org/@calculer_visites +function calculer_visites($t) { + include_spip('base/abstract_sql'); + + // Initialisations + $visites = array(); # visites du site + $visites_a = array(); # tableau des visites des articles + $referers = array(); # referers du site + $referers_a = array(); # tableau des referers des articles + + // charger un certain nombre de fichiers de visites, + // et faire les calculs correspondants + + // Traiter jusqu'a 100 sessions datant d'au moins 30 minutes + $sessions = preg_files(sous_repertoire(_DIR_TMP, 'visites')); + + $compteur = _CRON_LOT_FICHIERS_VISITE; + $date_init = time()-30*60; + foreach ($sessions as $item) { + if (($d=@filemtime($item)) < $date_init) { + if (!$d) $d = $date_init; // si le fs ne donne pas de date, on prend celle du traitement, mais tout cela risque d'etre bien douteux + $d = date("Y-m-d",$d); + spip_log("traite la session $item"); + compte_fichier_visite($item, + $visites[$d], $visites_a[$d], $referers[$d], $referers_a[$d]); + spip_unlink($item); + if (--$compteur <= 0) + break; + } + #else spip_log("$item pas vieux"); + } + if (!count($visites)) + return; + + include_spip('genie/popularites'); + list($a,$b) = genie_popularite_constantes(24*3600); + + // Maintenant on dispose de plusieurs tableaux qu'il faut ventiler dans + // les tables spip_visites, spip_visites_articles, spip_referers + // et spip_referers_articles ; attention a affecter tout ca a la bonne + // date (celle de la visite, pas celle du traitement) + foreach(array_keys($visites) as $date) + if ($visites[$date]) { + + // 1. les visites du site (facile) + if (!sql_countsel('spip_visites', "date='$date'")) + sql_insertq('spip_visites', + array('date' => $date, 'visites' => $visites[$date])); + else + sql_update('spip_visites', array('visites' => "visites+".intval($visites[$date])), "date='$date'"); + + // 2. les visites des articles + if ($visites_a[$date]) { + $ar = array(); # tableau num -> liste des articles ayant num visites + foreach($visites_a[$date] as $id_article => $n) { + if (!sql_countsel('spip_visites_articles', + "id_article=$id_article AND date='$date'")){ + sql_insertq('spip_visites_articles', + array('id_article' => $id_article, + 'visites' => 0, + 'date' => $date)); + } + $ar[$n][] = $id_article; + } + foreach ($ar as $n => $liste) { + $tous = sql_in('id_article', $liste); + sql_update('spip_visites_articles', + array('visites' => "visites+$n"), + "date='$date' AND $tous"); + + $ref = $noref = array(); + foreach($liste as $id) { + if (isset($referers_a[$id])) + $ref[]= $id ; + else $noref[]=$id; + } + // il faudrait ponderer la popularite ajoutee ($n) par son anciennete eventuelle + // sur le modele de ce que fait genie/popularites + if (count($noref)) + sql_update('spip_articles', + array('visites' => "visites+$n", + 'popularite' => "popularite+".round($n*$b,2), + 'maj' => 'maj'), + sql_in('id_article',$noref)); + + if (count($ref)) + sql_update('spip_articles', + array('visites' => "visites+".($n+1), + 'popularite' => "popularite+".round($n*$b,2), + 'maj' => 'maj'), + sql_in('id_article',$ref)); + + ## Ajouter un JOIN sur le statut de l'article ? + } + } + // 3. Les referers du site + // insertion pour les nouveaux, au tableau des increments sinon + if ($referers[$date]) { + $ar = array(); + $trouver_table = charger_fonction('trouver_table', 'base'); + $desc = $trouver_table('referers'); + $n = preg_match('/(\d+)/',$desc['field']['referer'], $r); + $n = $n ? $r[1] : 255; + foreach ($referers[$date] as $referer => $num) { + $referer_md5 = sql_hex(substr(md5($referer), 0, 15)); + $referer = substr($referer,0,$n); + if (!sql_countsel('spip_referers', "referer_md5=$referer_md5")) + sql_insertq('spip_referers', + array('visites' => $num, + 'visites_jour' => $num, + 'visites_veille' => $num, + 'date' => $date, + 'referer' => $referer, + 'referer_md5' => $referer_md5)); + else $ar[$num][] = $referer_md5; + } + + // appliquer les increments sur les anciens + // attention on appelle sql_in en mode texte et pas array + // pour ne pas passer sql_quote() sur les '0x1234' de referer_md5, cf #849 + foreach ($ar as $num => $liste) { + sql_update('spip_referers', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"), sql_in('referer_md5',join(', ', $liste))); + } + } + + // 4. Les referers d'articles + if ($referers_a[$date]) { + $ar = array(); + $insert = array(); + // s'assurer d'un slot pour chacun + foreach ($referers_a[$date] as $id_article => $referers) + foreach ($referers as $referer => $num) { + $referer_md5 = sql_hex(substr(md5($referer), 0, 15)); + $prim = "(id_article=$id_article AND referer_md5=$referer_md5)"; + if (!sql_countsel('spip_referers_articles', $prim)) + sql_insertq('spip_referers_articles', + array('visites' => $num, + 'id_article' => $id_article, + 'referer' => $referer, + 'referer_md5' => $referer_md5)); + else $ar[$num][] = $prim; + } + // ajouter les visites + foreach ($ar as $num => $liste) { + sql_update('spip_referers_articles', array('visites' => "visites+$num"), join(" OR ", $liste)); + ## Ajouter un JOIN sur le statut de l'article ? + } + } + } + + // S'il reste des fichiers a manger, le signaler pour reexecution rapide + if ($compteur==0) { + spip_log("il reste des visites a traiter..."); + return -$t; + } +} + +// +// Calcule les stats en plusieurs etapes +// +// http://doc.spip.org/@genie_visites_dist +function genie_visites_dist($t) { + $encore = calculer_visites($t); + + // Si ce n'est pas fini on redonne la meme date au fichier .lock + // pour etre prioritaire lors du cron suivant + if ($encore) + return (0 - $t); + + return 1; +} +?> diff --git a/inc/referenceurs.php b/inc/referenceurs.php new file mode 100644 index 0000000..59a01d6 --- /dev/null +++ b/inc/referenceurs.php @@ -0,0 +1,241 @@ + 18) + $tmp = "/".substr($tmp, 0, 15)."..."; + else if (strlen($tmp) > 0) + $tmp = "/$tmp"; + } + if ($tmp) { + $lesreferers[$numero][] = "".quote_amp(urldecode($tmp))."" . (($visites > 1)?" ($visites)":""). ($id_article ? '' : referes($referermd5)); + } else $lesliensracine[$numero] += $visites; + } + } + + if (!count($nbvisites)) return array(); + arsort($nbvisites); + return referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls); +} + +function referers_group($nbvisites, $id_article, $lesliensracine, $lesreferermd5, $lesreferers, $lesurls) +{ + global $spip_lang_right, $source_vignettes; + $vign = ((strlen($source_vignettes) > 0) && + $GLOBALS['meta']["activer_captures_referers"]!='non'); + $aff = array(); + foreach($nbvisites as $numero => $visites) { + if (!$numero) next; + $referermd5 = $lesreferermd5[$numero]; + $bouton = $ret = ""; + + if ($vign) + $ret = "\n"; + + if ($visites > 5) $bouton .= "$visites "._T('info_visites')." "; + else if ($visites > 1) $bouton .= "$visites "._T('info_visites')." "; + else $bouton .= "$visites "._T('info_visite')." "; + + if ($numero == "(email)") { + $ret .= $bouton . "".$numero.""; + } else { + $n = count($lesreferers[$numero]); + if (($n > 1) || ($n > 0 && substr(supprimer_tags($lesreferers[$numero][0]),0,1) != '/')) { + $rac = $lesliensracine[$numero]; + $bouton .= "".$numero."" + . (!$rac ? '': (" (" . $rac .")")); + $ret .= bouton_block_depliable($bouton,false) + . debut_block_depliable(false) + . "\n" + . fin_block(); + } else { + $ret .= $bouton; + $lien = $n ? $lesreferers[$numero][0] : ''; + if (preg_match(",^(]+>)([^ ]*)( \([0-9]+\))?,i", $lien, $regs)) { + $lien = quote_amp($regs[1]).$numero.$regs[2]; + if (!strpos($lien, '')) $lien .= ''; + } else + $lien = "".$numero.""; + $ret .= "".quote_amp($lien)."" + . ($id_article ? '' : referes($referermd5)); + } + } + $aff[]= $ret; + } + return $aff; +} + +// Les deux fonctions suivantes sont adaptees du code des "Visiteurs", +// par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/) + +// http://doc.spip.org/@stats_load_engines +function stats_load_engines() { + $arr_engines = Array(); + lire_fichier(find_in_path('engines-list.txt'), $moteurs); + foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) { + $ligne = trim($ligne); + if (preg_match(',^\[([^][]*)\]$,S', $ligne, $regs)) { + $moteur = $regs[1]; + $query = ''; + } else if (preg_match(',=$,', $ligne, $regs)) + $query = $ligne; + else + $arr_engines[] = array($moteur,$query,$ligne); + } + return $arr_engines; +} + +// http://doc.spip.org/@stats_show_keywords +function stats_show_keywords($kw_referer, $kw_referer_host) { + static $arr_engines = ''; + static $url_site; + + if (!is_array($arr_engines)) { + // Charger les moteurs de recherche + $arr_engines = stats_load_engines(); + + // initialiser la recherche interne + $url_site = $GLOBALS['meta']['adresse_site']; + $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site)); + } + + if ($url = @parse_url( $kw_referer )) { + $query = isset($url['query'])?$url['query']:""; + $host = strtolower($url['host']); + $path = $url['path']; + } else $query = $host = $path =''; + + // Cette fonction affecte directement les variables selon la query-string ! + parse_str($query); + + $keywords = ''; + $found = false; + + if (!empty($url_site)) { + if (strpos('-'.$kw_referer, $url_site)!==false) { + if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) + $keywords = urldecode($regs[2]); + + + else + return array('host' => ''); + } else + for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++) + { + if ( $found = preg_match(','.$arr_engines[$cnt][2].',', $host) + OR $found = preg_match(','.$arr_engines[$cnt][2].',', $path)) + { + $kw_referer_host = $arr_engines[$cnt][0]; + + if (strpos($arr_engines[$cnt][1],'=')!==false) { + + // Fonctionnement simple: la variable existe + $v = str_replace('=', '', $arr_engines[$cnt][1]); + $keywords = isset($$v)?$$v:""; + + // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable + if (! strlen($keywords) > 0) { + if (preg_match(",".$arr_engines[$cnt][1]."([^\&]*),", $query, $vals)) { + $keywords = urldecode($vals[2]); + } + } + } else { + $keywords = ""; + } + + if (( ($kw_referer_host == "Google") + || ($kw_referer_host == "AOL" && strpos($query,'enc=iso')===false) + || ($kw_referer_host == "MSN") + )) { + include_spip('inc/charsets'); + if (!isset($ie) OR !$cset = $ie) $cset = 'utf-8'; + $keywords = importer_charset($keywords,$cset); + } + $buffer["hostname"] = $kw_referer_host; + } + } + } + + $buffer["host"] = $host; + if (!isset($buffer["hostname"]) OR !$buffer["hostname"]) + $buffer["hostname"] = $host; + + $buffer["path"] = substr($path, 1, strlen($path)); + $buffer["query"] = $query; + + if ($keywords != '') + { + if (strlen($keywords) > 150) { + $keywords = spip_substr($keywords, 0, 148); + // supprimer l'eventuelle entite finale mal coupee + $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords); + } + $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords)))); + } + + return $buffer; + +} + + +// +// Recherche des articles pointes par le referer +// +// http://doc.spip.org/@referes +function referes($referermd5, $serveur='') { + $retarts = sql_allfetsel('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).", INTERVAL 2 DAY))", '', "titre",'','',$serveur); + + foreach ($retarts as $k => $rowart) { + $titre = typo($rowart['titre']); + $url = generer_url_entite($rowart['id_article'], 'article'); + $retarts[$k] = "$titre"; + } + + if (count($retarts) > 1) + return '
→ '.join(',
→ ',$retarts); + if (count($retarts) == 1) + return '
→ '. array_shift($retarts); + return ''; +} + + +?> diff --git a/inc/statistiques.php b/inc/statistiques.php new file mode 100644 index 0000000..d8ee6fe --- /dev/null +++ b/inc/statistiques.php @@ -0,0 +1,502 @@ + 0", "", "popularite DESC",'','',$serveur); + $out = ''; + while ($row = sql_fetch($result,$serveur)) { + $l_article = $row['id_article']; + $liste++; + $classement[$l_article] = $liste; + + if ($liste <= 30) { + $articles_vus[] = $l_article; + $out .= statistiques_populaires($row, $id_article, $liste); + } + } + $recents = array(); + $q = sql_select("id_article", "spip_articles", "statut='publie' AND popularite > 0", "", "date DESC", "10",'',$serveur); + while ($r = sql_fetch($q,$serveur)) + if (!in_array($r['id_article'], $articles_vus)) + $recents[]= $r['id_article']; + + if ($recents) { + $result = sql_select("id_article, titre, popularite, visites", "spip_articles", "statut='publie' AND " . sql_in('id_article', $recents), "", "popularite DESC",'','',$serveur); + + $out .= "
[...]
" . + "