29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
29-01-2012 : Parce que nous sommes un peuple debout, agissons pour rester dignes et responsables !
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / eZ Publish / Extensions / ezstats : popularité des articles





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox

ezstats : popularité des articles

Date de publication: le lundi 4 juin 2007 à 23h57
Dernière modification: par Pascal BOYER le samedi 21 juillet 2007 à 20h01
« Article précédent: Random Anti-Spam Image - Image anti-spam aléatoire
» Article suivant: ezjaxx

ezstats : comment afficher la popularité des articles

Cette extension, développée par Konrad Mazurkiewicz (Pologne), permet d'afficher de différentes façons la popularité, c'est à dire le nombre de fois qu'un objet a été vu, d'un ou de plusieurs nœud de eZ publish:

  • popularité d'un nœud,
  • popularité d'une liste de nœuds,
  • popularité en fonction de la classe d'objet,
  • popularité en fonction du temps: mois, année,
  • popularité en fonction des utilisateurs,
  • etc...

Cette extension fonctionne parfaitement avec les versions 3.3 à 3.8.6 de eZ publish et très certainement avec les versions 3.9 (ceci restant tout de même à confirmer).

ezstats peut être téléchargée sur le site officiel de eZ publish dans la section réservées aux contributions relatives aux plugins de templates: page de ezstats

ezstats : versions de l'extension

A la date de rédaction de cet article, la version de ezstats en téléchargement sur le site ez.no est la version 0.4

Vous pouvez cependant accéder à la version de développement (future version 0.5) directement à partir du serveur svn de Konrad:

Pour récupérer la version de développement, tapez cette commande:

~$ svn co svn://svn.sam24.pl/extensions/stats/trunk

Si vous testez cette version de développement vous pouvez envoyer vos retour d'expérience à l'auteur.

ezstats : installation de l'extension

Une fois l'archive téléchargée, désarchivez-la dans le répertoire extension/ placé à la racine de eZ publish:

~# tar xfv stats_0.4.tar.gz -C extension/  

Il vous faudra vraisemblablement devenir super-utilisateur pour avoir les droits d'écriture dans le répertoire extension/

Il faut ensuite que vous modifiez le propriétaire et groupe propriétaire du contenu du répertoire extension/stats/ nouvellement créé. Vous pouvez par exemple prendre pour valeurs celles des deux directives User et Group du fichier de configuration de votre serveur Apache (sous Debian ces deux directives ont par défaut la même valeur www-data) :

~# chown -R www-data:www-data extension/stats/

ezstats : activer l'extension

Pour activer l'extension, vous pouvez soit éditer le fichier de surcharge globale:

settings/override/site.ini.append.php

et ajouter cette ligne à la section [ExtensionSettings] :

ActiveExtensions[]=stats

