developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 13 years ago

Closed 13 years ago

#507 closed new feature (fixed)

plugin history

Reported by: Lipki Owned by: Lipki
Priority: normal Milestone: Jelix 1.1 beta 1
Component: jelix:plugins Version: 1.0.2
Severity: minor Keywords:
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version:

Description

The history plugin uses the sessions to keep in mind the actions associated with their argument.

Very practical to run an event without leaving the page.

Example of use.

$GLOBALS['gJCoord']->getPlugin('history')->back( $this->getResponse('redirect') );

Attachments (4)

history.coord.php (1.0 KB) - added by Lipki 13 years ago.
history.zip (1.3 KB) - added by Lipki 13 years ago.
history.diff (4.0 KB) - added by Lipki 13 years ago.
history.2.diff (5.8 KB) - added by Lipki 13 years ago.

Download all attachments as: .zip

Change History (20)

comment:1 Changed 13 years ago by Lipki

  • Owner set to Lipki
  • Status changed from new to assigned
  • Type changed from bug to new feature

Changed 13 years ago by Lipki

comment:2 Changed 13 years ago by Lipki

+ une méthode time() qui retourne le temps écoulé depuis le début de la session

comment:3 Changed 13 years ago by laurentj

  • review changed from review? to review-
       private $_timeStart;
...
    function time() {
        return microtime(true) - $this->_timeStart;
    }

je ne vois pas trop l'utilité de ce code.

        $_SESSION['ACTIONS'][] = $GLOBALS['gJCoord']->action->toString();
        
        $actionparam = $GLOBALS['gJCoord']->request->params;
        unset( $actionparam['module'] );
        unset( $actionparam['action'] );
        $_SESSION['PARAMS'][] = $actionparam;

Pourquoi ne pas regrouper dans une même variable de session ? (et pourquoi ne pas la nommer HISTORY ou quelque chose comme ça ?)

     $_SESSION['HISTORY'][] = array($GLOBALS['gJCoord']->action->toString(), $actionparam);

D'autres remarques :

  • ne pas enregistrer toutes les actions :
    • celles qui aboutissent à une redirection, car alors on part en boucle infinie si on redirige vers l'action précédente qui serait elle même une redirection
    • celles qui sont appelées avec une requête POST ? je pense, car en général on effectue des enregistrements etc. Faire un back pourrait alors refaire ces enregistrements. De plus, on ne peut rediriger vers une action précedente POST.
  • on pourrait prendre en compte un paramètre de plugin dans les controleurs, qui autoriserait ou non (en plus des critères précédents), le stockage dans l'historique.

comment:4 Changed 13 years ago by Lipki

Pour l'instant, ce n'était qu'un bout de code rapide pour régler mon problème.

Mais tu a raison, je pense qu'il ne faut stocker par défaut, mais seulement a la demande.

Sinon pour la fonction time, qui a un nom bien banale, je m'en sert pour savoir combien de temps les clients prenne pour commander. Il doit y avoir d'autre utilisation.

comment:5 Changed 13 years ago by Lipki

http://jelix.toopi.info/page/history

Effectivement la fonction time() ne servait a rien :)

Changed 13 years ago by Lipki

comment:6 Changed 13 years ago by Lipki

  • review changed from review- to review?

comment:8 Changed 13 years ago by laurentj

  • Milestone set to Jelix 1.1
  • review changed from review? to review-

je pense qu'on pourrait l'améliorer, en particulier:

  • limiter le nombre d'url stockée (une dizaine ?), car au bout d'un moment, ça peut être beaucoup trop lourd à tout stocker en session
  • vérifier qu'il n'y a pas l'url en doublon dans toute la liste, et si oui, le supprimer, avant de mettre l'url à la fin de la liste.

comment:9 Changed 13 years ago by Lipki

limiter le nombre d'url stockée (une dizaine ?), car au bout d'un moment, ça peut être beaucoup trop lourd à tout stocker en session

Un paramètre dans defaultconfig, fera l'affaire ?

vérifier qu'il n'y a pas l'url en doublon dans toute la liste, et si oui, le supprimer, avant de mettre l'url à la fin de la liste.

