26a90a6460bb7c0c11e6adb27b194efd2fae8106
[lhc/web/www.git] / www / plugins-dist / statistiques / stats_pipelines.php
1 <?php
2
3 /**
4 * Déclarations d'autorisations et utilisations de pipelines
5 *
6 * @plugin Statistiques pour SPIP
7 * @license GNU/GPL
8 * @package SPIP\Stats\Pipelines
9 **/
10
11 if (!defined('_ECRIRE_INC_VERSION')) {
12 return;
13 }
14
15
16 /**
17 * Compter les visites sur les pages HTML
18 *
19 * Uniquement si les statistiques sont activées dans la configuration :
20 * - permet de compter par défaut toutes les pages de type HTML
21 * - sauf si on explicite, pour une page donnée, l'entête
22 * header `X-Spip-Visites` à `oui` ou `non`.
23 * Indiquer `oui` pour forcer le comptage de la page, ou `non` pour au contraire l'éviter
24 *
25 * @uses public_stats_dist() si la page doit être comptée.
26 * @pipeline affichage_entetes_final
27 * @param array $entetes liste des entêtes de la page
28 * @return array
29 **/
30 function stats_affichage_entetes_final($entetes) {
31 if (isset($GLOBALS['meta']["activer_statistiques"]) and $GLOBALS['meta']["activer_statistiques"] != "non") {
32 $html = preg_match(',^\s*text/html,', $entetes['Content-Type']);
33
34 // decomptage des visites, on peut forcer a oui ou non avec le header X-Spip-Visites
35 // par defaut on ne compte que les pages en html (ce qui exclue les js,css et flux rss)
36 $spip_compter_visites = $html ? 'oui' : 'non';
37 if (isset($entetes['X-Spip-Visites'])) {
38 $spip_compter_visites = in_array($entetes['X-Spip-Visites'], array('oui', 'non'))
39 ? $entetes['X-Spip-Visites']
40 : $spip_compter_visites;
41 unset($entetes['X-Spip-Visites']);
42 }
43
44 // Gestion des statistiques du site public
45 if ($spip_compter_visites != 'non') {
46 $stats = charger_fonction('stats', 'public');
47 $stats();
48 }
49 }
50
51 return $entetes;
52 }
53
54
55 /**
56 * Compléter des pages de l'espace privé
57 *
58 * - Ajoute les formulaire de configuration des statistiques dans les configurations avancées
59 * - Ajoute les formulaire de suppression des statistiques dans la maintenance technique
60 *
61 * @pipeline affiche_milieu
62 * @param array $flux Données du pipeline
63 * @return array Données du pipeline
64 **/
65 function stats_affiche_milieu($flux) {
66 // afficher le formulaire de configuration (activer ou desactiver les statistiques).
67 if ($flux['args']['exec'] == 'configurer_avancees') {
68 $flux['data'] .= recuperer_fond('prive/squelettes/inclure/configurer',
69 array('configurer' => 'configurer_compteur'));
70 }
71
72 // afficher le formulaire de suppression des visites (configuration > maintenance du site).
73 if ($flux['args']['exec'] == 'admin_tech') {
74 $flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_stats_archiver', array());
75 $flux['data'] .= recuperer_fond('prive/squelettes/inclure/admin_effacer_stats', array());
76 }
77
78 return $flux;
79 }
80
81
82 /**
83 * Ajoute les boutons d'administration indiquant la popularité et les visites d'un objet
84 *
85 * @uses admin_stats()
86 * @pipeline formulaire_admin
87 * @param array $flux Données du pipeline
88 * @return array Données du pipeline
89 **/
90 function stats_formulaire_admin($flux) {
91 if (
92 isset($flux['args']['contexte']['objet'])
93 and $objet = $flux['args']['contexte']['objet']
94 and isset($flux['args']['contexte']['id_objet'])
95 and $id_objet = $flux['args']['contexte']['id_objet']
96 ) {
97 if ($l = admin_stats($objet, $id_objet, defined('_VAR_PREVIEW') ? _VAR_PREVIEW : '')) {
98 $btn = recuperer_fond('prive/bouton/statistiques', array(
99 'visites' => $l[0],
100 'popularite' => $l[1],
101 'statistiques' => $l[2],
102 ));
103 $flux['data'] = preg_replace('%(<!--extra-->)%is', $btn . '$1', $flux['data']);
104 }
105 }
106
107 return $flux;
108 }
109
110 /**
111 * Calcule les visites et popularite d'un objet éditorial
112 *
113 * @note
114 * Actuellement uniquement valable pour les articles.
115 *
116 * @param string $objet
117 * @param int $id_objet
118 * @param string $var_preview
119 * Indique si on est en prévisualisation : pas de statistiques dans ce cas.
120 * @return false|array
121 * - false : pas de statistiques disponibles
122 * - array : Tableau les stats `[visites, popularité, url]`
123 **/
124 function admin_stats($objet, $id_objet, $var_preview = "") {
125 if ($GLOBALS['meta']["activer_statistiques"] != "non"
126 and $objet == 'article'
127 and !$var_preview
128 and autoriser('voirstats')
129 ) {
130 $row = sql_fetsel("visites, popularite", "spip_articles", "id_article=$id_objet AND statut='publie'");
131
132 if ($row) {
133 return array(
134 intval($row['visites']),
135 ceil($row['popularite']),
136 str_replace('&amp;', '&', generer_url_ecrire_statistiques($id_objet))
137 );
138 }
139 }
140
141 return false;
142 }
143
144 /**
145 * Génère URL de la page dans l'espace privé permettant de visualiser les statistiques d'un article
146 *
147 * @param int $id_article
148 * @return string URL
149 **/
150 function generer_url_ecrire_statistiques($id_article) {
151 return generer_url_ecrire('stats_visites', "id_article=$id_article");
152 }
153
154
155 /**
156 * Ajoute le cron de traitement des statistiques et calcul des popularités
157 *
158 * @pipeline taches_generales_cron
159 * @param array $taches_generales
160 * Tableau `[nom de la tache => intervalle en secondes]`
161 * @return array
162 * Tableau `[nom de la tache => intervalle en secondes]`
163 **/
164 function stats_taches_generales_cron($taches_generales) {
165
166 // stats : toutes les 5 minutes on peut vider un panier de visites
167 if (isset($GLOBALS['meta']["activer_statistiques"])
168 and $GLOBALS['meta']["activer_statistiques"] == "oui"
169 ) {
170 $taches_generales['visites'] = 300;
171 $taches_generales['popularites'] = 7200; # calcul lourd
172 }
173
174 return $taches_generales;
175 }
176
177 /**
178 * Lister les metas de statistiques et leurs valeurs par défaut
179 *
180 * @pipeline configurer_liste_metas
181 * @param array $metas
182 * Couples nom de la méta => valeur par défaut
183 * @return array
184 * Couples nom de la méta => valeur par défaut
185 */
186 function stats_configurer_liste_metas($metas) {
187 $metas['activer_statistiques'] = 'non';
188 $metas['activer_captures_referers'] = 'non';
189 $metas['activer_referers']='oui';
190
191 return $metas;
192 }
193
194 /**
195 * Afficher le lien vers la page de statistique sur la vue d'un article dans l'espace privé
196 *
197 * @pipeline boite_infos
198 * @param array $flux Données du pipeline
199 * @return array Données du pipeline
200 */
201 function stats_boite_infos($flux) {
202 if ($GLOBALS['meta']["activer_statistiques"] == "oui") {
203 if ($flux['args']['type'] == 'article'
204 and $id_article = $flux['args']['id']
205 and autoriser('voirstats', 'article', $id_article)
206 ) {
207 $visites = sql_getfetsel('visites', 'spip_articles', 'id_article=' . intval($id_article));
208 if ($visites > 0) {
209 $icone_horizontale = chercher_filtre('icone_horizontale');
210 $flux['data'] .= $icone_horizontale(generer_url_ecrire("stats_visites", "id_article=$id_article"),
211 _T('statistiques:icone_evolution_visites', array('visites' => $visites)), "statistique-24.png");
212 }
213 }
214 }
215
216 return $flux;
217 }