You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
6.9 KiB

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