CakePHP передает данные для просмотра после перенаправления - PullRequest
1 голос
/ 13 декабря 2010

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

Спасибо, EL

Ответы [ 4 ]

5 голосов
/ 13 декабря 2010

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

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

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

$this->Session->read('key');
4 голосов
/ 13 декабря 2010

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

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

    $this->autoRender = false; 
    $d = new Dispatcher(); 
    $d->dispatch( 
        array("controller" => "users", "action" => "login"), 
        array("data" => $login) 
    );                  
1 голос
/ 19 мая 2015

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

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: Я забыл добавить это, для отображения целевого представления необходимо добавить ключ 'return' в массиве, передаваемом как $ extra , затем необходимо отобразить представление целевого действия, поэтому правильная модификация будет

$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');
0 голосов
/ 13 декабря 2010

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

...