2010-12-13 6 views
1

Можно ли отображать данные, которые я передаю с $this->set(), когда есть перенаправление на другую страницу после настройки данных?cakephp передача данных для просмотра после перенаправления

Спасибо, EL

+0

Что вы пытаетесь выполнить? Каким-то образом не имеет смысла отображать данные, которые пользователь никогда не увидит из-за перенаправления ... – dhofstet

+0

Я хочу отобразить данные на странице, на которые пользователь перенаправляется на – Elwhis

ответ

5

Вероятно, самый простой способ для хранения данных в сессии с:

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

и читать его позже:

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

Вы перенаправлять с header('Location: ...')? Это заставляет браузер запускать новый запрос. Сценарий, вызвавший перенаправление, может быть таким же, как тот, который обрабатывает новый запрос, но теперь есть два экземпляра (или первый может даже выйти), и каждый из них не имеет доступа к переменным другого. Либо вы храните данные в любом месте (сеанс, разделяемая память, ...) или перестраиваете его так же, как и в первом запросе, или просто не выдаете второй запрос, а перенаправляете на другое действие/просмотр внутри.

4

Вы можете использовать сеанс, как указано выше, но если вы не хотите сохранять данные в сеансе, который может использовать объект диспетчера, вот пример. Я считаю, это полезно ..

$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 для уникальной альтернативы. – RabidFire

1

Я знаю, что это было looong время, но я также имел эту проблему и это, как я решить. Что касается CakePHP 2.3.5 решения предоставленного Introgy не будет работать, так как определение для контроллер-> отправка

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

вместо этого вы можете использовать

$this->requestAction 

Как объяснение в коде сказала

/** 
* 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. 
*/ 

так Introgy примером может быть изменен:

$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)); 

Ваши данные будут доступны в данных цели:

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

и вид на actionOnThatController будет оказана.

EDIT: Я забыл добавить это для целевого вида, оказываемых необходимо добавить ключ «возвращение» в массиве передается как $ дополнительные, то вы должны вынести мнение Целенаправленных действий, в поэтому полная правильная модификация будет

$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'); 
Смежные вопросы