L'interet de l'historique, c'est de garder l'historique ... Le fil d'ariane ce sert de cet information redondante pour afficher le trajet du visiteur.

Ce que je peut faire, c'est une liste qui contient l'ensemble des pages sans doublon, et un autres qui contient l'historique, et qui fait des "liens" vers la première liste.

Changed 13 years ago by Lipki

comment:10 Changed 13 years ago by Lipki

Un paramètre dans defaultconfig donc.

pour le reste je sait pas si ça vaut vraiment le coup de créer deux listes.

comment:11 Changed 13 years ago by Lipki

  • review changed from review- to review?

comment:12 Changed 13 years ago by laurentj

  • review changed from review? to review-
  • chaque plugin de coordinateur peuvent avoir leur propre fichier de config, donc créer un fichier de conf spécifique history.coord.ini.php.dist dans le repertoire du plugin
  • ce n'est pas maxleng mais maxlength. Peut etre que maxsize est préférable d'ailleurs
  • il manque la declaration des fichiers dans le manifest jelix-lib.mn
  • plein de problème d'indentation (tab au lieu d'espace etc)
+            $_SESSION['HISTORY'][] = $page;
+            
+            $this->double();

Pourquoi mettre la page, et ensuite verifier si elle n'existe pas déjà ? Je pense que faire ceci serait plus efficace et rend inutile cette fonction double()

     if(count($_SESSION['HISTORY'])) {
        if(end($_SESSION['HISTORY']) != $page)
           $_SESSION['HISTORY'][] = $page;
     }else{
           $_SESSION['HISTORY'][] = $page;
     }

Pareil dans change()

    public function change( $key, $val ) {
        $page = array_pop($_SESSION['HISTORY']);
        $page[$key] = $val;
        if(end($_SESSION['HISTORY']) != $page)
           $_SESSION['HISTORY'][] = $page;
    }

À mon avis, il y a un problème là, tu fais un end sur un des elements d'un item de l'historique, plutôt qu'un end sur l'historique (pour avoir le dernier item):

+    public function reload( $rep ) {
+        $rep->action = end($_SESSION['HISTORY']['action']);
+        $rep->params = end($_SESSION['HISTORY']['params']);
+        return $rep;
+    }
+    
+    public function back( $rep ) {
+        array_pop($_SESSION['HISTORY']);
+        $rep->action = end($_SESSION['HISTORY']['action']);
+        $rep->params = end($_SESSION['HISTORY']['params']);
+        return $rep;
+    }

ce serait plutôt

        $last = end($_SESSION['HISTORY']);
        $rep->action = $last['action'];
        $rep->params = $last['params'];

À part ça, vu que l'on a un fichier de config, on pourrait avoir un parametre de conf qui indique le fonctionnement de l'historique :

  • soit on montre rééllement l'historique comme indiqué
  • soit on a check si l'item à ajouter n'est pas dans la liste, et dans ce cas on le met à la fin plutôt que de le dupliquer. Ainsi tu n'as pas 2 listes ;-)

comment:13 Changed 13 years ago by bballizlife

Ce n'est peut-être qu'un détail mais le nom de la variable de session (HISTORY) est ici en dur apparemment. Je pense qu'il serait bien, tout comme c'est le cas dans le plugin auth, que ce nom soit configurable depuis le fichier de conf du plugin.

Changed 13 years ago by Lipki

comment:14 Changed 13 years ago by Lipki

  • review changed from review- to review?

voila voila

les paramêtres

; session variable name
session_name = "HISTORY"

; max size of the history
maxsize = 10

; if single = true if each page will be registered only once in history
; the latter will be retained.
single = false

; If double = false pages will not appear twice a follow time in history.
double = false

; if time = true a variable record time spent on site
time = true
; the name of this variable
session_time_name = "HISTORYTIME"

comment:15 Changed 13 years ago by laurentj

  • review changed from review? to review+

C'est ok.

comment:16 Changed 13 years ago by Lipki

  • Resolution set to fixed
  • Status changed from assigned to closed

commited !

Note: See TracTickets for help on using tickets.