2010-12-13 6 views
1

Est-il possible d'afficher les données que je passe avec $this->set() lorsqu'il y a une redirection vers une autre page après le réglage des données?cakephp passant les données à afficher après la redirection

Merci, EL

+0

Qu'essayez-vous d'accomplir? D'une certaine manière cela n'a pas beaucoup de sens d'afficher des données que l'utilisateur ne verra jamais à cause de la redirection ... – dhofstet

+0

Je veux afficher les données sur la page à laquelle l'utilisateur est redirigé – Elwhis

Répondre

5

Probablement la façon la plus simple est de stocker les données dans la session avec:

$this->Session->write('key', 'value'); 

et de le lire plus tard avec:

$this->Session->read('key'); 
0

Vous redirigent avec header('Location: ...')? Cela fait que le navigateur lance une nouvelle requête. Le script qui a déclenché la redirection peut être le même que celui qui gère la nouvelle requête, mais il y a maintenant deux instances en cours d'exécution (ou la première peut même avoir quitté) et chacune n'a pas accès aux variables de l'autre. Soit vous stockez les données n'importe où (session, mémoire partagée, ...), soit vous les reconstruisez de la même manière que dans la première requête ou vous ne lancez pas une seconde requête mais redirigez vers une autre action/vue interne.

4

Vous pouvez utiliser la session comme mentionné ci-dessus, mais si vous Vous ne voulez pas enregistrer les données dans une session, vous pouvez utiliser l'objet Dispatcher, voici un exemple. Je trouve utile ..

$login['Login']['username'] = $username; 
    $login['Login']['password'] = $password; 

    $this->autoRender = false; 
    $d = new Dispatcher(); 
    $d->dispatch( 
     array("controller" => "users", "action" => "login"), 
     array("data" => $login) 
    );     
+0

+1 pour l'alternative unique. – RabidFire

1

Je sais qu'il a été très longue temps, mais je ce problème et c'est aussi eu la façon dont je l'ai résolu. En ce qui concerne CakePHP 2.3.5 la solution fournie par Introgy ne fonctionnera pas depuis la définition de controller-> expédition est

public function dispatch(CakeRequest $request, 
         CakeResponse $response, $additionalParams = array()) 

au lieu vous pouvez utiliser

$this->requestAction 

Comme l'explication dans le code dit

/** 
* Calls a controller's method from any location. Can be used to connect 
*controllers together 
* or tie plugins into a main application. requestAction can be used to 
*return rendered views 
* or fetch the return value from controller actions. 
* 
* Under the hood this method uses Router::reverse() to convert the $url 
*parameter into a string 
* URL. You should use URL formats that are compatible with 
*Router::reverse() 
* 
* #### Passing POST and GET data 
* 
* POST and GET data can be simulated in requestAction. Use 
*`$extra['url']` for 
* GET data. The `$extra['data']` parameter allows POST data simulation. 
* 
* @param string|array $url String or array-based URL. Unlike other URL 
*arrays in CakePHP, this 
* URL will not automatically handle passed and named arguments in the 
*$url parameter. 
* @param array $extra if array includes the key "return" it sets 
*theAutoRender to true. Can 
* also be used to submit GET/POST data, and named/passed arguments. 
* @return mixed Boolean true or false on success/failure, or contents 
* of rendered action if 'return' is set in $extra. 
*/ 

Ainsi Introgy exemple serait modifié comme suit:

$login['Login']['username'] = $username; 
$login['Login']['password'] = $password; 
$url = array('plugin'  => 'plug_in_if_there_is', 
      'controller' =>'your_target_controllers', 
      'action'  =>'actionOnThatController'); 

$this->requestAction($url, array('data' => $login)); 

Vos données seront disponibles dans les données de la cible:

class YourTargetControllerController extends PlugInIfThereIsAppController 
{ 
    public function actionOnThatController() 
    { 
    $this->data; //will be having ['Login']['username'] = $username 
       //      ['password'] = $password 
    } 
} 

et la vue pour actionOnThatController sera rendu.

EDIT: J'ai oublié d'ajouter ceci, pour la vue cible à rendre, il est nécessaire d'ajouter la touche « retour » dans le tableau passé comme $ supplémentaire, alors vous devez rendre le point de vue de l'action ciblée, par conséquent, la modification correcte complète serait

$login['Login']['username'] = $username; 
$login['Login']['password'] = $password; 
$url = array('plugin'  => 'plug_in_if_there_is', 
      'controller' =>'your_target_controllers', 
      'action'  =>'actionOnThatController'); 

$this->requestAction($url, array('return', 'data' => $login)); 
$this->render('PlugInIfThereIs.YourTargetControllers/action_on_that_controller'); 
Questions connexes