...auquel cas tous vos siteaccess (dans le cas d'un multisite par exemple) bénéficieront automatiquement de l'extension ezstats.

Ou bien préférer l'activation pour un siteaccess bien précis et auquel cas vous devez ajouter une telle ligne (notez la différence de syntaxe):

ActiveAccessExtensions[]=stats

à la section:

[ExtensionSettings]

du fichier de configuration de surcharge:

site.ini.append.php

de votre siteaccess d'administration.

:
Il n'est pas nécessaire de vider les caches pour que l'extension soit prise en compte.

Créer la nouvelle table ezstats

Avant de pouvoir utiliser votre nouvelle extension, vous devez créer une table qui va recueillir le décompte des clics effectués sur chacun de vos articles/liens.

Pour cela, commencez par vous loguer à votre serveur MySQL (il n'est pas nécessaire d'être root):

~$ mysql -u root -p
Enter password: <mot_de_passe_root_de_mysql>
mysql>;

Pour lister l'ensemble des bases de données que vous pouvez sélectionner, tapez la requête:

mysql> SHOW DATABASES;
 
+------------------+
| Database         |
+------------------+
| database_1
| database_2
| database_3
| database_4
| database_5
| ma_base_ezp
+------------------+
6 rows in set (0.06 sec)
 
mysql>

En supposant que votre base de données se nomme ma_base_ezp, vous la sélectionnez avec:

mysql> USE ma_base_ezp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed

Si vous souhaitez afficher l'ensemble des tables constituant votre base de données, utilisez la requête:

mysql> SHOW TABLES;
+--------------------------------+
| Tables_in_ez_test             |
+--------------------------------+
| audio                          
| audiopls                       
| ezapprove_items                
| ezbasket                       
| ezbinaryfile                   
| ezcollab_group                 
| ezcollab_item                  
| ezcollab_item_group_link       
| ezcollab_item_message_link     
| ezcollab_item_participant_link 
| ezcollab_item_status           
| ezcollab_notification_rule     
| ezcollab_profile               
| ezcollab_simple_message        
| ezcontent_language             
| ezcontentbrowsebookmark        
| ezcontentbrowserecent          
| ezcontentclass                 
| ezcontentclass_attribute       
| ezcontentclass_classgroup      
| ezcontentclassgroup            
| ezcontentobject                
| ezcontentobject_attribute      
| ezcontentobject_link           
| ezcontentobject_name           
| ezcontentobject_tree           
| ezcontentobject_version        
| ezcurrencydata                 
| ezdiscountrule                 
| ezdiscountsubrule              
| ezdiscountsubrule_value        
| ezenumobjectvalue              
| ezenumvalue                    
| ezforgot_password              
| ezgeneral_digest_user_settings 
| ezimage                        
| ezimagefile                    
| ezimagevariation               
| ezinfocollection               
| ezinfocollection_attribute     
| ezkeyword                      
| ezkeyword_attribute_link       
| ezmedia                        
| ezmessage                      
| ezmodule_run                   
| ezmultipricedata               
| eznode_assignment              
| eznotificationcollection       
| eznotificationcollection_item  
| eznotificationevent            
| ezoperation_memento            
| ezorder                        
| ezorder_item                   
| ezorder_status                 
| ezorder_status_history         
| ezpackage                      
| ezpaymentobject                
| ezpdf_export                   
| ezpending_actions              
| ezpolicy                       
| ezpolicy_limitation            
| ezpolicy_limitation_value      
| ezpreferences                  
| ezproductcategory              
| ezproductcollection            
| ezproductcollection_item      
| ezproductcollection_item_opt   
| ezrole                         
| ezrss_export                   
| ezrss_export_item              
| ezrss_import                   
| ezsearch_object_word_link      
| ezsearch_return_count          
| ezsearch_search_phrase         
| ezsearch_word                  
| ezsection                      
| ezsession                      
| ezsite_data                    
| ezsubtree_notification_rule    
| eztipafriend_counter           
| eztipafriend_request           
| eztrigger                      
| ezurl                          
| ezurl_object_link              
| ezurlalias                     
| ezuser                         
| ezuser_accountkey              
| ezuser_discountrule            
| ezuser_role                    
| ezuser_setting                 
| ezuservisit                    
| ezvatrule                      
| ezvatrule_product_category     
| ezvattype                      
| ezview_counter                 
| ezwaituntildatevalue           
| ezwishlist                     
| ezworkflow                     
| ezworkflow_assign              
| ezworkflow_event               
| ezworkflow_group               
| ezworkflow_group_link          
| ezworkflow_process             
+--------------------------------+
103 rows in set (0.00 sec)

A présent, vous devez créer la nouvelle table ezstats.

Création de la table à la main

Si la version de votre serveur MySQL est inférieure à 4.1 alors créez la table avec l'instruction ci-dessous:

mysql> CREATE TABLE ezstats (
    node_id int NOT NULL DEFAULT 0,
    section_id int NOT NULL DEFAULT 0,
    remote_address varchar(127) NULL,
    hit_date timestamp NULL,
    user_contentobject_id int NULL,
    entrypage tinyint NULL
    );
Query OK, 0 rows affected (0.15 sec)
 
mysql>

Par contre, si la version de MySQL est supérieure ou égale à 4.1 alors utilisez cette syntaxe:

CREATE TABLE ezstats (
      node_id int NOT NULL DEFAULT 0,
      object_id int NOT NULL DEFAULT 0,
      section_id int NOT NULL DEFAULT 0,
      remote_address varchar(127) NULL,
      hit_date timestamp NULL DEFAULT CURRENT_TIMESTAMP,
      user_contentobject_id int NULL,
      entrypage tinyint NULL
);

:
Cette instruction crée des champs qui ne seront pas utilisés par les scripts PHP de la version 0.4 de ezstats mais qui le seront par la prochaine version 0.5

Reste ensuite à créer ces deux index:

mysql> CREATE INDEX IX_node_id ON ezstats(node_id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql>
mysql> CREATE INDEX IX_section_id ON ezstats(node_id);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql>

Voilà. La nouvelle table est créée.

Pour quitter MySQL:

mysql> QUIT;
Bye

Création de la table avec le script fourni

Placez-vous dans le répertoire contenant le script create_tables.sql:

~# cd extension/stats/doc/

Si vous avez une version de serveur MySQL inférieure à 4.1 alors vous pouvez utiliser le script tel qu'il est fourni. La commande à lancer est la suivante:

mysql -u root -p<mot de passe>   <nom_de_la_table>   < create_tables.sql

Par contre, si la version de votre serveur MySQL est supérieure ou égale à 4.1 alors, avant de lancer la commande ci-dessus, vous devez remplacer le contenu du fichier create_tables.sql par ceci:

CREATE TABLE ezstats (
    node_id int NOT NULL DEFAULT 0,
    object_id int NOT NULL DEFAULT 0,
    section_id int NOT NULL DEFAULT 0,
    remote_address varchar(127) NULL,
    hit_date timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    user_contentobject_id int NULL,
    entrypage tinyint NULL
    );
GO
CREATE INDEX IX_node_id ON ezstats(node_id);
GO
CREATE INDEX IX_section_id ON ezstats(section_id);
GO

ezstats : création du fichier stats.ini

Dans le répertoire extension/stats/settings/ il y a un fichier d'exemple stats.ini.sample. Faites-en une copie:

~# cp -p extension/stats/settings/stats.ini.sample extension/stats/settings/stats.ini

Par défaut, ce fichier contient ces quelques lignes:

[StatsSettings]
#Prevent from logging eg. xxx.xxx.xxx.googlebot.com, msnbot.com
ExcludeFromLog[]=googlebot
ExcludeFromLog[]=msnbot

Ce fichier a pour fonction de lister les robots des moteurs de recherche dont les requêtes ne doivent pas être prises en compte dans le décomptes des visites de vos articles.

Voici une liste de robots fournie par AWStats pour mon site:

MSNBot
Googlebot
EchO!
Yahoo Slurp
Alexa (IA Archiver)
Nutch
Unknown robot (identified by 'bot/' or 'bot-')
AskJeeves
MSIECrawler
Voila
W3C Validator
W3C jigsaw CSS Validator
Asterias
Unknown robot (identified by 'spider')
findlinks
Unknown robot (identified by 'robot')
larbin
Netcraft

Quelques liens vers des sites spécialisés qui pourront vous apporter une information riche et claire sur la vie des robots, spiders et autres crawlers:

  • L'observatoire des robots des moteurs de recherche Google, Yahoo et MSN

ezstats : le template pagelayout.tpl

Pour que chaque clic sur un lien de votre site induise l'ajout d'une ligne dans la nouvelle table ezstats , il faut renseigner le template pagelayout.tpl (ou ses surcharges) de la sorte:

{include uri="design:stats/set_counter.tpl"}
{include uri="design:stats/get_counter.tpl"}

La première ligne appelle le fichier:

extension/stats/design/standard/templates/stats/set_counter.tpl

quand la seconde appelle:

extension/stats/design/standard/templates/stats/get_counter.tpl

:
Il est important de ne pas placer ces deux lignes dans un bloc caché ( {cache-block ...}{/cache-block}).

Cependant, il vous faudra vraisemblablement modifier le contenu du template get_counter.tpl car il fait référence à la variable $node qui n'est pas disponible dans le template pagelayout.tpl. Donc soit vous modifiez le template en remplaçant $node.node_id par $module_result.node_id soit vous écrivez directement ces deux lignes dans le template pagelayout.tpl:

{ezstats_count( $module_result.node_id, $module_result.section_id )}
Cet article a été vu {ezstats_get_count( hash( 'node_id', $module_result.node_id ) )} fois

Videz les caches puis rechargez la page de votre site public: vous devez être en mesure de voir s'afficher la popularité de la page.

Fonctionnement de la table ezstats

A partir de maintenant, si vous observez le contenu de la table ezstats , vous voyez que chaque clic sur un lien donne lieu à l'ajout d'une ligne dans la table. Et sur la page visitée, le compteur s'incrémente au fur et à mesure des clics.

Donc, si un nœud est visité 7896 alors il y aura 7896 lignes relatives à ce nœud dans la table.

Vous remarquerez également que la table contient dans le champ remote_address l'adresse de la machine qui accède au nœud.

Exclure une machine des statistiques

Si vous hébergez, par exemple, sur votre machine votre site web, vous souhaiterez sûrement exclure votre machine des statistiques. Pour se faire, il vous suffit de repérer la valeur du champ remote_address qui correspond à votre machine puis de recopier l'intégralité de cette valeur dans le tableau du fichier de configuration stats.ini, comme ceci:

ExcludeFromLog[]=www.nomdedomaine.fr

Une fois fait, et sans avoir à vider les caches, vous pouvez contrôler que votre machine n'engendre plus de nouvelles lignes dans la table ezstats .

ezstats : affichage de statistiques complètes

L'extension ezstats propose un template view.tpl qui affiche un tableau relativement complet de la popularité de l'ensemble des objets de votre site.

Interface d'administration

Dans un premier temps, vous pouvez accéder aux statistiques complètes de votre site à travers l'interface d'administration en ajoutant ceci à l'URI:

http://www.monsite.com/index.php/siteaccess_admin/stats/view

...ce qui vous permet d'afficher ceci:

Fig. 1: Vue par défaut des statistiques de popularité des objets du site

L'affichage en fonction du mois ressemble à cela:

Fig. 2: Cumul sur chaque jour du mois de la popularité de l'ensemble des objets du site

La vue qui vraisemblablement vous intéressera le plus est le classement Top100:

Fig. 3: Classement Top 100 de popularité des objets du site

...car comme vous le voyez sur l'image ci-dessus, vous pouvez afficher le classement pour chacune des sections de votre site et/ou pour chaque classe d'objet !

Sur le site public

La description ci-dessous indique la procédure à suivre pour afficher sur le site public l'ensemble des statistiques de popularité de votre site. Certaines informations seront également disponibles: noms des classes d'objets, noms des sections de votre site. Il revient à chacun de juger du bien fondé d'une telle décision...

Pour afficher le tableau de statistiques sur le site public il vous suffit d'ajouter cette ligne à la fin, par exemple, de votre fichier pagelayout.tpl (ou d'une de ses surcharges):

{include uri="design:stats/view.tpl}

Lorsque vous rechargez une page de votre site, vous voyez alors ceci à la suite de votre article:

Fig. 4: Adresse vers laquelle pointe le lien Year:

http://www.linuxorable.fr/ez_publish/index.php/linuxorable/stats/year

Or, par défaut, les utilisateurs anonymes n'ont pas les droits suffisants et nécessaires pour accéder au module stats.

Vous devez donc préalablement accorder au groupe d'utililsateurs auquel vous souhaitez autoriser l'accès à ces statistiques les droits nécessaires.

Si vous souhaitez que tout le monde puisse voir vos statistiques, voici la nouvelle politique de droit que vous devez ajouter au groupe Anonymous:

Fig. 5: Droits devant être assignés au groupe d'utilisateurs Anonymous

Droits à ajouter au groupe d'utilisateurs devant accéder aux statistiques de popularité des objets du site

Les bons droits étant définis, voici ce qui s'affichera alors sur votre site public:

Fig. 6: Affichage Top100 de la popularité des objets du site

Afficher le Top200

Si par hasard le Top100 ne répond pas à vos attentes, vous pouvez bien sûr modifier la valeur 100 pour la remplacer par la valeur de votre choix. Si vous souhaitez afficher la popularité de non pas 100 mais de 200 articles alors vous devez commencer par modifier la valeur 100 de la ligne 74 du fichier extension/stats/modules/stats/ top100.php:

69 $top100 =& $db->arrayQuery( "SELECT ezstats.node_id, COUNT(*) AS hits, ezcontentobject.contentclass_id
 70                              FROM ezstats, ezcontentobject_tree, ezcontentobject
71                              WHERE ezstats.node_id=ezcontentobject_tree.node_id AND
72                              ezcontentobject_tree.contentobject_id=ezcontentobject.id AND
73                              YEAR(hit_date)=$Year AND MONTH(hit_date)=$Month $where_section $where_class
74                              GROUP BY node_id ORDER BY hits DESC LIMIT 100" );

Par exemple:

74                              GROUP BY node_id ORDER BY hits DESC LIMIT 200" );

Pour que s'affiche dans l'interface d'administration le lien Top200 à la place de Top100 vous devez modifier le fichier:

extension/stats/design/standard/templates/stats/stats_header.tpl 

...comme ceci:

2 <a href={"stats/top100"|ezurl}>{"Top200"|i18n("design/stats")}</a> |

Les deux autres liens Top 200 se trouvent dans le template:

extension/stats/design/standard/templates/stats/top100.tpl

dont il faut modifier les lignes 4 et 50:

4 <h1 class="context-title"> {"Top 200 page statistics"|i18n("design/stats")}: {$monthName} {$year} </h1>
..
..
..
..50 <h2 class="context-title">{"Top 200 pages"|i18n("design/stats")}</h2>

Et vous obtiendrez alors l'affichage suivant:

Fig. 7:

Les modifications sont également valables pour l'affichage du tableau sur le site public

ezstats : aller plus loins

Cet article n'est qu'une introduction à l'utilisation de l'extension ezstats et n'a vocation de présenter que le fonctionnement basique de celle-ci afin de répondre au besoin le plus courant: afficher simplement, comme sur ce site, le nombre de fois qu'un objet a été vu.

Si vous souhaitez personnaliser l'affichage de la popularité de vos objets en fonction de certains critères particuliers, je vous recommande vivement la lecture du fichier:

extension/stats/doc/readme.txt

Ajouter un onglet dans l'interface d'administration

Il serait sympatique de mettre en place dans l'interface d'administration un nouvel onglet sur lequel il suffirait de cliquer pour accéder au tableau de statistique. C'est ce que je vous propose de mettre en œuvre.

Le fichier de surcharge m enu.ini.append.php

La première chose à faire, s'il n'existe pas déjà, est de créer un fichier de configuration de surcharge au fichier menu.ini dans le siteaccess d'administration. Ce fichier doit donc se nommer:

settings/siteaccess/siteaccess_administration/menu.ini.append.php

Ne reste plus alors qu'à définir un nouvel onglet en ajoutant ces ligne dans ce fichier:

<?php /* #?ini charset="iso-8859-1"?
##### Ajouter un nouvel onglet #####
 
# Le nom qui suit [Topmenu_ sera également renseigné dans la section [TopAdminMenu]
# Le nom est totalement libre. Ici j'ai choisi stats.
[Topmenu_stats]
# Pour  NavigationPartIdentifier il faut garder cette structure: ez........navigationpart
# Ensuite il faut ajouter ce nom comme clef du tableau Part[] de la section [NavigationPart]
NavigationPartIdentifier=ezstatsnavigationpart
# Le nom qui fait office de lien et qui s'affichera sur l'onglet:
Name=eZ stats
# La bulle d'info qui s'affichera lors du survol du lien dans l'onglet:
Tooltip=Afficher les statistiques de popularité
# On va définir l'URI vers lequel doit pointer le lien dans l'onglet.
# La racine de l'URI est implicitement http://www.monsite.com/index.php/siteaccess_admin/
# Il est possible de choisir stats/month ou stats/top100 etc...
URL[]
URL[default]=stats/view
Enabled[]
Enabled[default]=false
Enabled[browse]=false
Enabled[edit]=false
Shown[]
Shown[default]=false
Shown[edit]=false
# Par défaut on affiche l'onglet
Shown[navigation]=true
Shown[browse]=false
 
[TopAdminMenu]
# Ici on reprend le même mot que dans [Topmenu_stats]
# Il est obligatoire de remplir ce tableau pour que le nom de l'onglet s'affiche.
Tabs[]=stats
 
# Cette section ne sert qu'à la traduction éventuelle du nom de l'onglet
[NavigationPart]
Part[ezstatsnavigationpart]=eZ stats
 
*/ ?>

Après avoir rechargé la page de l'interface d'administration, s'affiche ceci:

Fig. 8: Le nouvel onglet eZ stats de l'interface d'administration

Comme vous le voyez sur la capture d'écran ci-dessus, c'est l'onglet Contenus qui est sélectionné alors que c'est sur l'onglet eZ stats que j'ai cliqué. De plus, sous l'onglet Contenus on peut voir le menu Contenus qui appartient au module content et non au module stats.

Le problème vient du fait que, par défaut, le module stats a été défini comme appartenant à:

ezcontentnavigationpart

Il faut donc modifier, dans le fichier de définition du module stats:

extension/stats/modules/stats/module.php

...toutes les occurences du mot ezcontentnavigationpart en ez stats navigationpart. Dès lors, vous verrez ceci:

Le nouvel onglet eZ stats de l'interface d'administration est effectivement sélectionné lorsqu'on clique dessus

Commentaires