IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres composants PHP Discussion :

Navigation intelligente pour chainer des écrans


Sujet :

Autres composants PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut Navigation intelligente pour chainer des écrans
    Bonjour

    Je souhaiterais gérer une "navigation" intelligente dans l'application que je suis en train de développer.

    Je m'explique :
    Certaines pages sont accessibles depuis différentes pages et je souhaiterais que l'utilisateur puisse être intelligemment redirigé vers la page d'où il venait après une action.

    Par exemple :
    L'utilisateur va sur la liste des utilisateurs bloqués, il clique sur un utilisateur pour le modifier, quand il clique sur enregistrer il est redirigé vers la liste des utilisateurs bloqués pour poursuivre.
    Plus tard il va sur la liste des utilisateurs administrateur, il clique sur un utilisateur pour le modifier et cette fois quand il clique sur Enregistrer il est redirigé vers la liste des utilisateurs administrateur
    et ainsi de suite.


    Ici c'est un exemple simple mais je peux avoir des choses plus complexes comme
    liste utilisateur ->cliquer vers page détail utilisateur -> clic vers page modifier adresse (personne) -> valider affiche page détail utilsateur -> retour vers page liste utilisteur

    et
    liste contact ->cliquer vers page détail contact-> clic vers page modifier adresse (personne) -> valider affiche page détail contact-> retour vers page liste contacts

    Où la page Modifier adresse est commune aux deux processus.

    A coté de ça, parfois, la liste est issue du résultat d'un formulaire de recherche et le top serait aussi de pouvoir re-soumettre le formulaire quand on retourne à la liste.


    Voila, j'aimerais donc implémenter un système intelligent pour gérer cette navigation dans toute mon application.

    Voila, si vous avez des idées, ou s'il existe des choses toutes faites

    Merci d'avance

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    j'ai po mal potassé le sujet et en parlant variable, voila ma dernière version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    	$action = array(
    		'new' => array('id'=>'new','name'=>'Nouveau'),
    		'action' => array('id'=>'action' ),
    		'view' => array('id'=>'view','name'=>'Voir'),
    		'cut' => array('id'=>'cut','name'=>'Couper','funct'=>'icons.cut'),
    		'copy' => array('id'=>'copy','name'=>'Copier','funct'=>'icons.copy'),
    		'paste' => array('id'=>'paste','name'=>'Coller','funct'=>'icons.paste'),
    		'rename' => array('id'=>'rename','name'=>'Renommer','funct'=>'pop.rename'),
    		'editproperty' => array('id'=>'editproperty','name'=>'Propriété','funct'=>'pop.editproperty'),
    		'edit' => array('id'=>'edit','name'=>'Editer','funct'=>'pop.edit'),
    		'edittheme' => array('id'=>'edittheme','name'=>'Editer','funct'=>'pop.edittheme'),
    		'edithtml' => array('id'=>'edithtml','name'=>'Editer','funct'=>'pop.edithtml'),
     
    		'editcss' => array('id'=>'editcss','name'=>'Editer','funct'=>'pop.editcss'),
    		'css'  => array('id'=>'css','name'=>'Fichier Css' ,'title'=>'Fichier Css','funct'=>'new_css'  ) ,
    		'new_user' => array('id'=>'new_user','name'=>'Utilisateur' ,'title'=>'Nouvel utilisateur','funct'=>'new_user' ),
    		'import_user' => array('id'=>'import_user','name'=>'Utilisateur' ,'title'=>'Importer un utilisateur','funct'=>'import_user' ),
    		'new_groupeUser' => array('id'=>'groupeUser','name'=>'Groupe' ,'title'=>'Nouveau groupe','funct'=>'new_simple' ),
    		'user_property' => array('id'=>'user_property','name'=>'Role','funct'=>'user_property' ),
    		'user_activity' => array('id'=>'user_activity','name'=>'Activités','funct'=>'user_activity' ),
    		'remove' => array('id'=>'remove','funct'=>'icons.remove' ,'name'=>'Supprimer','confirm'=>true),
    		'new_rub' => array('id'=>'new_rub','name'=>'Rubrique','title'=>'Nouvelle rubrique','funct'=>'pop.new_simple','type'=>'rub'  ) ,		
    		'new_projet' => array('id'=>'new_projet','name'=>'Projet','title'=>'Nouveau projet','funct'=>'pop.new_simple','type'=>'projet'  ) ,
    		'new_path'   => array('id'=>'new_path','name'=>'Répertoire' ,'title'=>'Nouveau Répertoire','funct'=>'pop.new_simple' ,'type'=>'path') , 
    		'new_site'   => array('id'=>'new_site','name'=>'Site' ,'title'=>'Nouveau Site','funct'=>'pop.new_simple','type'=>'site' ),
    		'new_theme'  => array('id'=>'new_theme','name'=>'Template' ,'title'=>'Nouveau Template','funct'=>'pop.new_simple', 'type'=>'theme'  ),
    		'conf'  => array('id'=>'galery','name'=>'Fichier conf.' ,'title'=>'Fichier conf.' ,'funct'=>'pop.new_simple','type'=>'conf' ) ,
    		'new_conf_site'  => array('id'=>'new_conf_site','name'=>'Fichier conf.' ,'title'=>'Fichier conf.' ,'funct'=>'pop.new_simple' , 'type'=>'conf_site' ) ,
    		'editconfsite' => array('id'=>'editconfsite','name'=>'Editer','funct'=>'pop.editconfsite'),
    		'txt'    => array('id'=>'txt','name'=>'Document texte' ,'title'=>'Nouveau doc .txt','funct'=>'new_simple' ),
    		'html'   => array('id'=>'html','name'=>'Document html' ,'title'=>'Nouveau doc .html','funct'=>'pop.new_simple' , 'type'=>'html' ),
    		'css'   => array('id'=>'css','name'=>'Document html' ,'title'=>'Nouveau doc .html','funct'=>'pop.new_simple', 'type'=>'css' ),
    		'csv'    => array('id'=>'csv','name'=>'Document csv' ,'title'=>'Nouveau doc .csv','funct'=>'new_simple' ),
    		'img'    => array('id'=>'img','name'=>'Document image' ,'title'=>'Nouveau doc .img','funct'=>'new_simple' ),
     
    		'agenda'  => array('id'=>'agenda','name'=>'Agenda' ,'title'=>'Nouvel agenda','funct'=>'new_simple' ),
    		'planning'  => array('id'=>'planning','name'=>'Planning projet' ,'title'=>'Nouveau planning','funct'=>'new_simple' ),
    		'upload_file'  => array('id'=>'upload_file','name'=>'Importer' ,'title'=>'Importer'  ),
    		'upload_bureau'  => array('id'=>'upload_bureau','name'=>'Du bureau' ,'title'=>'Du bureau','funct'=>'pop.upload_bureau'   ),
    		'upload_ftp'  => array('id'=>'upload_ftp','name'=>'En FTP' ,'title'=>'En FTP'  ),
    		'galery'  => array('id'=>'galery','name'=>'Galerie' ,'title'=>'Galerie'  ),
    		'css'  => array('id'=>'css','name'=>'Fichier Css' ,'title'=>'Fichier Css','funct'=>'pop.new_simple'  , 'type'=>'css' ) ,
    		'new_plugin'  => array('id'=>'plugin','name'=>'Menu' ,'title'=>'Menu' ,'funct'=>'pop.new_simple' , 'type'=>'plugin' ) ,
     
     
    	);
    	$config  = array(
     
     			"projet"=>array(
    						'contextmenu'=>array( 'copy', 'cut',  'remove','rename','editproperty' ),
    						'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
    								'paste'=>'action',	
    								'planning' => array('view' ,'new'),	
     								'new' => array( 'new_projet','new_rub','new_conf_site','new_path','new_site','new_groupeUser','import_user' )
    	 							) 
    			),
    			"groupeUser"=>array(
     
    						'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
     								'new' => array('new_user' )
    	 							) 
    			),
      			"site"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'remove','rename','editproperty'),
    						'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
    								'paste'=>'action',	
     								'new' => array( 'new_plugin','new_path','new_conf_site','new_theme' ,'css'  ) 
    	 							) 
    			),
      			"rub"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'remove','rename','editproperty'),
    						'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
    								'paste'=>'action',	
     								'new' => array( 'new_path','new_rub'   ) 
    	 							) 
    			),
    			"path"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'remove','rename','editproperty'),
    						'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
    								'paste'=>'action',	
     								'new' => array( 'new_path','txt','html','img','csv'  ),
    								'upload_file' => array( 'upload_bureau' ,'upload_ftp'  ) 
    	 							) 
    			),
      			"theme"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'paste','remove','rename','edittheme','editproperty'),
    						 'dbclick'=>'explorer.opendir', 
    						'explorer'=>array(
     								'new' => array(  'new_plugin','html' )
    	 							) 
    			),
      			"css"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'paste','remove','rename','editcss','editproperty')//,
    						//'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			)
    			,
      			"Visiteur"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'remove','user_property','agenda')
    						// ,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"Admin"=>array(
    						'contextmenu'=>array( 'copy', 'cut', 'remove','user_property','user_activity')
    						/// ,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"html"=>array(
    						'contextmenu'=>array( 'copy', 'cut',  'remove','rename','edithtml' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"jpg"=>array(
    						'contextmenu'=>array( 'copy', 'cut',  'remove','rename','editproperty' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"gif"=>array(
    						'contextmenu'=>array( 'copy', 'cut',  'remove','rename','editproperty' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"pdf"=>array(
    						'contextmenu'=>array( 'copy',  'cut', 'remove','rename','editproperty' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
    			"plugin"=>array(
    						'contextmenu'=>array( 'copy',  'cut', 'remove','rename','edit','editproperty' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
     
     
     
      			"undefined"=>array(
    						'contextmenu'=>array( 'remove' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"conf"=>array(
    						'contextmenu'=>array( 'remove' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			),
      			"conf_site"=>array(
    						'contextmenu'=>array( 'remove','editconfsite' )
    						//,'dbclick'=>'explorer.opendir', 
    						//'explorer'=>array(
     						//		'new' => array(  'html' )
    	 					//		) 
    			)
    			);

    regarde un peu, les clés du 2em tableaux, confronté aux valeurs du 1er, peu être ....
    Conception / Dev

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Bonjour ascito,

    Est ce que tu peux expliciter un peu plus, je ne vois pas exactement comme tu l'utilises.


    Question :

    Comment est ce que je peux "stocker" une requete pour ensuite rediriger cers cette meme requete ?
    Quel objet dois-je stocker ?
    Comment l'utiliser pour faire ma redirection (surtout dans le cas du post)

    ex je suis dans l'action cherche du controler utilisateur, je voudrais stocker (en session par ex) la requete (post dans ce cas) avec les parametres reçus.
    E tensuite être capable de faire un redirect vers cette requete post.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Bon finalement, j'ai implémenté un petit truc assez simple.

    Si ca peut intéresser quelqu'un ou suciter des commentaires.


    Un controller "Retour" qui est appellé par les bouton "Retour" que je mets dans les différentes pages.

    Ce contrôler est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php 
     
     
    class RetourController extends My_Controller_Action
    {
     
     
    	public function indexAction()
    	{
    		try {
    			Application_Model_Retour::forward($this->_redirector);			
    		} catch (Exception $e) {
    			Zend_Registry::get("logger")->debug(get_class($this)." : ".$e->getMessage());
    			$this->_flashMessenger->addError('erreur.erreur');
    			$this->_redirect('/');
    		}
     
    	}
    }
    En fait il se contente de passer son helper de redirection au gestionnaire des retours.

    La class "Retour" gère de mettre dans la pile les points de retour et gère la redirection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?php
     
    class Application_Model_Retour {
     
    	public static function init () {
     
    	}
     
    	const NAMESPACE_CHEMIN = "retour";
     
     
    	public static function enregistrer ( $niveau , $controller, $action, $params ) {
     
     
     
    		// je récupère le retour en mémoire
    		$retour =self::getRetour();
     
    		// si je suis plus haut que le niveau actueln j'efface tous les niveaux inférieurs
    		$niveau_actuel = count($retour)+1;
    		if ($niveau_actuel>$niveau) {
    			for ($i=$niveau;$i<=$niveau_actuel;++$i) {
    				unset($retour[$i]);
    			}
    		}
    		$params["redirect"]=$controller;
    		// j'enregistre le nouveau niveau actuel
    		$retour[$niveau]=array('controller' => $controller , 'action' => $action , 'niv' => $niveau, 'params'=>$params);
     
    		// je mets en session
    		self::saveRetour($retour);
    	}
     
    	// mémorisation du retour
    	private static function saveRetour ($retour) {
    		// je le remets en session
    		$retourNS= new Zend_Session_Namespace( self::NAMESPACE_CHEMIN );
    		$retourNS->retour = $retour;
    	}
     
    	// récupération du retour en session
    	public static function getRetour () {
     
    		$retourNS= new Zend_Session_Namespace(self::NAMESPACE_CHEMIN);
    		if (isset($retourNS->retour)) {
    			$retour=$retourNS->retour;
    		} else {
    			// s'il n'existe pas je l'initialise et je le mets en session
    			$retour = array();
    			// je le remets en session
    			$retourNS->retour = $retour;
    		}
    		return $retour;
    	}
     
     
    	public static function output() {
    		$retour =self::getRetour();
    		Zend_Registry::get("logger")->debug(get_class()." - ".My_Utils_VarToString::output($retour));
     
    	}
     
     
    	public static function forward($redirector) {
     
     
    		$retour =self::getRetour();
    		$niveau = count($retour);
    		if ($niveau>0) {
    			$to = $retour[$niveau-1];
     
    			return $redirector->gotoSimple($to['action'],
    								$to['controller'],
    								null,
    								$to['params']);
    		}
    	}
     
     
    }

    Ensuite dans les actions des différents controller, j'enregistre si besoin un point de retour avec les parametres. je ne le fait que pour les actions qui ont besoin d'être un point de retour (ex les listes qui donnent accès à l'édition/consultation d'éléments).
    Je peux soit déclarer un point de retour de haut niveau 0 (vide la pile des retour) ou d'un niveau plus bas si je veux un retour intermédiaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application_Model_Retour::enregistrer(0,$this->_controller,$this->_action, array("type"=>$type));
    Pour les controller qui gèrent un formulaire, j'ai choisi de mettre chaque fois les paramêtres du formulaire (après validation) en session et de les récupérer si je suis en get et que je viens d'une redirection. (ca evite d'avoir une URL de 15km de long avec tous les params du formulaire, voir évite d'afficher en clair des params de formulaire qui étaient cachés, et je ne stocke que les parametres valides, je n'ai donc pas besoin de refaire des contrôles.

    exemple d'action de controller qui gère un post (il devient mixte : en post il prends les valeurs du formulaire, en get il va chercher les parametres en mémoire).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public function indexAction()
    	{
    		try {
    			$this->view->title = "Recherche des contacts";
     
    			$request = $this->getRequest();
     
    			$form    = new Application_Form_ContactCherche();
     
    			if ($this->getRequest()->isPost()) {
    				if ($form->isValid($request->getPost())) {
    					$contact = new Application_Model_ContactVue($form->getValues());
    				}
    			} else {
    				//si on vient d'un retour on récupère les parametres en mémoire
    				$from = $request->getParam("redirect");
    				if ($from===$this->_controller) {
    					$memoire= new Zend_Session_Namespace( "contact" );
    					if (isset($memoire->recherche)) {
    						$contact = new Application_Model_ContactVue($memoire->recherche);
    						$form->populate($memoire->recherche);
    					}
    				}
    			}
    			if (isset($contact)) {
     
    				$mapper  = new Application_Model_ContactVueMapper();
     
     
    				$this->view->entries = $mapper->fetchCritere($contact->getNom(),$contact->getPrenom(),$contact->getType(),$contact->getEtat(),$contact->getCp(),$contact->getVille(),$contact->getPays());
    				$this->view->libellecritere = $mapper->libelleCritere($contact->getNom(),$contact->getPrenom(),$contact->getType(),$contact->getEtat(),$contact->getCp(),$contact->getVille(),$contact->getPays());
     
    				Application_Model_Retour::enregistrer(0,$this->_controller,$this->_action, array());
    				$memoire= new Zend_Session_Namespace( "contact" );
    				$memoire->recherche = $contact->toArray();
     
    			}
    			$this->view->form = $form;
     
    		} catch (Exception $e) {
    			Zend_Registry::get("logger")->debug(get_class($this)." : ".$e->getMessage());
    			$this->_flashMessenger->addError('erreur.erreur');
    			$this->_redirect('/');
    		}
     
    	}

    Voilà, ca marche bien.
    Vos commentaires sont les bienvenus

Discussions similaires

  1. outil pour faire des captures d'écran ?
    Par _vince_ dans le forum Général Python
    Réponses: 5
    Dernier message: 24/04/2012, 21h19
  2. Réponses: 3
    Dernier message: 20/08/2009, 14h49
  3. Apple repropose des écrans anti-reflets pour ses MacBook Pro 15"
    Par Marcos Ickx dans le forum Actualités
    Réponses: 0
    Dernier message: 11/08/2009, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo