CakePHP-Fr.Org

Forum francophone du Framework CakePHP

Vous n'êtes pas identifié.

#1 19-02-2015 11:10:32

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Compteur visiteurs (component)

Bonjour,
J'essai de mettre en place un compteur de visites. Grâce à quelques infos trouvées ci et là.

Je réalise un component

Code: php

  1. class CounterComponent  extends Component {
  2.     public function Counter() {
  3. // mes logiques d'enregistrement sur BDD
  4. // je comptes le nbre d'IP enregistrée dans ma BDD et renvoi le résultat dans $nombre
  5.  
  6. }

Je souhaite utiliser ce component dans toutes les page front de mon site ( pas l'Admin) je le déclare donc dans chaque controller interressés :

Code: php

  1. class AdminsController extends AppController{
  2.     var $components = array('Counter');
  3. ....
  4. }

Ma question est comment puis récupérer ma variables $nombre, dans la vue index.ctp du côté Admin ?

merci de votre aide

Hors ligne

 

#2 19-02-2015 11:59:39

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: Compteur visiteurs (component)

Salut,
en utilisant un getter basique

Code: php

  1. $nombre = $this->Counter->nombre();

et dans ton component :

Code: php

  1. public function nombre() {
  2.   return $this->nombre;
  3. }

Tiens nous au courant.
a++


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#3 19-02-2015 12:06:06

6120
The Big Cake
Date d'inscription: 06-11-2009
Messages: 381

Re: Compteur visiteurs (component)

Tu dois aussi utiliser le "component" dans l'admin mais tu ne comptabilises pas les connexions admin.

Par exemple, tu peux faire :

Code: php

  1. function beforeRender() {
  2.     if(isset($this->request->params['prefix']) && $this->request->params['prefix'] === 'admin') {
  3.       // tu ne comptabilises pas
  4.     }
  5.   }

Comme ça, tous les paramètres sont accessibles dans l'admin.

Dernière modification par 6120 (19-02-2015 14:52:19)

Hors ligne

 

#4 19-02-2015 17:37:20

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Merci pour vos réponses.
Dans le "Getter basique", à quoi correspond

Code: php

  1. nombre();

Du coup j'ai essayé sans résultat

Code: php

  1. class CounterComponent  extends Component {
  2.  
  3.     public function Counter() {
  4.  
  5.   $nbr = $this->Connexion->find('count',array('conditions'=>array('Connexion.ip'=>$_SERVER['REMOTE_ADDR'])));
  6.  
  7.     if($nbr == 0)
  8.     {
  9.       $this->Connexion->data['Connexion']['ip'] = $_SERVER['REMOTE_ADDR'];
  10.       $this->Connexion->data['Connexion']['timestamp'] = time();
  11.       $this->Connexion->save($this->data);
  12.     }
  13.     else
  14.     {
  15.       $this->Connexion->query('UPDATE connexions SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
  16.     }
  17.  
  18.   $timestamp_5min = time() - (60*2);
  19.   $this->Connexion->query('DELETE FROM connexions WHERE timestamp < ' . $timestamp_5min);
  20.  
  21.   $visits = $this->Connexion->find('count',array('fields'=>'Connexion.ip'));
  22.  
  23.   return $visits;
  24.   return $this->visit;
  25.  
  26. }
  27.  
  28. }

Du coup je comprend pas cette fonction :

Code: php

  1. public function nombre() {
  2.   return $this->nombre;
  3. }

Hors ligne

 

#5 20-02-2015 11:24:45

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Bon j'ai avancé et j'arrive a afficher des message "test", mais lorsque je cherche à afficher la $visits de la function counter()

Code: php

  1. $test = $this->Counter->counter();
  2. $this->set('test',$this->Counter->counter());

J'ai un bon vieux

Code: php

  1. Call to a member function find() on a non-object

Donc j'imagine qu 'il y a quelque chose à régler...certainement lié au Model mais je bloques
Encore merci

Dernière modification par digaburla (20-02-2015 12:10:19)

Hors ligne

 

#6 20-02-2015 12:43:00

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: Compteur visiteurs (component)

Salut,
- la variable "nombre" était au cas où tu avais déclaré cette variable dans ton component, après lecture de ton code il s'avère que ce n'est pas le cas, ce serait plutôt la variable "visit" qui est concernée, et encore elle est locale à la fonction, personnellement je ferais une variable de classe consultable de l'extérieur par un getter
- dans un component, si tu veux accéder à un model, tu peux utiliser ce bout de code comme exemple :

Code: php

  1. $connexion = ClassRegistry::init('Connexion');
  2. $result= $connexion->find('all');

- Les query dans ton component ne sont pas claires, pourquoi diable utiliser Connexion->query ? quand tu peux utiliser les ->find() de CakePHP ?
- pour ce bout de code cité qui te renvoie une erreur :

Code: php

  1. $test = $this->Counter->counter();
  2. $this->set('test',$this->Counter->counter());

t'es-tu assuré que ton component déclare bien le model 'Connexion' (dixit le bout de code juste au-dessus) ?

A bientôt tiens nous au courant


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#7 20-02-2015 16:50:52

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Merci une nouvelle fois pour ces explications fluides.

Voici une modification du code en suivant tes conseils :
J'ai donc modifier les requêtes (que diable hmm ). malheureusement, je n'ai pas réussi à modifier celle du Delete car il me semble qu'il fait un appel à un 'id' et dans ma table connexion je n'ai pas d'id, juste ip et timestamp

Code: php

  1. public function Counter() {
  2.     $connexion = ClassRegistry::init('Connexion');
  3.     $nbr = $connexion->find('count',array('conditions'=>array('Connexion.ip'=>$_SERVER['REMOTE_ADDR'])));
  4.  
  5.       if($nbr == 0)
  6.       {
  7.         $connexion->data['Connexion']['ip'] = $_SERVER['REMOTE_ADDR'];
  8.         $connexion->data['Connexion']['timestamp'] = time();
  9.         $connexion->save($this->data);
  10.       }
  11.       else
  12.       {
  13.         $connexion->updateAll(array('timestamp' => time()), array('Connexion.ip'=>$_SERVER['REMOTE_ADDR']));
  14.       }
  15.  
  16.     $timestamp_2min = time() - (60*2);
  17.    
  18.     // $conditions = array('Connexion.timestamp' =>'Connexion.timestamp'< $timestamp_2min );
  19.     // $connexion->delete($conditions,true);
  20.    
  21.     $connexion->query('DELETE FROM connexions WHERE timestamp < ' . $timestamp_2min);
  22.        
  23.     $visits = $connexion->find('count',array('fields'=>'Connexion.ip'));
  24.    
  25.     return $visits;
  26.  
  27.   }

Par la suite j ai donc déclaré dans mon AppController mon component et la fonction counter dans un beforeFilter :

Code: php

  1. class AppController extends Controller {
  2.  
  3. public $components = array('Counter');
  4.  
  5. function beforeFilter(){
  6.     $visits = $this->Counter->counter();
  7.     $this->set('visits',$visits);
  8.   }
  9. }

Il me reste donc à modifier cette requête DELETE puis prendre en compte la remarque de 6120 le gros gâteau pour ne pas compter les visiteurs logués en admin.

La fonction beforeRender doit - être placée ou ? J'imagine dans le AdminController ?

Mercciiii

Hors ligne

 

#8 23-02-2015 12:17:32

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Salut et re salut....
Ce week end j'ai bûché sur les Cookies...
Pour "améliorer mon système statistiques et surtout pour apprendre (j'aurais effectivement plus vite fais d'utiliser Google Analtytics ).
J'aurais voulu votre avis sur mon système de Stats .
3 statistiques principales :
1 - Utilisateurs actifs
2 - Utilisateurs unique sur une journée (remise à jour à minuit) à l'aide de Cookie
3 - Utilisateurs sur un temps donné ( en incrémentant la variable "Utilisateurs unique" à chaque nouvelle enregistrement)

Du coup je penses même pouvoir utiliser les Cookies pour les utilisateur actifs avec un

Code: php

  1. $this->Cookie->write('ip', $_SERVER['REMOTE_ADDR'], false, 120);

Qu'en pensez vous.
Avant de compléter mon code et de me lancer , j'aurais souhaité vos avis.  Je ferais un retour par la suite bien entendu

Merci

Dernière modification par digaburla (23-02-2015 12:18:42)

Hors ligne

 

#9 23-02-2015 13:33:19

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: Compteur visiteurs (component)

Salut,
tout dépend de ce que tu appelles un utilisateur actif : est-ce un utilisateur connecté sur le site ?
Pour les stats, je suis un peu sec comme un haricot, mais sachant que la majorité des trackers se basent sur un cookie utilisateur, il me semble que tu es sur la bonne voie.
a++


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

#10 23-02-2015 13:49:26

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Salut salut,

Oui un utilisateur actif est un utilisateur qui est en train de parcourir le site !

PS : je connaissais plutôt l'expression "Sec comme un coup de trique" mais le haricot fonctionne également. wink

Dernière modification par digaburla (23-02-2015 13:49:51)

Hors ligne

 

#11 19-03-2015 16:58:55

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Re,

Dans le développement de mon code pour mes stats, j'essai de mettre en place une fonction pour savoir qui est en ligne. J'aurais besoin de vos lumières d'un point de vue technique, mais également logique :

Voici le code :

Code: php

  1. public function whoCounter() {
  2.     // Récupération du nom de l'utilisateur connecté si il est partenaire :
  3.     $user = ClassRegistry::init('User');
  4.     $user = $this->Auth->user('username');
  5.     if ($user != null)
  6.     {
  7.       $userConnect = $this->Auth->user('username');
  8.     }
  9.     else
  10.     {
  11.       $userConnect = 'internaute';
  12.     }
  13.  
  14. $connecte = ClassRegistry::init('Connecte');
  15.  
  16.     $timestamp_2min = time() - (60 * 2);
  17.     $connecte->deleteAll(array('Connecte.timestamp <' => $timestamp_2min));
  18.  
  19. //On compte le nombre de donnée ayant pour IP, l'IP de l'utilisateur connecté et l'id Session actuelle   
  20. $sessionExist = $connecte->find('count',array('conditions'=>array('Connecte.session'=> $this->Session->Id())));
  21.  
  22.    
  23.    
  24.    
  25.       if ($sessionExist == 0) // Si il n'y en a pas, on l'ajoute
  26.       { 
  27.  
  28.       $connecte->data =   array( array( 
  29.                   'ip' => ip2long($_SERVER['REMOTE_ADDR']),
  30.                   'session' => $this->Session->Id(),
  31.                   'name' => $userConnect,
  32.                   'timestamp' => time(),
  33.                   'page' => $page
  34.                   ),
  35.                 );
  36.       $connecte->saveAll($connecte->data);
  37.       }
  38.       else
  39.       {
  40.         $connecte->updateAll(array('Connecte.timestamp'=> time()), array('Connecte.session' => $this->Session->Id()))
  41.       }
  42.     }

Ce petit bout de code permet donc de créer une ligne en BDD avec les infos de l'IP - ID_session - NAME - timestamps - page ou de mettre à jour la BDD le TIMESTAMP si cette ligne existe déjà.

Mon problème est que lorsque je déconnecte ou reconnecte l'Auth, un ID_session se créer, ce qui rajoute une ligne dans la table (qui s'efface au bout de 2 minutes).

Ma question est comment je peux éviter ce double enregistrement ?

ip - id_session - name - timestamps - page

18.75.46 - azeazdazoeoe15 - Moi - 654987321 - contact
18.75.46 - azeazdazoazee!= - Partenaire - 654987654 - page pro

Ce que je penses être une solution est de UPDATE les données si l'IP existe déjà, pour cela, j'encapsule le code prédcédent comme ceci et je fait un update sur la ligne.

Code: php

  1. $ipExist = $connecte->find('count',array('conditions'=>array('Connecte.ip'=> ip2long($_SERVER['REMOTE_ADDR']))));
  2. if ($ipExist == 0)
  3. {
  4.  //TOUT LE CODE PRECEDENT
  5. }
  6. else
  7. {
  8. $connecte->updateAll(array('Connecte.timestamp'=> time()), array('Connecte.ip' => ip2long($_SERVER['REMOTE_ADDR'])))
  9. }

Bilan, lors de mon UPDATE, le timestamp se met bien à jour. J'aimerais mettre à jour l'ensemble des champs tel que session - name - timestamp -page en même temps.

Et par exemple si je note cela (sur le même schéma que précédement :

Code: php

  1. $connecte->updateAll(array('Connecte.name'=> $userConnect), array('Connecte.ip' => ip2long($_SERVER['REMOTE_ADDR'])));
  2. Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Aurélien' in 'field list'

Merci à vous, j'avoue que là 'y vois plus rien.

Dernière modification par digaburla (19-03-2015 17:02:02)

Hors ligne

 

#12 19-03-2015 17:46:39

digaburla
Pièce Montée
Date d'inscription: 03-07-2014
Messages: 179

Re: Compteur visiteurs (component)

Code: php

  1. $connecte->updateAll(
  2.                   array(
  3.                     'Connecte.session' => "'".$this->Session->Id()."'",
  4.                     'Connecte.name' => "'".$userConnect."'",
  5.                     'Connecte.timestamp' => time(),
  6.                     'Connecte.page' => "'".$page."'"
  7.                     ),
  8.                   array('Connecte.ip' => ip2long($_SERVER['REMOTE_ADDR']))
  9.                 );

Pour l'UPDATE je viens de trouver !

J'attends vos coms pour la logique !

Merci

Hors ligne

 

#13 23-03-2015 14:09:46

cyberbobjr
Baker
Date d'inscription: 13-07-2010
Messages: 625

Re: Compteur visiteurs (component)

Salut,
disons que je n'ai pas compris la phrase "Mon problème est que lorsque je déconnecte ou reconnecte l'Auth", c'est à dire que la session de l'utilisateur a expirée ? sinon tu peux caler ton $timestamp_2min sur la durée d'une session cakePHP.
a++


Développeur freelance et disponible, contactez-moi en privé.
Mon blog CakePHP : http://caketuts.key-conseil.fr

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr