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_effacer_stats', array()); |
---|
75 | } |
---|
76 | |
---|
77 | return $flux; |
---|
78 | } |
---|
79 | |
---|
80 | |
---|
81 | /** |
---|
82 | * Ajoute les boutons d'administration indiquant la popularité et les visites d'un objet |
---|
83 | * |
---|
84 | * @uses admin_stats() |
---|
85 | * @pipeline formulaire_admin |
---|
86 | * @param array $flux Données du pipeline |
---|
87 | * @return array Données du pipeline |
---|
88 | **/ |
---|
89 | function stats_formulaire_admin($flux) { |
---|
90 | if ( |
---|
91 | isset($flux['args']['contexte']['objet']) |
---|
92 | AND $objet = $flux['args']['contexte']['objet'] |
---|
93 | AND isset($flux['args']['contexte']['id_objet']) |
---|
94 | AND $id_objet = $flux['args']['contexte']['id_objet'] |
---|
95 | ) { |
---|
96 | if ($l = admin_stats($objet, $id_objet, defined('_VAR_PREVIEW') ? _VAR_PREVIEW : '')) { |
---|
97 | $btn = recuperer_fond('prive/bouton/statistiques', array( |
---|
98 | 'visites' => $l[0], |
---|
99 | 'popularite' => $l[1], |
---|
100 | 'statistiques' => $l[2], |
---|
101 | )); |
---|
102 | $flux['data'] = preg_replace('%(<!--extra-->)%is', $btn . '$1', $flux['data']); |
---|
103 | } |
---|
104 | } |
---|
105 | |
---|
106 | return $flux; |
---|
107 | } |
---|
108 | |
---|
109 | /** |
---|
110 | * Calcule les visites et popularite d'un objet éditorial |
---|
111 | * |
---|
112 | * @note |
---|
113 | * Actuellement uniquement valable pour les articles. |
---|
114 | * |
---|
115 | * @param string $objet |
---|
116 | * @param int $id_objet |
---|
117 | * @param string $var_preview |
---|
118 | * Indique si on est en prévisualisation : pas de statistiques dans ce cas. |
---|
119 | * @return false|array |
---|
120 | * - false : pas de statistiques disponibles |
---|
121 | * - array : Tableau les stats `[visites, popularité, url]` |
---|
122 | **/ |
---|
123 | function admin_stats($objet, $id_objet, $var_preview = "") { |
---|
124 | if ($GLOBALS['meta']["activer_statistiques"] != "non" |
---|
125 | AND $objet == 'article' |
---|
126 | AND !$var_preview |
---|
127 | AND autoriser('voirstats') |
---|
128 | ) { |
---|
129 | $row = sql_fetsel("visites, popularite", "spip_articles", "id_article=$id_objet AND statut='publie'"); |
---|
130 | |
---|
131 | if ($row) { |
---|
132 | return array( |
---|
133 | intval($row['visites']), |
---|
134 | ceil($row['popularite']), |
---|
135 | str_replace('&', '&', generer_url_ecrire_statistiques($id_objet)) |
---|
136 | ); |
---|
137 | } |
---|
138 | } |
---|
139 | |
---|
140 | return false; |
---|
141 | } |
---|
142 | |
---|
143 | /** |
---|
144 | * Génère URL de la page dans l'espace privé permettant de visualiser les statistiques d'un article |
---|
145 | * |
---|
146 | * @param int $id_article |
---|
147 | * @return string URL |
---|
148 | **/ |
---|
149 | function generer_url_ecrire_statistiques($id_article) { |
---|
150 | return generer_url_ecrire('stats_visites', "id_article=$id_article"); |
---|
151 | } |
---|
152 | |
---|
153 | |
---|
154 | /** |
---|
155 | * Ajoute le cron de traitement des statistiques et calcul des popularités |
---|
156 | * |
---|
157 | * @pipeline taches_generales_cron |
---|
158 | * @param array $taches_generales |
---|
159 | * Tableau `[nom de la tache => intervalle en secondes]` |
---|
160 | * @return array |
---|
161 | * Tableau `[nom de la tache => intervalle en secondes]` |
---|
162 | **/ |
---|
163 | function stats_taches_generales_cron($taches_generales) { |
---|
164 | |
---|
165 | // stats : toutes les 5 minutes on peut vider un panier de visites |
---|
166 | if (isset($GLOBALS['meta']["activer_statistiques"]) |
---|
167 | AND $GLOBALS['meta']["activer_statistiques"] == "oui" |
---|
168 | ) { |
---|
169 | $taches_generales['visites'] = 300; |
---|
170 | $taches_generales['popularites'] = 7200; # calcul lourd |
---|
171 | } |
---|
172 | |
---|
173 | return $taches_generales; |
---|
174 | } |
---|
175 | |
---|
176 | /** |
---|
177 | * Lister les metas de statistiques et leurs valeurs par défaut |
---|
178 | * |
---|
179 | * @pipeline configurer_liste_metas |
---|
180 | * @param array $metas |
---|
181 | * Couples nom de la méta => valeur par défaut |
---|
182 | * @return array |
---|
183 | * Couples nom de la méta => valeur par défaut |
---|
184 | */ |
---|
185 | function stats_configurer_liste_metas($metas) { |
---|
186 | $metas['activer_statistiques'] = 'non'; |
---|
187 | $metas['activer_captures_referers'] = 'non'; |
---|
188 | |
---|
189 | return $metas; |
---|
190 | } |
---|
191 | |
---|
192 | /** |
---|
193 | * Afficher le lien vers la page de statistique sur la vue d'un article dans l'espace privé |
---|
194 | * |
---|
195 | * @pipeline boite_infos |
---|
196 | * @param array $flux Données du pipeline |
---|
197 | * @return array Données du pipeline |
---|
198 | */ |
---|
199 | function stats_boite_infos($flux) { |
---|
200 | if ($GLOBALS['meta']["activer_statistiques"] == "oui") { |
---|
201 | if ($flux['args']['type'] == 'article' |
---|
202 | AND $id_article = $flux['args']['id'] |
---|
203 | AND autoriser('voirstats', 'article', $id_article) |
---|
204 | ) { |
---|
205 | $visites = sql_getfetsel('visites', 'spip_articles', 'id_article=' . intval($id_article)); |
---|
206 | if ($visites > 0) { |
---|
207 | $icone_horizontale = chercher_filtre('icone_horizontale'); |
---|
208 | $flux['data'] .= $icone_horizontale(generer_url_ecrire("stats_visites", "id_article=$id_article"), |
---|
209 | _T('statistiques:icone_evolution_visites', array('visites' => $visites)), "statistique-24.png"); |
---|
210 | } |
---|
211 | } |
---|
212 | } |
---|
213 | |
---|
214 | return $flux; |
---|
215 | } |
---|
216 | |
---|
217 | ?> |
---|