2010-06-03 8 views
0

Je suis un peu nouveau avec CodeIgniter et j'apprends toujours (beaucoup). J'ai donc une vue et lorsque je soumets un formulaire, j'appelle le contrôleur en surfant sur l'URL de droite dynamiquement, par exemple. site/deleteProblème de redirection CI

class Site extends Controller { 

    function index(){$this->load->view('...')} 

    function delete() { 
     $this->site_model->delete_row(); 
     $this->index(); 
    } 

    } 

Maintenant que cette action est terminée (supprimé la ligne) J'appelle $ this-> index(); pour rediriger vers ma page initiale (ce qui est bien) mais mon URL reste: site/supprimer. Je veux que mon URL soit ../site/index (ou sans/index)

Toute aide serait appréciée :-).

Répondre

2

Jusqu'à présent, je trouve quelque chose pour résoudre ceci:

au lieu de:

$this->index(); 

J'utilise:

redirect('site'); 

Est-ce que quelqu'un sait c'est une bonne pratique?

+1

La redirection est correcte pour moi, mais le serveur envoie des en-têtes de réponse supplémentaires, ce qui nécessite un peu plus de temps système. – caseyamcl

+0

"headers de réponse supplémentaires" n'est pas tout à fait vrai, il déclenche une toute nouvelle requête (et réponse). Mais oui, il y a un léger surcoût supplémentaire. C'est toujours la bonne solution. Souvent, dans des cas comme celui-ci, vous allez coller quelque chose dans les données flash de CI que la méthode d'index lit et transmet à l'utilisateur (ainsi vous pouvez leur dire que l'action s'est terminée avec succès). – Sid

1

La redirection est ce que vous devez utiliser.

Dans le guide de l'utilisateur. http://codeigniter.com/user_guide/helpers/url_helper.html

ils l'utilisent après avoir vérifié si un utilisateur est connecté En fonction si elles sont ou non, ils redirigent à un endroit différent.

Notez également que tout code après la redirection ne s'exécutera pas. Assurez-vous et rediriger après avoir fait tout ce que vous devez faire.

0

Ma méthode préférée est d'avoir des actions comme celles-ci traitées par la même méthode qui sera vue par l'utilisateur par la suite.

Et si vous allez dans/site/delete après, en tant qu'utilisateur? Il devra soit détecter et lancer une erreur (afficher un message) soit rediriger vers une page appropriée./site/delete n'a pas de signification. Par exemple, si un utilisateur verrait normalement une vue d'ensemble après la suppression, mon formulaire sera posté dans/site/index; avec index rapidement en vérifiant la condition et en appelant _delete() dans le même contrôleur, avant de faire son travail normal. De cette façon, si l'utilisateur actualise la page ou appuie sur «Retour», les choses devraient leur sembler cohérentes.

Un autre exemple serait que/settings/edit se posterait sur lui-même - cela signifie qu'il peut agir sur la publication et afficher toute sortie (par exemple des erreurs de validation). Cela signifie qu'il n'y a pas /settings/do_edit emplacement sur mon site, et signifie également que l'utilisateur peut revenir à /settings/edit en toute sécurité, et voir un formulaire pour modifier leurs paramètres. Je suppose qu'il s'agit d'une question subjective sur une question peut-être objective, et j'encouragerais la rétroaction sur mon point de vue, mais c'est ma façon d'éviter le problème que vous avez posé.

+0

Le problème potentiel que vous pouvez rencontrer ici est si le ré-affichage (par rafraîchissement) fera quelque chose de indésirable (par exemple ajouter un autre produit au panier). Soit utiliser des redirections dans des occasions comme celle-ci ou post, et gérer, nonces (qui protégerait également contre les attaques CSRF). – Sid

+0

Salut Sid. Merci pour votre commentaire. Je suppose qu'un nonce est un jeton d'utilisation unique que je définis lorsque je crée le formulaire? Puis le jeter une fois utilisé ou après une limite de temps expire? Cela pourrait conduire à une toute nouvelle question sur SA pour moi! – Kurucu

0
$this->index(); 

L'appel de fonction dans une fonction exécute simplement la fonctionnalité dans cette fonction. Et url n'a jamais changé.

pour changer l'URL que vous devriez utiliser. Mais vous devez charger l'assistant d'URL dans le constructeur.