J'ai essayé de séparer une partie "graph" (plus générale) d'une partie "statistiques" plus particulière à ce graphique particulier, mais ce n'est pas évident.
Le fichier prive/stats/visites charge les JS et CSS de d3 et pour notre graphique.
Il crée alors de graphique des visites. Pour cela, la fonction `spip_d3_statistiques_create(id)` va
- créer un objet Spip_d3_graph() notamment en indiquant la locale désirée. Cet objet est stocké dans la balise #id par un jQuery .data() pour pouvoir le réutiliser ensuite (pour ré-actualiser le graphique avec d'autres données)
- déclarer comment seront préparées et traitées les données JSON reçues (ici on remplit les dates manquantes, et on actualise le tableau html et le graphique svg)
- localiser les dates de d3 avec la locale demandé
- préparer le code html et svg nécessaire (appelle la fonction spip_d3_statistiques_prepare_graph() qui va préparer les axes, histogramme, ligne, etc, mais sans connaître encore les données)
- executer graph.updateJson(), qui va télécharger le json de données, et appliquer dessus les traitements déclarés, ce qui va in fine exécuter spip_d3_statistiques_update_graph() qui dessinera le graphique)
Une navigation au dessus du graphique permet de basculer sur différentes dates et collections de données : 3 mois (90 jours), 2 ans (730 jours), 5 ans (60 mois) et infini (en années). Jusqu'à 2 ans, les données retournées par SPIP sont quotidiennes. En demandant 5 ans, on obtient 60 mois (avec la somme cumulée des visites sur le premier jour du mois) ; en demandant infini (durée -1), on obtient des visites annuelles : ce choix n'est pas anodin car il correspond très exactement à ce qui est proposé en archivage des statistiques : les statistiques de plus de 2 ans sont regroupées en début de mois, et de plus de 5 ans en début d'année. De la sorte, il devrait être possible de mettre une tache périodique qui archive systématiquement les statistiques, pour alléger la base de données, tout en gardant un affichage des graphiques a peu près corrects, même si on perd une partie de l'information.
## Sur le calcul :
On génère un tableau en deux parties :
- une entrée "meta" contient des informations sur les caractéristiques des données calculées / envoyées. Notamment, on retourne l'objet, l'id_objet, la durée et l'unité de la durée qui était désiré. On transmet également des informations calculées en conséquence, tel que la date de début et fin des données désirées (start_date, end_date), et la date de la première donnée dans cette plage (first_date). Enfin une clé 'columns' indique les colonnes et labels des colonnes associés retournées.
- une entrée "data" contient un tableau des données retournées ; (notamment la date et le nombre de visite associées).
Le tableau de données ne retourne plus les dates manquantes : s'il n'y a pas de visite pour une des journées, cette date sera vide. Cela simplifie grandement les calculs ici (mais cela les reporte(ra) côté javascript)
## Sur l'obtention des données :
- On ne passe plus par le système "transmettre", mais par des squelettes à la racine (statistiques.csv.html et statistiques.json.html) qui vérifient soit une autorisation, soit une authentification faible (ce qu'il y avait avant justement). Cette authentification faible peut servir à des crons (je suppose) pour collecter régulièrement les données. Le fichier CSV retourne le même contenu qu'avant (au dates manquantes près), mais le fichier JSON quant à lui retourne l'ensemble du tableau calculé (meta et data donc).
On fait donc un compromis : par defaut on affiche que les 90 derniers jours comme avant, avec un unique lien qui permet d'afficher tout l'historique jour, tous les zooms intermediaires n'ayant aucun interet
Par rapport a avant, on preserve donc la rapidite de la page par defaut, on simplifie l'interface, et on accede facilement a l'historique complet
On supprime donc le double systeme de zoom URL + JS en laissant uniquement le zoom JS : par defaut le graphe jour est zoome sur les 90 derniers jours, mais il suffit de double-clicker pour avoir tout l'historique, que l'on peut zoomer/dezoomer par selection a la souris dans le graphe
1) nettoyage
Permet de supprimer toutes les lignes de spip_referers_articles ou spip_visites_articles qui n'appartiennent pas à un article existant dans spip_articles.
(ça c'est simple)
2) archivage
Permet de concaténer les lignes de spip_visites_articles pour qu'elles occupent moins de place en base de données.
Par défaut, SPIP regroupe les données par jour/article/visites.
On permet, pour les vieilles entrées, de regrouper par mois ou par année. Le total est alors stocké dans le 1er jour du mois ou de l'année.
Par défaut, via les constantes STATISTIQUES_ARCHIVER_PAR_MOIS (valant 2) et STATISTIQUES_ARCHIVER_PAR_AN (valant 5), on concatène :
- par mois ce qui a plus de 2 ans
- par année ce qui a plus de 5 ans
De la sorte, par exemple pour ce qui a plus de 5 ans, au lieu d'avoir une entrée par article et par jour, nous obtenons une entrée par article et par an,
ce qui diminue considérablement le nombre de lignes de spip_visites_articles, sans perte des totaux de chaque article.
Dans la base qui a servi de test, cela passe de 12.5 millions d'entrées (de 2005 à aujourd'hui) à 1.2 millions. C'est encore beaucoup, mais c'est bien moins !
- page des referers : reduire la largeur de la colonne gauche pour eviter cette impression de texte centré (Tetue)
- mettre la miniature en float:right, et reduire sa taille
- echelle axe des Y à droite (près des mesures les plus récentes)
- legende en dessous des graphes, en ligne
- Titre en fer a gauche, regroupé avec les actions de pagination
- graphe des mois depuis l'origine du site par defaut (graphe des jours inchangé sur 90jours)
- axe des X : date humainement lisible (15 janvier au lieu de 15/01/2013)
- eviter les effets de gradients sur les barres ça gene le lisibilité. On met en plein avec une très légere transparence pour ne presque pas distinguer border et background
- le gris des weekend était a peine visible sur certains ecrans, on le fonce
- la barre des changement d'année est de largeur 1 mois sur le graphe des mois
- ne pas masquer l'explication car elle n'est pas visible
- hierarchie de l'info dans le tableau des résumés
Un peu de refactoring js en utilisant closest('.graphique') au lieu d'enchainer les .parent() qui rendent le code peu robuste