2010-11-26 3 views
7

Je suis relativement nouveau à Codeigniter et je m'interroge sur les meilleures pratiques de Codeigniter. Quand dois-je utiliser redirect() par rapport à l'aide

$this->load->view 

Il semble que lorsque j'utilise redirect() alors $this->session->set_flashdata fonctionne comme il se doit, mais quand je l'utilise

$this->load->view 

le message est affiché après une demande supplémentaire.

+1

Bien sûr 'flashdata' ne fonctionne pas sur le courant' $ this-> load-> vue(); ', car il définit une valeur de session visible uniquement sur la prochaine page chargée par le navigateur (pas la valeur actuelle). Si vous voulez passer des données à 'view()', passez-le simplement à l'appel 'view ($ page, $ data)' en tant que second paramètre. –

+0

Je ne suis pas sûr de ce que vous essayez de faire. Vous avez probablement besoin de passer un peu plus de temps à lire les documents de CI .. ressemble à votre mélange de choses un peu .... – Ben

+0

http://stackoverflow.com/a/32866456/412591 –

Répondre

6

Je pense que vous avez vraiment répondu à votre propre question. Utilisez redirect() lorsqu'un message flash simple en haut d'une autre page est une réponse appropriée, utilisez $ this-> load-> view() lorsque vous fournissez une page entière de retour d'informations pour tout ce qui arrive. demande peut être. Par exemple, lorsqu'un nouvel utilisateur s'inscrit, la page "Réussite" est une vue chargée et peut-être lorsqu'un utilisateur modifie quelque chose dans son compte, un message flash "Modifications enregistrées" ou similaire sur la même page est suffisant .

+0

je suis aux prises avec ça, ils semblent juste redondants bien que '$ this-> load-> view()' semble manquer de fonctionnalités telles que l'utilisation des messages flash. vous pourriez sûrement vous en sortir en utilisant toujours 'redirect()'? – wired00

4

Redirect est également utile pour deux autres problèmes communs:

  • Lorsqu'une ressource en vous app est déplacé (et vous voulez que les clients se souviennent de la nouvelle URI)
  • Après avoir affiché une forme comme une étape prévenir le bouton de retour rePOSTs
1

c'est assez simple. quelle URL voulez-vous que l'utilisateur soit allumé? si elles sont sur url1 et publiez des données sur url1 et que vous venez de charger une vue différente, elles seront toujours sur url1. Si vous redirigez vers url2, ils iront à url2.

4

Votre observation est correcte que chaque fois que vous créez il est seulement disponible l'heure. C'est parce que est juste un type spécial de session qui sera disponible pour votre prochaine demande et après la prochaine demande, il sera automatiquement supprimé. Vous n'avez pas à prendre soin de sa suppression.

Cela peut être testé avec le code:

$this->session->set_flashdata('test', 'testing'); 
echo $this->session->flashdata('test'); 

Rien ne sera imprimé. Mais maintenant, la prochaine fois exécuter le code suivant:

echo $this->session->flashdata('test'); 

Vous trouverez la sortie requise. Le faire une fois de plus ne donnera aucune sortie. C'est comme ça qu'ils travaillent. Pour plus de détails consulter la section Flashdata dans http://codeigniter.com/user_guide/libraries/sessions.html

Pour la page en cours, vous n'avez pas besoin flashdata juste passer les données à la vue. Voici le code:

$data['test'] = 'testing'; 
$this->load->view('sample_view', $data); 

Bottom line est que l'utilisation flashdata avec redirect() et pour les vues, vous devriez passer des variables. J'espère que cela t'aides!

1

Vous devez utiliser PRG - Post/Redirect/Get pattern. La redirection et la vue de chargement ne sont pas identiques si vous avez le formulaire dans le contenu de la page.

Scenario: 

Il existe une vue, view_1 avec le formulaire, pour débiter de l'argent d'un compte. Après la soumission du formulaire dans view_1, vous voulez passer à view_2 avec un message de réussite et vous avez 2 options pour atteindre le même résultat. 1. charger view_2 avec le message de réussite ou 2. rediriger vers view_2 avec le message de réussite du transfert de données flash.

Option 1: charge view_2 avec un message de réussite Lorsque vous soumettez le formulaire et l'actualisation, il causera resoumission et causer débit multiple du compte, ce qui ne devrait pas être le cas. Vous aussi, vous pouvez voir l'alerte «Confirmation de la nouvelle soumission du formulaire».

Option 2: Ceci est la bonne réponse PRG

PRG - Post/Redirect/Get PRG est un modèle de conception de développement web qui empêche certaines soumissions de formulaire en double qui signifie, Envoyer un formulaire (VIEW_1) - > Redirect -> Get (view_2)

Under the hood 

Redirect code d'état - HTTP 1.0 avec HTTP 302 ou HTTP 1.1 avec HTTP 303

Une réponse HTTP avec un code d'état de redirection fournira en plus une URL dans le champ d'en-tête de localisation. L'agent utilisateur (par exemple un navigateur Web) est invité par une réponse avec ce code à faire une seconde requête, sinon identique, à la nouvelle URL spécifiée dans le champ de localisation.

Le code d'état de redirection doit garantir que dans cette situation, le navigateur de l'internaute peut actualiser la réponse du serveur en toute sécurité sans que la requête HTTP POST initiale soit soumise à nouveau.

Source

Double Submit Problem 

Double Submit Problem

Post/Redirect/Get Solution 

Post/Redirect/Get Solution