2010-11-20 26 views
4

Mise à jour: j'ai écrit de fausses déclarations sur l'utilisation de l'en-tête dans php; donc oubliez cette partie :)Redirection interne Cakephp du contrôleur vers un autre contrôleur

Ce que je veux, c'est extraire et afficher la vue d'un contrôleur (avec les données du contrôleur) d'un autre contrôleur, sans avoir de changement d'URL dans le navigateur.

Quelques détails:

  1. Redirect ne fait pas le travail parce que est une redirection directe (via un navigateur)
  2. requestAction ne me permet de ne pas charger et images correctement css

J'ai besoin de cette chose parce que j'ai un répartiteur de contrôleur qui redirige en interne vers les autres contrôleurs.

Je pense que la seule solution (correcte) est d'utiliser routes.php dans/config avec Router :: connect et d'utiliser la logique qui était dans le contrôleur de dispatcher.

+1

La "réécriture interne" est généralement effectuée avec Routes. Qu'y a-t-il de si spécial dans votre "répartiteur contrôleur" que vous ne pouvez pas faire la même chose en utilisant des routes? – deceze

+0

comme vous l'avez dit, la solution est de faire l'interaction entre la base de données et les routes ... mais je ne sais pas si c'est possible – apelliciari

+0

Vous voulez que les données d'un modèle soient affichées dans une action de contrôleur dans un autre modèle? – Nigel

Répondre

12

ummm ... header() est la fonction à utiliser pour une redirection sauf si la documentation PHP est erronée. (http://php.net/manual/en/function.header.php) Le coeur de cakePHP utilise l'en-tête de la fonction de redirection (voir les lignes 721 - 730 de cake/libs/controller.php).

Donc, je ne suis pas certain de ce que vous voulez dire "comme PHP normal". CakePHP est PHP, il est simplement construit sur du code orienté objet. Ce n'est pas une façon magique ou tordue de faire les choses. Donc, pour faire une redirection dans le gâteau, vous pouvez simplement utiliser:

$this->redirect(array('controller' => 'my_controller', 'action' => 'my_action')); 

Et il appellera la fonction header().

Maintenant. Si vous ne voulez pas utiliser la redirection (peut-être si vous allez sur un site externe), vous pouvez appeler header() dans le code. Assurez-vous juste de mettre la sortie(); après l'appel d'en-tête:

header('Location: http://call/my/url'); 
exit(); 

Cela fonctionnera exactement de la même manière que la redirection. C'est juste beaucoup de travail supplémentaire inutile. Gardez à l'esprit que l'utilisation de la redirection permettra de conserver le nom de domaine et de créer automatiquement l'URL pour vous.

+0

oui vous avez raison je confondais l'utilisation de l'en-tête. Je suis en train de retravailler la question dès que possible. J'ai besoin de redirection d'URL comme htaccess (et sa transparence) – apelliciari

+0

Pour info, vous pouvez utiliser l'en-tête pour accéder aux chemins relatifs. – apelliciari

2

En général, la connexion d'URL aux contrôleurs est le travail des routes. Si votre logique est plutôt complexe et que les routes normales ne la coupent pas, vous pouvez même écrire votre propre classe d'analyseur d'itinéraire qui fait une logique plus complexe (c'est tout dans le manuel). Si cette logique de routage implique des requêtes de base de données ou tout autre type de logique de contrôleur et peut conduire à une sortie très différente pour la même URL en fonction d'un état interne, vous créez une application très complète et je vous soumettrais devrait repenser ce que vous essayez de faire. Cela dit, vous pouvez afficher n'importe quelle vue depuis n'importe quelle action du contrôleur en utilisant $this->render(). La logique du contrôleur pour chaque vue pourrait être placée dans l'AppController ou éventuellement (en partie) les modèles à appeler de n'importe où. Ainsi, au lieu de "rediriger" vers un contrôleur différent, une route achemine simplement vers une action de contrôleur spécifique, comme d'habitude, cette action appelle dynamiquement le code qu'elle doit appeler, puis restitue la vue dont elle a besoin pour le rendu.

Si vous souhaitez que votre application reste sur la même URL mais affiche un contenu très différent, vous devriez probablement envisager de créer une application AJAX.

La bonne solution pour vous est probablement quelque part entre les deux.