2011-04-30 2 views
3

Il existe plusieurs pages. Il y a des liens sur ces pages. Ces liens mènent à une page avec un formulaire. Lorsque le formulaire est soumis, la page qui contient le formulaire se régénère pour traiter les données soumises.Redirection vers le référent lors de la soumission du formulaire

Voici la question. Lorsque la page avec le formulaire reçoit les données soumises et les traite, il doit ramener l'utilisateur à la page qui l'a amené à la page de formulaire. Comment iriez-vous faire cela en utilisant PHP?

Répondre

3

Ce que je veux faire est d'ajouter à un tableau variable de session à chaque fois qu'une page est consultée appelée « histoire », et seulement ajouter au tableau si le dernier élément $_SESSION['history'] n'est pas l'URL actuelle (éviter les entrées récentes multiples pour l'actualisation de page, l'échec de validation de forme, etc.). Fondamentalement, un fil d'Ariane de l'endroit où l'utilisateur a été. Lorsque vous traitez le formulaire, renvoyez l'utilisateur à la valeur du tableau la plus récente, en excluant l'URL du formulaire en cours, s'il vous plaît. Assurez-vous de définir une valeur par défaut s'il n'y a pas d'historique.

$_SERVER['HTTP_REFERER'] peut parfois fonctionner, mais Ive a eu des problèmes majeurs avec elle, et il ne fonctionne pas dans beaucoup de cas (rafraîchissement, venant de même page, en tapant l'URL de forme, provenant d'un lien e-mail, etc.) Je l'évite strictement car cela peut conduire à un comportement erratique et rediriger les boucles si vous n'y prenez pas garde. En fait, je ne l'utiliserais jamais pour la redirection.

+0

C'est une approche très intéressante. Il semble que cela pourrait être utilisé pour résoudre divers problèmes. Merci! –

+0

J'ai fait l'hypothèse ici que vous pourriez comprendre le code si vous aviez le concept, ai-je probablement raison? Je peux partager du code si nécessaire mais je peux être lent. Je devrais l'inverser en php vanille. –

+0

Bien sûr, je comprends. Merci encore! –

1

Ce concept est connu comme Post-Redirect-Get. La question est la suivante: l'utilisateur revient-il toujours à la même page d'origine statique, ou y a-t-il beaucoup de pages qui peuvent conduire l'utilisateur à ce formulaire? Si ce dernier est vrai, ajoutez simplement le référent ($_SERVER['HTTP_REFERER']) en tant qu'élément de formulaire pour enregistrer d'où ils viennent. code php:

<?php 
    class controller { 
     //for chaining 
     public static function _() { return new self; } 
     public function GET() { 
      //dispay form 
     } 
     public function POST() { 
      //process form 
      //add errors to session 
      if (!empty($_SESSION['form errors']) { 
       $this->redirect($_SERVER['PHP_SELF']); 
      } 
      else { 
       $this->redirect("original-user-location", true, 303); 
      } 
     } 
     private function redirect($loc) { 
      header("Location: $loc", true, 303); 
      exit; 
     } 
     //ignore PUT, DELETE 
     public function __call($_, $_) {} 
    } 
    controller::_()->$_SERVER['REQUEST_METHOD'](); 
    ?> 
+0

C'est magnifique! J'ai utilisé des cookies pour faire la même chose et c'est tellement plus élégant. Merci! –

+0

Cela ne fonctionnerait pas, cependant, si les données de formulaire ne valident pas la première fois et la page de formulaire est actualisée une deuxième fois, n'est-ce pas? –

+0

Vous gardez simplement la trace des données de formulaire de l'utilisateur dans la session. Dans GET remplir leurs entrées à partir de cela. L'utilisateur peut actualiser autant qu'il le souhaite maintenant, il n'effacera pas les données de session. Vous pouvez le faire plus tard. –

Questions connexes